PHP oferuje kilka możliwości połączenia z bazą danych:
Podejście proceduralne MySQLi
$db = mysqli_connect($serwer, $user, $pass, $baza);
czyli przy domyślnych ustawieniach serwera:
$db = mysqli_connect('localhost', 'root', '', 'twoja_baza_danych');
sprawdzamy, czy połączenie zostało nawiązane:
if(!$db) error_log('Błąd połączenia: '. mysqli_connect_error());
Możemy wykorzystać jeden z dostępnych komunikatów błędów:
mysqli_connect_errno() – Returns the error code from last connect call
mysqli_connect_error() – Returns a description of the last connection error
mysqli_errno() – Returns the error code for the most recent function call
mysqli_error() – Returns a string description of the last error
mysqli_sqlstate() – Returns the SQLSTATE error from previous MySQL operation
Podejście obiektowe MySQLi
$db = new mysqli($serwer, $user, $pass, $baza);
czyli przy domyślnych ustawieniach serwera:
$db = new mysqli('localhost', 'root', '', 'twoja_baza_danych');
sprawdzamy, czy połączenie zostało nawiązane:
if($db->connect_error) error_log('Błąd połączenia: '. $mysqli->connect_error);
Możemy wykorzystać jeden z dostępnych komunikatów błędów:
mysqli_connect_errno() – Returns the error code from last connect call
mysqli_connect_error() – Returns a description of the last connection error
mysqli_errno() – Returns the error code for the most recent function call
mysqli_error() – Returns a string description of the last error
mysqli_sqlstate() – Returns the SQLSTATE error from previous MySQL operation
Łączenie z PDO – PHP Data Object
$pdo = new PDO("mysql:host=$serwer;dbname=$baza", "$user", "$pass");
czyli przy domyślnych ustawieniach serwera:
$pdo = new PDO("mysql:host=localhost;dbname=twoja_baza_danych", "root", "");
sprawdzamy, czy połączenie zostało nawiązane – wykorzystamy do tego celu wyjątki:
try{ $pdo= new PDO("mysql:host=localhost;dbname=twoja_baza_danych", "root", ""); } catch (PDOException $e){ echo "Błąd połączenia z bazą danych"; }
Możemy wykorzystać jeden z dostępnych komunikatów błędów dostępny w manualu.
W pierwszej kolejności należy utworzyć bazę danych i wypełnić ją przykładowymi danymi.
Na potrzeby przykładu utworzyłam bazę o nazwie operacje_db, o strukturze:
W następnym kroku połączymy się z bazą i wyciągniemy dane z utworzonej tabeli.
<?php //ustawiamy dane do bazy $serwer='localhost'; //lub 127.0.0.1 - to jest nazwa serwera $user='root'; //użytkownik bazy danych $pass=''; //hasło do bazy $baza='operacje_db'; //nazwa bazy //łączenie z bazą
mysqli_report(MYSQLI_REPORT_OFF); // dodajemy tą linijkę, aby móc sprawdzić poprawność połączenia
/* @ is used to suppress warnings * $db = @new mysqli($serwer, $user, $pass, $baza); //podejście obiektowe - korzystamy z klasy PHP o nazwie mysqli //$db = mysqli_connect($serwer, $user, $pass, $baza); //tak jest w podejściu strukturalnym //sprawdzamy czy się łączy w podejściu obiektowymif($db->connect_error)
{
die('Błąd połączenia: '. $db->connect_error);
}
//sprawdzamy czy się łączy w podejściu proceduralnym /*if(!$db) { error_log('Błąd połączenia: '. mysqli_connect_error()); }*/ else { echo 'Połączenie nawiązano<br />'; // wyciągamy wszystko z tabeli "test" $sql="SELECT * FROM `test` "; $wynik=$db->query($sql); /* możemy podejrzeć co otrzymaliśmy echo '<pre>'; print_r($db); echo '</pre>'; echo '<pre>'; print_r($wynik); echo '</pre>'; */ $ile_wierszy=$wynik->num_rows; echo 'ilość wierszy '.$ile_wierszy.'<br />'; //wyciągamy dane z zapytania echo '<table>'; echo '<tr><td>Imie</td><td>Nazwisko</td></tr>'; //pętla po rekordach z bazy for ($i=0; $i <$ile_wierszy; $i++) { $wiersz = $wynik->fetch_assoc(); echo '<tr>'; echo '<td>'.$wiersz['imie'].'</td>'; echo '<td>'.$wiersz['nazwisko'].'</td>'; echo '</tr>'; } echo '</table>'; //można to też zrobić za pomocą foreach foreach($wynik as $row) { echo $row["id"].'-'.$row['imie'].'<br/>'; } } $db->close(); //zamykamy połączenie ?>
UWAGA: stosowanie query() nie zapewnia bezpieczeństwa w przypadku ataków SQJ Injection. Zamiast query należy używać parameterized prepared statements (opracowanie w następnym temacie). Aby query() było bezpieczne nalezy stosować mysqli_real_escape_string() .
Zamykanie połączenia z bazą
Operacja zamknięcia połączenia jest automatycznie wykonywana po zakończeniu skryptu, jeżeli potrzebujemy zakończyć takie połączenie wcześniej robimy to za pomocą poleceń:
//strukturalnie
mysqli_close($polaczenie);
//obiektowo
$mysqli->close();
//PHP Data Object - PDO
unset($pdo);
Wyświetlanie informacji z bazy na podstawie danych z formularza
Najczęściej dane z bazy wybieramy na podstawie pewnych warunków, jakie określi użytkownik.
Poniższy kod jest najprostszym przykładem, który należy jeszcze dopracować (dokonać walidacji).
<?php //ustawiamy dane do bazy $serwer='localhost'; //lub 127.0.0.1 - to jest nazwa serwera $user='root'; //użytkownik bazy danych $pass=''; //hasło do bazy $baza='operacje_db'; //nazwa bazy //łączenie z bazą $db = @new mysqli($serwer, $user, $pass, $baza); //podejście obiektowe - korzystamy z klasy PHP o nazwie mysqli //sprawdzamy czy się łączy w podejściu obiektowym
if($db->connect_error) {
die('Błąd połączenia: '. $db->connect_error);
} else { echo 'Połączenie nawiązano<br />';
//sprawdzamy czy kliknięto wyszukaj if (!empty($_POST['przycisk'])) { //zaczynamy przygotowywać zapytanie $sql = "SELECT * FROM `test` WHERE 1 ";
if (!empty($_POST['imie'])) $sql .= "&& imie LIKE '" . $_POST['imie'] . "'"; //do już istniejącego zapytania doklejamy warunki
if (!empty($_POST['nazwisko'])) $sql .= " && nazwisko LIKE '" . $_POST['nazwisko'] . "'";
echo $sql;
$wynik = $db->query($sql);
foreach ($wynik as $row) {
echo "<br/>Witaj {$row['imie']} <br/>";
}
}else{
echo "Prześlij formularz";
} } $db->close(); //zamykamy połączenie ?>
<form action="" method="POST">
Imię: <input type="text" name="imie">
Nazwisko: <input type="text" name="nazwisko">
<input type="submit" name="przycisk" value="Wyszukaj">
</form>