|
PHP i MySQL
Interfej serwera MySQL w PHP PHP zawiera dwa moduły do współpracy z MySQL:
Mysqli Poniżej znajdziesz kilka przykładowych skryptów pokazujących typowe metody odczytywania i przetwarzania danych. Dokładny opis modułu mysqli wraz z przykładami znajdziesz tutaj. Praca z bazą danych - metoda proceduralna
<?php
/* Nawiązanie połączenia z serwerem */
$link = mysqli_connect(
'localhost', /* serwer, na którym działa MySQL */
'user', /* nazwa użytkownika */
'password', /* hasło użytkownika */
'baza'); /* wybrana baza danych */
if (!$link)
{ echo "Nie mogę połączyć się z serwerem MySQL. Kod błędu: " . mysqli_connect_error();
exit;
}
?>
Zmienna $link jest zasobem nawiązanego połączenia. Jeżeli jednak połączenia nie uda się ustanowić, to jej wartością będzie fałsz. Za pomocą warunku if sprawdzamy, czy udało się połączyć z serwerem, a jeżeli nie, to zwracamy kod błędu i przerywamy działanie skryptu. Po nawiązaniu połączenia możemy wykonywać dowolne instrukcje SQL, a ich wynik wykorzystać w skrypcie, np.:
<?php
/* Wykonujemy zapytanie */
if ($result = mysqli_query($link, 'SELECT nazwisko,imie FROM tabela ORDER BY nazwisko,imie'))
{ echo "Lista osób:<br />\n";
/* Przetwarzamy wiersze wyniku zapytania */
while( $row = mysqli_fetch_assoc($result) )
{ echo $row['nazwisko'] . ' ' . $row['imie'] . '<br />';
}
/* Usuwamy z pamięci wynik zapytania */
mysqli_free_result($result);
}
/* Zamykamy połączenie z bazą */
mysqli_close($link);
?>
Kilka uwag do powyższego przykładu:
Ponieważ otwieranie połączeń z bazą wymaga sporo czasu, to warto raz nawiązać je na początku skryptu i zamknąć dopiero na jego końcu. Praca z bazą danych - metoda obiektowa Poniższy przykład jest odpowiednikiem poprzedniego, ale tym razem nawiązanie połączenia, wykonanie zapytania, przetworzenie wyników i zamknięcie połączenia realizowane jest obiektowo.
<?php
/* Łączymy się z serwerem */
$mysqli = new mysqli('localhost', 'user', 'password', 'baza');
if (mysqli_connect_errno())
{ echo ""Nie mogę połączyć się z serwerem MySQL. Kod błędu: " . mysqli_connect_error();
exit;
}
/* Wykonujemy zapytanie */
if ($result = $mysqli->query(SELECT nazwisko,imie FROM tabela ORDER BY nazwisko,imie'))
{ echo "Lista osób:<br />\n";
/* Przetwarzamy wiersze wyniku zapytania */
while( $row = $result->fetch_assoc())
{ echo $row['nazwisko'] . ' ' . $row['imie'] . '<br />';
}
/* Usuwamy wynik zapytania z pamięci */
$result->close();
}
/* Zamykamy połączenie z bazą */
$mysqli->close();
?>
Parameryzowanie instrukcji SQL Często wygodnie jest użyć w instrukcji SQL zmiennych, których wartości można dynamicznie ustawiać z poziomu PHP. Problem polega na tym, żeby instrukcje typu: SELECT nazwisko, imie FROM tabela WHERE nazwisko LIKE 'K%' zastąpić instrukcjami typu: SELECT nazwisko, imie FROM tabela WHERE nazwisko = ? a w miejsce znaku ? dynamicznie wstawiać odpowiednią wartość przed wykonaniem instrukcji, np:
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'baza');
/* Test połączenia */
if (mysqli_connect_errno())
{ echo ""Nie mogę połączyć się z serwerem MySQL. Kod błędu: " . mysqli_connect_error();
exit;
}
/* Przygotowanie instrukcji SQL */
$stmt = $mysqli->prepare("INSERT INTO tabela
(nazwisko, imie, wiek) VALUES ( ?, ?, ?)");
$stmt->bind_param('ssi', $nazwisko, $imie, $wiek);
$nazwisko = 'Kowalski';
$imie = 'Jan';
$wiek = 18;
/* Wykonujemy przygotowaną instrukcję */
$stmt->execute();
echo "Wstawiono wierszy: " . $stmt->affected_rows);
/* Usuwamy wynik zapytania z pamięci */
$stmt->close();
/* Zamykamy połączenie z bazą */
$mysqli->close();
?>
Uwagi:
Parameryzowanie wyników instrukcji SQL Zwracane przez zapytania wyniki mogą być także wiązane poprzez zmienne PHP z polami tekstowymi, polami wyboru czy polami w tabelach, np.:
<?php
$mysqli = new mysqli("localhost", "user", "password", "baza");
/* Test połączenia */
if (mysqli_connect_errno())
{ echo ""Nie mogę połączyć się z serwerem MySQL. Kod błędu: " . mysqli_connect_error();
exit;
}
/* Przygotowanie i wykonanie instrukcji SQL */
if ($stmt = $mysqli->prepare("SELECT nazwisko,imie,wiek FROM tabela ORDER BY wiek DESC LIMIT 5"))
{ $stmt->execute();
/* Powiązanie zmiennych z wynikiem zapytania */
$stmt->bind_result($col1, $col2, $col3);
/* Przetwarzanie wyniku */
while ($stmt->fetch())
{ echo $col1 .' ' . $col2 . ' ma ' . $col3 . ' lat<br />';
}
/* Usuwamy wynik zapytania z pamięci */
$stmt->close();
}
/* Zamykamy połączenie z bazą */
$mysqli->close();
?>
Uwagi na temat bezpieczeństwa Ponieważ SQL jest językiem interpretowanym, to dowolny ciąg znaków będzie zinterpretowany przez serwer MySQL. Jeżeli ten ciąg będzie poprawną instrukcją języka SQL, to zostanie wykonany. W przeciwnym razie serwer zgłosi błąd. Problem dotyczy przede wszystkim zapisu do bazy danych pobranych z formularzy wypełnianych przez użytkowników. Podstawowe reguły bezpieczeństwa baz danych:
|