Лекция: Некоторые улучшения в организации работы с данными

Рассмотрим код:

<?php

if (!($row = sql_fetch_row ($result))) {

print «Ошибка: не найдено ни одного ряда»;

exit;

}

do {

print "$row[0]: $row[1]\n<br>\n";

}

while ($row = sql_fetch_row ($result));

?>

В этом коде возможны по крайней мере два улучшения:

Задействовав функцию sql_fetch_row(), данный кусок кода предлагает косвенную проверку выборки на наличие хотя бы одного ряда данных. Но существует прямой способ — это подсчёт количества рядов в выборке $result функцией sql_num_rows():

<?php

if (sql_num_rows ($result) <= 0) {

print «Ошибка: не найдено ни одного ряда»;

exit;

}

 

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

print "$row[0]: $row[1]\n<br>\n";

}

?>

Исчезает необходимость в использовании do..while, ибо для проверки на «ноль рядов» функция sql_num_row() не выдёргивает первый ряд в $row, и указатель по-прежнему установлен на начало.

Вторая проблема нашего кода — это использование функции sql_fetch_row() для получения рядов. Как результат своей работы эта функция возвращает лишь пронумерованный массив. Однако существует ещё и функция sql_fetch_array(), которая возвращает два массива: пронумерованный и ассоциативный:

<?php

$row = sql_fetch_array ($result);

print $row[1]; // Второй столбец

print $row[name]; // Столбец name — имя

?>

Примечание: Существуют разные точки зрения на целесообразность использования одинарных кавычек при вставке строковых аргументов. В приведённом примере (столбец name) и далее по статье они не используются.

Какая из функций более удобна для разработчика? Ассоциативные массивы позволяют редактору кода ясно и однозначно понять, какая именно выборка из БД будет осуществляться в каждом конкретном случае. Например:

<?php

if (sql_num_rows ($result) <= 0) {

print «Ошибка: не найдено ни одного ряда»;

exit;

}

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

print "$row[name]: $row[phone_number]\n<br>\n";

}

?>

Ошибки SQL: запрашивается не то, что нужно

Язык Структурированных Запросов (SQL) был специально разработан для запросов и получения данных из таблиц в БД. Идея языка заключается в отсеивании данных ненужных вам (средствами SQL) и получении только тех, которые вам действительно необходимы для дальнейшей обработки (например, средствами PHP). Обработка выборки из БД средствами PHP — тоже является ошибкой.

Классический пример эффективного применения SQL-запросов — использование условия WHERE в синтаксисе SQL.

Рассмотрим пример кода, производящего выборку и выводящего список имён и телефонов всех пользователей с id равным 5:

<?php

// В предыдущих строках

// устанавливается соединение, и $conn

// определяется как дескриптор соединения.

$statement = «SELECT name, phone, id FROM samp_table»;

$result = @sql_query ($statement, $conn);

if (!$result) {

die (sprintf («Ошибка [%d]: %s», sql_errno (), sql_error ()));

}

if (@sql_num_rows ($result) <= 0) {

die («Получено ноль результатов»);

}

while ($row = @sql_fetch_array ($result)){

if ($row[id] & 5) {

print «Имя: $row[name]\n<br>\n»;

print «Телефон: $row[phone]\n<br>\n»;

break;

}

}

?>

Данный код имеет следующие недоработки: для поиска по всей БД используется PHP; при работе с БД малого размера на это можно и не обращать внимания, но с ростом БД вы обязательно заметите резкое падение скорости работы скриптов.

Выход прост: включите в SQL-запрос условие WHERE:

<?php

$statement = «SELECT name, phone FROM samp_table»;

$statement .= " WHERE id='5'";

WHERE позволит применить более строгие критерии выборки. Фильтром в данном случае будет являться значение аргумента. В нашем примере это «id=5».

Получив нужную вам выборку, вы используете PHP для простого вывода результатов:

<?php

if (@sql_num_rows ($result) != 1) {

die («Получено неверное количество рядов»);

}

$row = @sql_fetch_array ($result);

print «Имя: $row[name]\n<br>\n»;

print «Телефон: $row[phone]\n<br>\n»;

?>

Обработка результатов выборки средствами PHP

Нередко программист намеренно не сортирует выборку при запросе, перекладывая эту работу на PHP. Такой подход неэффективен, ибо сортировка средствами SQL проходит намного быстрее, чем в PHP.

Для сортировки результатов рекомендуем применять синтаксис SQL (ORDER BY), а не PHP-функцию ksort().

Рассмотрим пример использования ksort() для сортировки выборки по имени (name):

<?php

$statement = «SELECT name, email, phone FROM some_table »;

$statement .= «WHERE name IS LIKE '%baggins'»;

$result = @sql_db_query ($statement, «samp_db», $conn);

if (!$result) {

die (sprintf («Ошибка [%d]: %s», sql_errno (),sql_error ()));

}

while ($row = @sql_fetch_array ($result)){

$matches[ $row[name] ] = array ($row[email], $row[phone]);

}

ksort ($matches);

?>

Возникает вопрос: а почему бы ни провести сортировку результатов во время выборки? Это избавит нас от необходимости проходить по всему массиву с результатами дважды.

Итак, убираем ksort() и исправляем SQL-запрос, добавив ORDER BY:

<?php

$statement = «SELECT name, email, phone FROM some_table »;

$statement .= «WHERE name IS LIKE '%baggins' ORDER BY name»;

?>

еще рефераты
Еще работы по информатике