Wiki-учебник по веб-технологиям: MySQL/ОтображениеДанных ...

Главная | |

Отображение данных, хранящихся в Mysql


Чтобы отобразить какие-то данные в браузер с помощью PHP, нужно сначала получить эти данные в виде переменных PHP. При работе с Mysql без посредника (такого, как PHP) выборка данных производится с помощью команды SELECT языка SQL:

Mysql> SELECT * FROM Artifacts;


В предыдущей главе мы говорили, что любой запрос, в том числе и на выборку, можно отправить на сервер с помощью функции Mysql_query(); Там у нас стояла немного другая задача – получить данные из формы и отправить их с помощью запроса на вставку в базу данных. Результатом работы Mysql_query() там могло быть только одно из выражений, TRUE или FALSE. Теперь же требуется отправить запрос на выбор всех полей, а результат отобразить в браузере. И здесь результат – это целая таблица значений, а точнее, указатель на эту таблицу. Так что нужны какие-то аналоги функции Mysql_field_name(), только чтобы они извлекали из результата запроса не имя, а значение поля. Таких функций в PHP несколько.

Наиболее популярные – Mysql_result() и Mysql_fetch_array().

Синтаксис Mysql_result

смешанное
Mysql_result (ресурс result, целое row [, смешанное field])


Mysql_result() возвращает значение одной ячейки результата запроса. Аргумент field может быть порядковым номером поля в результате, именем поля или именем поля с именем таблицы через точку tablename.fieldname. Если для имени поля в запросе применялся алиас ('select foo as bar from...'), используйте его вместо реального имени поля.

Работая с большими результатами запросов, следует задействовать одну из функций, обрабатывающих сразу целый ряд результата (например, Mysql_fetch_row(), Mysql_fetch_array() и т.д.). Так как эти функции возвращают значение нескольких ячеек сразу, они НАМНОГО быстрее Mysql_result(). Кроме того, нужно учесть, что указание численного смещения (номера поля) работает намного быстрее, чем указание колонки или колонки и таблицы через точку.

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

Синтаксис Mysql_fetch_array

массив
Mysql_fetch_array ( ресурс result [, целое result_type])


Эта функция обрабатывает ряд результата запроса, возвращая массив (ассоциативный, численный или оба) с обработанным рядом результата запроса, или FALSE, если рядов больше нет.

Mysql_fetch_array() – это расширенная версия функции Mysql_fetch_row(). Помимо хранения значений в массиве с численными индексами, функция возвращает значения в массиве с индексами по названию колонок.

Если несколько колонок в результате будут иметь одинаковые названия, будет возвращена последняя колонка. Чтобы получить доступ к первым, следует использовать численные индексы массива или алиасы в запросе. В случае алиасов именно их вы не сможете использовать настоящие имена колонок, как, например, не сможете использовать “photo” в описанном ниже примере.

select Artifacts.photo as art_image,
Persons.photo as pers_image
from Artifacts, Persons


Пример 11.1. Запрос с дублирующимися именами колонок

Важно заметить, что Mysql_fetch_array() работает НЕ медленнее, чем Mysql_fetch_row(), и предоставляет более удобный доступ к данным.

Второй опциональный аргумент result_type в функции Mysql_fetch_array() является константой и может принимать следующие значения: MYSQL_ASSOC, MYSQL_NUM и MYSQL_BOTH. Эта возможность добавлена в PHP 3.0.7.

Значением по умолчанию является: MYSQL_BOTH.

Используя MYSQL_BOTH, получим массив, состоящий как из ассоциативных индексов, так и из численных. MYSQL_ASSOC вернет только ассоциативные соответствия, а MYSQL_NUM – только численные.

Замечание: имена полей, возвращаемые этой функцией, регистрозависимы.

Теперь отобразим данные из Artifacts в виде таблицы в браузере:

<?
/ * сначала делаем то жечто и раньшеустанавливаем
соединение
выбираем базу и получаем список и число полей в таблице Artifacts
*/
$conn=Mysql_connect("localhost","nina","123");
$database "book";
$table_name "Artifacts";
Mysql_select_db($database);
$list_f Mysql_list_fields($database,$table_name);
$n1 Mysql_num_fields($list_f);
// сохраним имена полей в массиве $names
for($j=0;$j<$n1$j++){
$names[] = Mysql_field_name ($list_f,$j);
}
$sql "SELECT * FROM $table_name"// создаем SQL запрос
$q Mysql_query($sql,$conn) or die(); // отправляем
// запрос на сервер
$n Mysql_num_rows($q); // получаем число строк результата
//рисуем HTML-таблицу
echo "&nbsp;<TABLE BORDER=0 CELLSPACING=0 width=90%
align=center><tr><TD BGCOLOR='#005533' align=center>
<font color='#FFFFFF'><b>$table_name</b></font></td>
</tr></TABLE>"
;
echo 
"<table cellspacing=0 cellpadding=1 border=1
width=90% align=center>"
;
// отображаем названия полей
echo "<tr>";
foreach (
$names as $val){
echo 
"<th ALIGN=CENTER BGCOLOR='#C2E3B6'>
<font size=2>$val</font></th>"
;
}
// отображаем значения полей
echo "</tr>";
for(
$i=0;$i<$n$i++){ // перебираем все строки в
// результате запроса на выборку
echo "<tr>";
foreach (
$names as $k => $val) { // перебираем все
// имена полей
$value Mysql_result($q,$i,$val); // получаем
// значение поля
echo "<td><font size=2>&nbsp;$value</font></td>";
// выводим значение поля
}
echo 
"</tr>";
}
echo 
"</table>";


Листинг 11.1.1. Отображение данных из Artifacts в виде таблицы в браузере

Сделаем то же самое с помощью Mysql_fetch_array():

<?
/* ... начало то же, что и в предыдущем примере */
// отображаем значения полей
for($i=0;$i<$n$i++){
// получаем значение поля в виде ассоциативного массива
while($row Mysql_fetch_array($qMYSQL_ASSOC)) {
echo 
"<tr>";
foreach (
$names as $k => $val){
echo 
"<td><font size=2>&nbsp;$row[$val]</font></td>";
// выводим значение поля
}
echo 
"</tr>";
}
}
echo 
"</table>";
?>