Назад | Начало урока | Вперед
Содержание

Глава 19

Запросы к базам данных

Теперь можно отправлять SQL-запросы к БД.
Общий вид запросов такой:

$result=mysqli_query($link,'SQL-запрос');

Запросим список моделей любого года выпуска и рег номеров автомобилей из БД taxi:

$result=mysqli_query($link,'SELECT model, madein reg_number FROM cars');

Функция возвращает true в случае успешного завершения или false в случае возникновения
ошибок. Кроме того, в результате запроса из базы могут быть получены данные, которые
помещаются во временную таблицу в памяти сервера. Тогда функция вернет идентификатор
этой таблицы. Переменная $result получит этот идентификатор в качестве значения.

Подсчитать количество строк в таб, содержащей результаты запроса, можно с помощью
функции mysqli_num_rows(), в которой в качестве аргумента нужен только идентификатор
результата выборки:

$rows = mysqli_num_rows($result);

Запрос к БД вернул временную результирующую таблицу из трех столбцов model, madein и
reg_number. В таб может быть несколько записей. Можно считывать одну запись за другой
из этой выборки и из каждой записи создавать массив с ключами от нуля до двух. Для
этого предусмотрена функция mysqli_fetchm_rows($result), которая принимает в качестве
аргумента идентификатор результата выборки.

Функция выбирает одну строку из временной результирующей таб и возвращает
численно-индексированный массив, каждый элемент которого содержит значение одного из
столбцов. При этом указатель сдвигается на следующую запись в результирующей таб.

while($row = mysqli_fetch_rows($result)) {

printf(%s, %s, %s\n", $row[0], $row[1], $row[2]);
}

В случае численно-индексированного массива программисту придется самостоятельно
запоминать, какой элемент массива содержит значение того или иного поля.

Удобнее создать ассоциативный массив, ключи которого - имена столбцов в результирующей
таб. Придется создавать такой массив несколько раз - по одному для каждой строки
результирующей выборки.

Функция 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++) {

$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_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-кода в нем нет! Браузер вывел только результат работы скрипта!



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0025)http://localhost/19-1.php -->
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<META content="MSHTML 6.00.2900.2523" name=GENERATOR></HEAD>
<BODY>
<TABLE>
<TBODY>
<TR>
<TH>Модель</TH>
<TH>Год выпуска</TH>
<TH>Рег. номер</TH></TR>
<TR>
<TD>Volga</TD>
<TD>2002</TD>
<TD>A788YC78</TD></TR>
<TR>
<TD>VlksWagen</TD>
<TD>2003</TD>
<TD>A789YC78</TD></TR>
<TR>
<TD>Renault</TD>
<TD>2004</TD>
<TD>A790YC78</TD></TR></TBODY></TABLE></BODY></HTML>


В рассмотренном выше скрипте надо очень внимательно передавать параметры в функцию
mysqli_connect(), для того, чтобы не было ошибок. У меня скрипт правильно запустился
с такими параметрами:

define('USERNAME', "root");
define('PASSWORD', "");
define('DBNAME', "taxi");
define('SERVER', "localhost");

Это параметры администратора, который обладает всеми правами. Надо добиться, чтобы скрипт
запускался и пользователем с неполными правами. В любом случае - результат налицо:
PHP, Apach и MySQL работают как единый организм в этом скрипте!

Если надо записать новые данные в таб, или внести иные изменения, может оказаться
полезной функция mysqli_affected_rows(), возвращающая количество записей, из которых
выбирались данные в последнем запросе. Эта функция будет считать строки таб, из которых
происходила выборка данных при запросах SELECT, INSERT, UPDATE, ALTER TABLE, причем
параметром ей служит идентификатор соединения, а вовсе не идентификатор результата запроса.

$result = mysqli_query($db,'SELECT * FROM cities');
printf("Affected rows (SELECT) : %d\n", mysqli_affected_rows($db));

Внимание! В версии 5.2.4 появилось важное изменения, касающееся запросов, содержащих
функции агрегирования (count(), sum() и тд) В запросах к БД эти функции необходимо
заключать в кавычки:

$query = "select 'count(*)' from cars where city = 3";


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz