18. PHP – łączenie z bazą i operacje na bazie danych


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 obiektowym

if($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>