Шаг 13 - Функции работы с MySQL, часть 2

Продолжим рассмотрение скрипта 10-го шага. Все внимание функциям выборки данных.

В предыдущем шаге мы законнектились к mysql-серверу и выбрали базу. Теперь формируем запрос к базе. Для этой цели используется функция MYSQL_QUERY() или MYSQL_DB_QUERY(). Разница между ними, как Вы, наверное, уже догадываетесь, заключается в том, что первая из них предполагает, что база данных уже выбрана а вторая наряду с выполнением запроса осуществляет выбор базы.

Параметры: MYSQL_QUERY(строка запроса [, $link]), где $link - идентификатор коннекта, возвращаемого функцией MYSQL_CONNECT(); MYSQL_DB_QUERY(база данных, строка запроса [, $link])). Как обычно, если не указан $link, то используется последнее выполненное соединение. Обе функции выполняют соединение с mysql-сервером (MYSQL_CONNECT()), если ранее не выполнено такое соединение. При этом неявный вызов MYSQL_CONNECT() осуществляется без параметров, используя в качестве имени хоста "localhost", а в качестве имени пользователя и пароля - пустые строки. И обе функции возвращают переменную (идентификатор ресурса), которую потом нужно использовать при обработке запроса (см. ниже). Например,

mysql_select_db("books");
$result = mysql_query("select * from books");

или

$result = mysql_db_query("books","select * from books");

Теперь самое интересное - обработка запроса. Эта операция осуществляется с помощью fetch-группы функций PHP: MYSQL_FETCH_ARRAY(), MYSQL_FETCH_FIELD(), MYSQL_FETCH_LENGTHS(), MYSQL_FETCH_OBJECT() и MYSQL_FETCH_ROW(), а также некоторыми дополнительными функциями (функций управления fetch-курсором, информационными функциями и пр.). Эти функции возвращают очередную строку выборки в виде массива или объекта, перемещая внутренний указатель на следующую строку. Поэтому их следует использовать в циклах.

Сразу небольшое замечание. Среди mysql-функций в PHP есть MYSQL_RESULT(). Она возвращает значение одного столбца в указанной строке. В мануале рекомендуют вместо нее использовать более быстрые функции fetch-группы. Кроме того, по моему мнению, эта функция самая неудобная для работы с выбранными данными. Посему эту функцию я рассматривать не буду.

В 10-м шаге мы использовали функцию MYSQL_FETCH_ROW(). С нее и начнем. Итак, в результате выполнения одной из двух query-функций мы имеем указатель на ресурс выборки. Пусть сей указатель хранится в переменной $result. Тогда в таком цикле:

 
while ($data=mysql_fetch_row($result)) {
	echo implode(" | ",$data), "<br>";
}

можно вывести результаты запроса. Эта функция возвращает массив (здесь $data), в котором каждый элемент - поле строки выборки, возвращаемое select-ом в query-функции. Функция из string-группы IMPLODE() вернет строку, состоящую из элементов массива, указанного во втором параметре, разделенных разделителем - первым параметром.

Теперь попробуем повторить вывод результатов запроса дважды (пример, конечно, надуманный, но на практике иногда требуется пройтись по результатам запроса более одного раза):

 
echo "Первый раз";
while ($data=mysql_fetch_row($result)) {
	echo implode(" | ",$data), "<br>";
}
echo "Второй раз";
while ($data=mysql_fetch_row($result)) {
	echo implode(" | ",$data), "<br>";
}

После строки "Второй раз" мы ничего не увидим. Причина в том, что при каждом вызове fetch-функции внутренний указатель (курсор) автоматически переходит к следующей записи. Как только этот указатель доберется до конца выборки, fetch-функция вернет FALSE, и произойдет выход из цикла. Управлять указателем можно с помощью функции MYSQL_DATA_SEEK(). Параметры: id результата и номер строки, на которую надо установить указатель. Отсчет строк начинается с нуля. В последнем примере перед вторым циклом нужно было бы сказать

mysql_data_seek($result, 0);

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Константин Платонов.