Избежание повторных запросов
Предположим, имеется таблица members членов виртуального клуба, которая состоит из следующих полей:
- имена (name),
- электронные адреса (email)
- домашние странички (url)
При этом поле name является обязательным, а поля email и url —
опциональными и, в случае отсутствия у посетителя email или url,
принимающими значения NULL.
CREATE TABLE members (
name VARCHAR(20) NOT NULL DEFAULT ",
email TINYTEXT,
url TINYTEXT
) TYPE=MyISAM;
Одна из задач, стоящая перед администратором клуба, состоит в выводе
двух списков: членов клуба, имеющих e-mail, и членов клуба, имеющих свои виртуальные странички.
Для выполнения этой задачи можно написать скрипт, в котором два раза подряд выполняется практически одинаковый код.
Но можно избежать этого и решить проблему может функция mysql_data_seek (), способная перемещать внутренний указатель и имеющая следующий синтаксис:
bool mysql_data_seek(resource result_identifier, int row_number)
Функция принимает два параметра, первый из которых result_identifier — дескриптор запроса, возвращаемый функцией mysql_query(), второй —
смещение внутреннего указателя относительно первой позиции.
Функция возвращает true в случае успеха и false в случае неудачи.
Вывод списков разных членов клуба
<?php
// Формируем и выполняем SQL-запрос
$query = "SELECT name, email, url FROM members";
$mem = mysql_query($query);
// Проверяем успешность выполнения запроса
if(!$mem)
{
echo "<p><b>Error: ".mysql_error () ."</b></p>";
exit();
}
// Проверяем, содержит ли результат хоть одну строку
If(mysql_num_rows($mem)>0)
{
//I таблица
// Выводим заголовок таблицы
echo "<table>";
while(list($name, $email, $url) = mysql_fetch_row($mem))
if($email !== NULL) echo "<tr><td>$name</td><td>$email</td></tr>";
// Выводим завершение таблицы
echo "</table>";
// Устанавливаем внутренний указатель в начало
mysql_data_seek($mem, 0);
// II таблица
// Выводим заголовок таблицы
echo "<table>";
while(list($name, $email, $url) = mysql_fetch_row($mem))
if ($email !== NULL) echo "<tr><td>$name</tdxtd>$url</tdx/tr>";
//Выводим завершение таблицы
echo "</table>";
Таким образом, для вывода обеих таблиц мы обошлись одним SQL-запросом.