Урок 20: Получение данных из БД
Теперь настало время запросить данные из нашей БД для наших PHP-страниц.
Это один из наиболее важных уроков данного учебника. Когда вы прочтёте и разберёте этот урок, вы поймёте, почему вэб-решения на основе БД настолько мощны, и ваше представление о вэб-разработке значительно расширится.
SQL-запросы
Для получения данных из БД вы используете запросы. Примером запроса может быть: "получить данные из таблицы 'people', отсортированные по алфавиту" или "получить имена из таблицы 'people'".
Напоминаем, что язык Structured Query Language (SQL) используется для общения с БД. Посмотрим на простой пример:
Получить все данные из таблицы 'people'
В SQL мы запишем:
SELECT * FROM people
Синтаксис говорит сам за себя. Просто читайте и смотрите, как используются SQL-операторы в следующих примерах.
Пример 1: Запрос данных из БД
Этот пример использует БД и таблицу из Урока 19 и Урока 18. Следовательно, прочтите сначала эти уроки.
Данный пример показывает, как данные из таблицы "people" запрашиваются с помощью SQL-запроса.
Этот SQL-запрос возвращает результат в виде серии записей/records. Эти записи хранятся в так называемом наборе Записей/recordset. Набор записей можно охарактеризовать как род таблицы в памяти сервера, содержащей данные (записи), и каждая запись подразделяется на отдельные поля (или столбцы).
Набор данных можно сравнить с таблицей, где каждая запись аналогична ряду таблицы. В PHP мы может пройти по набору записей с помощью циклов и функции mysql_fetch_array, которая возвратит каждый ряд в виде массива.
Следующий код показывает, как использовать mysql_fetch_array для прохода по набору записей:
<html> <head> <title>Запрос данных из таблицы</title> </head> <body> <?php // Соединиться с сервером БД mysql_connect("mysql.myhost.com", "user", "sesame") or die (mysql_error ()); // Выбрать БД mysql_select_db("mydatabase") or die(mysql_error()); // SQL-запрос $strSQL = "SELECT * FROM people"; // Выполнить запрос (набор данных $rs содержит результат) $rs = mysql_query($strSQL); // Цикл по recordset $rs // Каждый ряд становится массивом ($row) с помощью функции mysql_fetch_array while($row = mysql_fetch_array($rs)) { // Записать значение столбца FirstName (который является теперь массивом $row) echo $row['FirstName'] . "<br />"; } // Закрыть соединение с БД mysql_close(); ?> </body> </html>
Обратите внимание, как для каждой записи мы получаем содержимое столбца "FirstName", печатая $row['FirstName']. Аналогично мы можем получить содержимое столбца "Phone", печатая $row['Phone'], к примеру.
Порядок набора записей точно такой же, как в таблице в БД. Но в следующем уроке мы посмотрим, как сортировать набор записей.
Пример 2: Сортировка данных по алфавиту, хронологически или численно
Часто бывает удобно, когда список или таблица представлены в алфавитном порядке, хронологически или численно. Такая сортировка легко выполняется в SQL, и синтаксис Order By ColumnName используется для сортировки содержимого столбцов.
Возьмём SQL-оператор из предыдущего примера:
strSQL = "SELECT * FROM people"
Запись может, например, быть отсортирована в алфавитном порядке по первому имени людей:
strSQL = "SELECT * FROM people ORDER BY FirstName"
Либо хронологически по дате рождения:
strSQL = "SELECT * FROM people ORDER BY BirthDate"
Сортировка может выполняться по восходящей/ascending или по нисходящей/descending, добавлением DESC:
strSQL = "SELECT * FROM people ORDER BY BirthDate DESC"
В следующем примере люди сортируются по возрасту:
<html> <head> <title>Запросить данные из БД</title> </head> <body> <?php // Соединиться с сервером БД mysql_connect("mysql.myhost.com", "user", "sesame") or die (mysql_error ()); // Выбрать БД mysql_select_db("mydatabase") or die(mysql_error()); // SQL-запрос $strSQL = "SELECT * FROM people ORDER BY BirthDate DESC"; // Выполнить запрос (набор записей $rs содержит результат) $rs = mysql_query($strSQL); // Цикл по набору записей $rs while($row = mysql_fetch_array($rs)) { // Записать значение столбцов FirstName и BirthDate echo $row['FirstName'] . " " . $row['BirthDate'] . "<br />"; } // Закрыть соединение с БД mysql_close(); ?> </body> </html>
Попробуйте самостоятельно изменить этот SQL-оператор и отсортировать записи по имени, фамилии или номеру телефона.
Получение выбранных данных
До сих пор наш SQL-оператор запрашивал все ряды таблицы. Но часто бывает необходимо установить критерии SQL-запроса для выборки данных, например, если нам нужны только те ряды, в которых есть телефонный номер или конкретная фамилия.
Скажем, мы хотим запросить из БД людей, имеющих номер телефона "66554433". Это можно сделать так:
strSQL = "SELECT * FROM people WHERE Phone = '66554433 '"
В SQL имеется шесть операций сравнения:
= равно
< меньше
> больше
<= меньше или равно
> = больше или равно
!= не равно
Кроме того, имеются логические операции:
AND
OR
NOT
См. в Уроке 6 о настройке условий.
В следующем примере мы используем условия для настройки адресной книги.
Пример 3: Адресная книга
В этом примере мы попытаемся скомбинировать многое из уже изученного. Создадим список имён из БД, где каждое имя будет ссылкой на последующую детальную информацию о человеке.
Для этого понадобятся два файла - list.php и person.php - с таким кодом:
Код файла list.php
<html> <head> <title>Запросить данные из БД</title> </head> <body> <ul> <?php // Соединиться с сервером БД mysql_connect("mysql.myhost.com", "user", "sesame") or die (mysql_error ()); // Выбрать БД mysql_select_db("mydatabase") or die(mysql_error()); // SQL-запрос $strSQL = "SELECT * FROM people ORDER BY FirstName DESC"; // Выполнить запрос (набор данных $rs содержит результат) $rs = mysql_query($strSQL); // Цикл по $rs while($row = mysql_fetch_array($rs)) { // Иям человека $strName = $row['FirstName'] . " " . $row['LastName']; // Создать ссылку на person.php с id-value в URL $strLink = "<a href = 'person.php?id = " . $row['id'] . "'>" . $strNavn . "</a>"; // Листинг ссылок echo "<li>" . $strLink . "</li>"; } // Закрыть соединение с БД mysql_close(); ?> </ul> </body> </html>
Код файла person.php
<html> <head> <title>Запросить данные из БД</title> </head> <body> <dl> <?php // Соединиться с сервером БД mysql_connect("mysql.myhost.com", "user", "sesame") or die (mysql_error ()); // Выбрать БД mysql_select_db("mydatabase") or die(mysql_error()); // Получить данные из БД, в зависимости от значения id в URL $strSQL = "SELECT * FROM people WHERE id=" . $_GET["id"]; $rs = mysql_query($strSQL); // Цикл по $rs while($row = mysql_fetch_array($rs)) { // Записать данные человека echo "<dt>Name:</dt><dd>" . $row["FirstName"] . " " . $row["LastName"] . "</dd>"; echo "<dt>Phone:</dt><dd>" . $row["Phone"] . "</dd>"; echo "<dt>Birthdate:</dt><dd>" . $row["BirthDate"] . "</dd>"; } // Закрыть соединение с БД mysql_close(); ?> </dl> <p><a href="list.php">Return to the list</a></p> </body> </html>
Пример с адресной книгой достаточно прост, но показывает потенциал возможностей при работе с РНР и базами данных.
Представьте, что БД содержит 10,000 продуктов с детальным описанием. Сделав небольшие изменения в предыдущие файлы, вы легко создадите каталог продукции с более чем 10,000 страниц при помощи лишь одной базы данных и двух РНР-файлов.
Добро пожаловать в мир огромных вэб-сайтов, которые легко разрабатывать и обслуживать! Если вы освоили работу с БД, ваши вэб-решения уже никогда не будут прежними.