Опубликован: 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 >
Александра Каева
Александра Каева
Диляра Кенжебай
Диляра Кенжебай
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Олег Волков
Олег Волков
Россия, Балаково, МБОУ СОШ 19