PHP i połączenie z bazą danych
PHP i połączenie z bazą danych
Integracja PHP z PgSQL
W poniższych ćwiczeniach będą wykorzystywane tabele z bazy Kwiaciarnia,
które powinny być wcześniej utworzone w indywidualnej bazie użytkownika, przy pomocy podanego skryptu SQL
.
Wykorzystywana baza danych to kwiaciarnia:
Uwaga, pobrane pliki można zdekompresować przez: gzip -d plik.gz
lub aplikację okienkową.
Gdyby była potrzeba przekonwertowania kodowania znaków:
iconv -f ISO-8859-2 -t UTF-8 kwiaciarnia2dane.sql > kwiaciarnia2dane-utf.sql
Komunikacja z PgSQL
Wczytać dane do bazy:
- Połączenie z PostgreSQL z linii poleceń:
psql -d baza -U student
- Następnie:
- lista baz:
\l
- lista tabel:
\dt
- wczytanie plików:
\i
\i kwiaciarnia2.sql
\i kwiaciarnia2dane.sql
- wyjście:
\q
Uwaga odnośnie hasła:
- Upewnij się, że pamiętasz hasło do swojej bazy danych → być może jest ono takie samo jak do konta na serwerze.
- Jeżeli zmieniałeś hasło do konta na serwerze i nie pamiętasz hasła do bazy danych to spróbuj wykonać następujące kroki:
- Uruchom program
psql
wpisując jego nazwę w terminalu i podając nazwę bazy danych i nazwę użytkownika:psql dbname username
- Najczęściej
dbname
iusername
są takie same jak login na serwerze.
- Jeżeli program nie poprosił o hasło, spróbuj wykonać następujące czynności, wpisując je jako polecenia programu:
\conninfo
- Jeżeli program zwróci coś w stylu
You are connected to database "kk" as user "kk" via socket in "/var/run/postgresql" at port "5432".
to możesz zmienić swoje hasło wpisując
\password
i podając nowe.
Ćwiczenie
- Przy pomocy poniższego programu proszę sprawdzić czy jest połączenie z bazą.
- Proszę przy pomocy tego uniwersalnego formularza zadać jakieś zapytanie o dane w bazie danych.
- uniwersalny.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head> <title>To jest formularz w PHP do czytania z PqSQL</title> </head><body> <h1>Prosze wprowadzic parametry bazy i zapytania</h1> <p><center> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>"> uzytkownik: <input type="text" name="suser" size="10" value="<?= $suser ?>"> serwer: <input type="text" name="sserver" size="15" value="localhost"><br> baza: <input type="text" name="sdbase" size="10" value="<?= $sdbase ?>"> haslo: <input type="password" name="spass" size="10" value="<?= $spass ?>"> <br>zapytanie: <br><textarea name="squery" rows="1" cols="60" wrap="physical"> SELECT version();</textarea><br> <br><input type="submit" value="ZAPYTAJ"> </center></p> <?php if (isset($_POST['squery'])) { if (!isset($_POST['suser']) ) { echo "<hr><h1>Brak poprzedniego zapytania</h1>"; echo "<hr><a href=\"index.php\"> Powrot do strony glownej</a>"; exit; } $sserver = $_POST['sserver']; $suser = $_POST['suser']; $sdbase = $_POST['sdbase']; $spass = $_POST['spass']; if (!isset($_POST['sdbase']) ) { $db = "host=$sserver port=5432 user=$suser"; } else { $db = "host=$sserver port=5432 user=$suser dbname=$sdbase"; } $conn = pg_connect ("$db"." password=$spass"); if (!$conn) { echo "<hr>An error occured! <br/>\$db: ($db)\n"; echo pg_last_error($conn); exit; } $today = date ("G:i:s, j-n-Y"); echo "<hr><h1><b>Wynik zapytania z $today</h1>"; echo "<h2>Baza: \"<i>$db</i>\"</h2>"; $query = $_POST['squery']; $result = pg_query ($conn, "$query"); if (!$result) { echo "An error occured.\n"; echo pg_result_error($result); exit; } echo "<h2>Zapytanie: \"<i>$query</i>\"</h2>"; echo "<h3>Wynik zapytania w tabeli z nazwami i typami pol</h3>"; echo "<p><table><tbody>"; $fie = pg_num_fields($result); echo "<tr><td><b>Rekord</b>"; for ($i=0; $i < $fie; $i++) { $r = pg_field_name ($result,$i); $t = pg_field_type ($result,$i); echo "<td> <b>$r</b> (<i>$t</i>)"; } $num = pg_num_rows($result); for ($i=0; $i < $num; $i++) { echo "<tr><td>$i"; $r = pg_fetch_row($result, $i); for ($j=0; $j < count($r); $j++) { echo "<td> $r[$j]"; } echo "</tr>"; } echo "</tbody></table><hr>"; pg_free_result($result); pg_close($conn); echo "<hr><a href=\"index.php\"> Powrot do strony glownej</a>"; } ?> </body></html>
Czytanie danych z bazy
- Proszę uzupełnić poniższy program o dane do połączenia z bazą, po czym uruchomić, by wyświetlić zawartość tabeli Klienci.
- Proszę przeanalizować, ew. sprawdzić w manualu jakie są dostępne funkcje wspomagające przetwarzanie danych pobranych z bazy.
- spis_klientow.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head> <meta charset="UTF-8"> <title>To jestskrypt w PHP do czytania z PqSQL</title> </head><body> <?php $pass=''; # tu wstawic haslo $uname=''; # tu wstawic nazwe uzytkownika $dbname=''; # tu wstawic nazwe bazy if (!isset($pass)) { echo "<br><b>Ustaw lokalnie haslo w pliku PHP!</b>"; exit; } $db = "host=127.0.0.1 user=$uname dbname=$dbname"; $conn = pg_connect ("$db"." password=$pass"); if (!$conn) { echo "<hr>An error occured!, (\$db=$db)\n"; echo pg_result_error($conn); exit; } $today = date ("G:i:s, j-n-Y"); echo "<hr><h1><b>Wynik zapytania z $today</h1>\n"; echo "<h2>Baza: \"<i>$db</i>\"</h2>\n"; $query = "select * from klienci;"; $result = pg_query ($conn, "$query"); if (!$result) { echo "An error occured.\n"; echo pg_result_error($result); exit; } echo "<h2>Zapytanie: \"<i>$query</i>\"</h2>\n"; echo "<h3>Lista klientów</h3>\n\n"; echo "<table><tbody>\n"; $fie = pg_num_fields($result); echo "<tr><td><b>Rekord</b>\n"; for ($i=0; $i < $fie; $i++) { $r = pg_field_name ($result,$i); $t = pg_field_type ($result,$i); echo "<td> <b>$r</b> (<i>$t</i>)</b>"; } $num = pg_num_rows($result); for ($i=0; $i < $num; $i++) { echo "<tr><td>$i"; $r = pg_fetch_row($result, $i); for ($j=0; $j < count($r); $j++) { echo "<td> $r[$j]"; } echo "</tr>\n"; } echo "</tbody></table>\n"; pg_free_result($result); pg_close($conn); ?>
Modyfikacja danych
- W programie wyświetlającym dane klientów, proszę zmienić zapytanie tak by wyświetlać jedynie id klienta, imię i nazwisko oraz adres e-mail.
- W tabeli proszę dodać kolumnę, w której będzie link do strony:
zamowienia.php?idklienta=$idklienta
gdzie$idklienta
zostanie zastąpione odpowiednim id klienta w każdym wierszu. - Proszę skopiować stronę
spis_klientow.php
i nazwać jązamowienia.php
, a następnie tak ją zmodyfikować, aby dla odpowiedniego id klienta przesłanego metodą GET (po kliknięciu linka z parametrem) wyświetlane były szczegóły zamówień tylko tego klienta. - Następnie proszę dodać formularz z możliwością dodania nowego zamówienia dla tego klienta.