Опубликован: 16.01.2007 | Уровень: для всех | Доступ: платный
Дополнительный материал 1:

PHP и MySQL

< Лекция 11 || Дополнительный материал 1: 1234 || Дополнительный материал 2 >

Вывод данных из базы данных

Давайте теперь попробуем вывести все записи, хранящиеся в нашей базе данных. Обратимся к базе данных со следующим кодом:

<html>
 <body>
  <?php
   $db = mysql_connect("localhost", "root"); 
   mysql_select_db("mydb",$db);

   $result = mysql_query("SELECT * FROM employees",$db);

   echo "<table border=1>\n";
   echo "<tr><td>Name</td><td>Position</td></tr>\n";

   while ($myrow = mysql_fetch_row($result))
   {
    printf("<tr><td>%s %s</td><td>%s</td></tr>\n", $myrow[1], 
    $myrow[2], $myrow[3]);
   }

   echo "</table>\n";
  ?>
 </body>
</html>

Вы вероятно заметили, что в данном коде вы ввели несколько новых функций и конструкций. Наиболее очевидной из них является цикл while(). Цикл говорит, что до тех пор, пока в переменной $result остается запись для выборки, ее необходимо извлечь с помощью функции mysql_fetch_row и присвоить переменной $myrow. А после этого выполнить код, что расположен внутри фигурных скобок "{}". Приглядитесь к коду внимательнее и разберитесь в этой конструкции.

Для понимания этого кода разберем понятие "массив". Выполнение функции mysql_query дает в результате массив, который хранится в переменной $result. Если представить этот массив схематически, то он будет выглядеть как показано в табл 12.1:

Таблица 12.1.
0 id 1 first 2 last 3 address 4 position Порядковый номер элемента массива
1 Bob Smith 128 Here St, Cityname Marketing Manager 0
2 John Roberts 45 There St ,Townville Telephonist 1
3 Brad Johnson 1/34 Nowhere Blvd, Snowston Doorman 2

Переменная $result является массивом. Причем не простым массивом, а двумерным. В нем содержатся три строки с номерами от 0 до 2. каждая из которых содержит 5 столбцов от 0 до 4. Для того, чтобы вывести на странице все записи, нам надо пройти от 0-й строчки массива до 2-й. Лучше всего это делать в цикле с помощью функции mysql_fetch_row (которая в переводе буквально означает – "выбрать ряд").

Функции mysql_fetch_row в качестве параметра подается массив $result. Функция выбирает из него строку, которую мы можем записать в переменную $myrow и автоматически переходит на следующую строку. Вызвав снова mysql_fetch_row, выберем следующую строку из массива, и так далее до тех пор, пока не достигнем конца массива. В этом случае mysql_fetch_row вернет значение false, которое послужит сигналом, что все записи выбраны и можно завершить цикл.

Теперь стоит задача как-то вывести в теле цикла полученную запись. Выбранный ряд хранится в переменной $myrow. Она также, как и $result, является массивом, только одномерным. Схематически это выглядит как в табл. 12.2:

Таблица 12.2.
0 id 1 first 2 last 3 address 4 position Порядковый номер элемента массива
1 Bob Smith 128 Here St, Cityname Marketing Manager 0

А вот как будет выглядеть содержимое переменной $myrow при втором прохождении цикла (табл. 12.3):

Таблица 12.3.
0 id 1 first 2 last 3 address 4 position Порядковый номер элемента массива
2 John Roberts 45 There St ,Townville Telephonist 1

При третьем прохождении – как в табл. 12.4

Таблица 12.4.
0 id 1 first 2 last 3 address 4 position Порядковый номер элемента массива
3 Brad Johnson 1/34 Nowhere Blvd, Snowston Doorman 2

К каждому столбцу в массиве $myrow мы можем обратиться по его порядковому номеру, который заключается в квадратные скобки. Например, в первом цикле, $myrow[1] равно "Bob", во втором $myrow[4] равно "Telephonist".

На первый взгляд процедура извлечения данных весьма сложна, но она вполне логически понятна и объяснима. Главное не забывайте, что элементы массивов нумеруются от 0, а не от 1.

Далее, вывод переменных в HTML с помощью функции printf() – дело техники, уже знакомой нам по предыдущему примеру.

Наш код содержит недостаток: если в базе данных не будут найдены записи, удовлетворяющие нашему запросу, мы не получим никакого сообщения об этом. Неплохо было бы, чтобы программа выдавала какое-нибудь сообщение. Сделаем ее более дружественной.

Взгляните на следующий код:

<html>
  <body>
    <?php
      $db = mysql_connect("localhost", "root");
      mysql_select_db("mydb",$db);

      $result = mysql_query("SELECT * FROM employees",$db);
      if ($myrow = mysql_fetch_array($result))
      {
        echo "<table border=1>\n";
        echo "<tr><td>Name</td><td>Position</td></tr>\n";

        do{
          printf("<tr><td>%s %s</td><td>%s</tr>\n", $myrow["first"], $myrow["last"],
          $myrow["address"]);
        } while ($myrow = mysql_fetch_array($result));

        echo "</table>\n";
      } else
      { 
        echo "Sorry, no records were found!";
      }
    ?>
  </body>
</html>

В данном коде мы опять ввели некоторые новые понятия, но они достаточно просты. Во-первых, вместо функции mysql_fetch_row() мы использовали функцию mysql_fetch_array(). Она работает точно так же, как и mysql_fetch_row() за одним замечательным исключением: с помощью этой функции мы можем обращаться к каждому полю массива не по номеру, а по имени.

Например, если раньше для получения имени нам приходилось писать $myrow[1] (1 – второй столбец массива), то теперь мы можем писать $myrow["first"] ("first" – название столбца в базе данных и в массиве). Второй вариант естественно гораздо информативнее и удобнее.

Кроме этого, в коде использован цикл do/while и условная конструкция if-else. Выражение if-else говорит, что если мы можем присвоить значение $myrow, то надо начать выборку, в противном случае мы понимаем, что записей нет, переходим к блоку else и выводим соответствующее сообщение.

Чтобы проверить, как работает эта часть кода, замените SQL-выражение на " SELECT * FROM employees WHERE id=6 " или на какое-нибудь другое, которое не даст результата.

Цикл do/while – это всего лишь вариант цикла while(), который мы использовали в предыдущем примере. Мы обратились за помощью к циклу do/while по одной простой причине. В конструкции if мы уже сделали выборку первого ряда и присвоили его переменной $myrow.

Если бы мы сейчас воспользовались прежней конструкцией (т.е. while ($myrow = mysql_fetch_row($result) ), мы бы затерли значения первой выбранной записи, заменив ее значениями второй записи. В случае же с циклом do/while мы проверяем условие после того, как код цикла выполнится по крайней мере один раз. Таким образом, ни одна запись не ускользнет из наших рук.

А сейчас давайте сделаем код в цикле и if-else конструкцию еще более красивым.

< Лекция 11 || Дополнительный материал 1: 1234 || Дополнительный материал 2 >
Александра Каева
Александра Каева
Диляра Кенжебай
Диляра Кенжебай
Евгений Вершинин
Евгений Вершинин
Россия, Нижний Новгород, Нижегородский государственный технический университет, 2008
Aleksandr Arshinskyi
Aleksandr Arshinskyi
Россия