Глава 19
Теперь можно отправлять SQL-запросы к БД.
$result=mysqli_query($link,'SQL-запрос');
Общий вид запросов такой:
Запросим список моделей любого года выпуска и рег номеров автомобилей из БД taxi:
$result=mysqli_query($link,'SELECT model, madein reg_number FROM cars');
Функция возвращает true в случае успешного завершения или false в случае возникновения
ошибок. Кроме того, в результате запроса из базы могут быть получены данные, которые
помещаются во
временную таблицу в памяти сервера.
Тогда функция вернет идентификатор
этой таблицы.
Переменная $result получит этот идентификатор в качестве значения.
Подсчитать количество строк в таб, содержащей результаты запроса, можно с помощью
$rows = mysqli_num_rows($result);
функции mysqli_num_rows(), в которой в качестве аргумента нужен только идентификатор
результата выборки:
Запрос к БД вернул временную результирующую таблицу из трех столбцов model, madein и
reg_number. В таб может быть несколько записей. Можно считывать одну запись за другой
из этой выборки и из каждой записи создавать массив с ключами от нуля до двух. Для
этого предусмотрена функция mysqli_fetchm_rows($result), которая принимает в качестве
аргумента идентификатор результата выборки.
Функция выбирает одну строку из временной результирующей таб и возвращает
while($row = mysqli_fetch_rows($result))
{
численно-индексированный массив, каждый элемент которого содержит значение одного из
столбцов. При этом указатель сдвигается на следующую запись в результирующей таб.
В случае численно-индексированного массива программисту придется самостоятельно
запоминать, какой элемент массива содержит значение того или иного поля.
Удобнее создать ассоциативный массив, ключи которого - имена столбцов в результирующей
таб. Придется создавать такой массив несколько раз - по одному для каждой строки
результирующей выборки.
Функция mysqli_fetch_assoc($result) возвращает ассоциативный массив, ключами которого
будут model, madein и reg_number.
Теперь нарисуем таб, в которую запишем данные из выборки:
echo "<table >\n<tr>\n";
echo "<th>Модель</th>
<th>Год выпуска</th>
<th>Рег.номер</th>
</tr>\n";
for ($i=0; $i<$rows; $i++)
{
echo "<tr><td>". $r["model"]."</td>";
echo "<td>". $r["madein"] ."</td>";
echo "<td>". $r["reg_number"] ."</td></tr>";
echo "</table>";
В этом примере в цикле, повторяющемся столько раз, сколько записей содержится в результ
таб, функция mysqli_fetch_assoc($result) считывает одну запись из таб и из полей
формирует ассоциативный массив. Функция mysqli_fetch_assoc() возвращает этот массив в
переменную $r, а потом мы распечатываем элементы массива $r.
Если результат опроса больше не потребуется, следует освободить память от выборки:
mysqli_free_result($result)
Для закрытия непостоянного соединения следует вызвать функцию mysqli_close($link),
в качестве параметра принимающую идентификатор соединения с сервером.
Соберем теперь все вместе.
<?php
define('USERNAME', "user45");
define('PASSWORD', "pass45");
define('DBNAME', "taxi");
define('SERVER', "localhost");
$link = mysqli_connect(SERVER, USERNAME, PASSWORD, DBNAME);
if (!$link) {
printf("Соединение установить не удалось : %s\n",
mysqli_connect_error());
exit;
}
$query = "SELECT model, madein, reg_number FROM cars";
$result=mysqli_query($link,$query);
if ($result)
{
$rows = mysqli_num_rows($result);
echo "<table >\n<tr>\n";
echo "<th>Модель</th><th>Год выпуска</th><th>Рег. номер</th></tr>\n";
for ($i=0; $i<$rows; $i++)
{
$r=mysqli_fetch_assoc($result);
echo "<tr><td>". $r["model"]."</td>";
echo "<td>". $r["madein"] ."</td>";
echo "<td>". $r["reg_number"] ."</td></tr>";
}
echo "</table>";
mysqli_free_result($result);
}
mysqli_close($link);
?>
Теперь запускаем этот скрипт на выполнение.
Результат:
Запрос mysqli_connect() с параметрами был послан на сервер, сервер обработал этот
запрос, связался с БД taxi, выполнил запрос: "SELECT model, madein, reg_number FROM
cars", и вывел результат в браузере в формате html!
Интересно, что если мы посмотрим html-код страницы, которая только-что была выведена
в браузер, то ни какого php-кода в нем нет! Браузер вывел только результат работы скрипта!
В рассмотренном выше скрипте надо очень внимательно передавать параметры в функцию
mysqli_connect(), для того, чтобы не было ошибок. У меня скрипт правильно запустился
с такими параметрами:
define('USERNAME', "root");
define('PASSWORD', "");
define('DBNAME', "taxi");
define('SERVER', "localhost");
Это параметры администратора, который обладает всеми правами. Надо добиться, чтобы скрипт
запускался и пользователем с неполными правами. В любом случае - результат налицо:
PHP, Apach и MySQL работают как единый организм в этом скрипте!
Если надо записать новые данные в таб, или внести иные изменения, может оказаться
$result = mysqli_query($db,'SELECT * FROM cities');
полезной функция mysqli_affected_rows(), возвращающая количество записей, из которых
выбирались данные в последнем запросе. Эта функция будет считать строки таб, из которых
происходила выборка данных при запросах SELECT, INSERT, UPDATE, ALTER TABLE, причем
параметром ей служит идентификатор соединения, а вовсе не идентификатор результата запроса.
printf("Affected rows (SELECT) : %d\n", mysqli_affected_rows($db));
Внимание! В версии 5.2.4 появилось важное изменения, касающееся запросов, содержащих $query = "select 'count(*)' from cars where city = 3";
функции агрегирования (count(), sum() и тд) В запросах к БД эти функции необходимо
заключать в кавычки:
Назад |
Начало урока |
Вверх |
Вперед
Содержание