PHP 4 на практике

Стандартные функции РНР для работы с MySQL


Итак, вы успешно создали и протестировали все необходимые разрешения; все готово для работы с сервером MySQL. В этом разделе я представлю стандартные функции РНР, при помощи которых вы сможете легко организовать взаимодействие сценариев РНР с сервером MySQL. Общая последовательность действий при взаимодействии с сервером MySQL выглядит так:

  1. Установить соединение с сервером MySQL. Если попытка завершается неудачей, вывести соответствующее сообщение и завершить процесс.
  2. Выбрать базу данных сервера MySQL. Если попытка выбора завершается неудачей, вывести соответствующее сообщение и завершить процесс. Допускается одновременное открытие нескольких баз данных для обработки запросов.
  3. Обработать запросы к выбранной базе (или базам).
  4. После завершения обработки запросов закрыть соединение с сервером баз данных.
  5. В примерах этого раздела используются таблицы products, customers и orders (см. рис. 11.1). Если вы захотите самостоятельно проверить все примеры, создайте эти таблицы или скопируйте страницу с описанием структуры, чтобы вам не приходилось постоянно листать книгу.

    Итак, начнем с самого начала — то есть с подключения к серверу MySQL.

    mysql_connect()

    Функция mysql_connect( ) устанавливает связь с сервером MySQL После успешного подключения к MySQL можно переходить к выбору баз данных, обслуживаемых этим сервером. Синтаксис функции mysql_connect( ):

    int mysql_connect ([string хост [:порт] [:/путь//к/сокету] [, string имя пользователя] [, string пароль])

    В параметре хост передается имя хостового компьютера, указанное в таблицах привилегий сервера MySQL. Конечно, оно же используется для перенаправления запросов на web-сервер, на котором работает MySQL, поскольку к серверу MySQL можно подключаться в удаленном режиме. Наряду с именем хоста могут указываться необязательные параметры — номер порта, а также путь к сокету (для локального хоста). Параметры имя_пользователя и пароль должны соответствовать имени пользователя и паролю, заданным в таблицах привилегий MySQL. Обратите внимание: все параметры являются необязательными, поскольку таблицы привилегий можно настроить таким образом, чтобы они допускали соединение без проверки. Если параметр хост не задан, mysql_connect( ) пытается установить связь с локальным хостом.




    Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор

    которой возвращается функцией mysql_select_db( ). Обратите внимание: параметр

    идентификатор_соединения необязателен лишь при одном открытом соединении с

    сервером MySQL. При наличии нескольких открытых соединений этот параметр

    должен указываться. Пример выбора базы данных функцией mysql_select_db( ):

    <?

    @mysql_connect("localhost", "web". "4tf9zzzf")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company") or die("Could not select company database!");

    ?>

    Если в программе выбирается только одна база данных, сохранять ее идентификатор не обязательно. Однако при выборе нескольких баз данных возвращаемые идентификаторы сохраняются, чтобы вы могли сослаться на нужную базу при обработке запроса. Если идентификатор не указан, используется последняя выбранная база данных.

    mysql_close( )

    После завершения работы с сервером MySQL соединение необходимо закрыть. Функция mysql_close( ) закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close( ) закрывает последнее открытое соединение. Синтаксис функции mysql_close( ):

    int mysql_close ([int идентификатор_соединения])

    Пример использования mysql_close( ):

    <?

    @mysql_connect("localhost", "web", "4tf9zzzf")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company") or die("Could not select company database!"); print "You're connected to a MySQL database!";

    ?>

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

    Соединения, открытые функцией mysql_pconnect( ), закрывать не обязательно.

    mysql_query( )

    Функция mysql_query( ) обеспечивает интерфейс для обращения с запросами к базам

    данных. Синтаксис функции mysql_query( ):



    int mysql_query (string запрос [, int идентификатор_соединения])

    Параметр запрос содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром идентификатор_соедине-ния, либо, при отсутствии параметра, последнему открытому соединению.

    Неопытные программисты часто ошибочно думают, что функция mysql_query( ) возвращает результаты обработки запроса. Это не так — в зависимости от типа запроса вызов mysql_query( ) может приводить к разным последствиям. При

    успешном выполнении команды SQL SELECT возвращается идентификатор результата, который впоследствии передается функции mysql_result( ) для последующего форматирования и отображения результатов запроса. Если обработка запроса завершилась неудачей, функция возвращает FALSE. Функция mysql_result( ) описана в одном из следующих разделов. Количество записей, участвующих в запросе, определяется при помощи функции mysql_num_rows( ). Эта функция также описана далее.

    Учитывая сказанное, я приведу примеры использования mysql_query( ) лишь после описания функций mysql_result( ) и mysql_affected_rows( ).

    Если вас беспокоит то, что при обработке запросов расходуется слишком много памя-ти, вызовите стандартную функцию РНР mysql_free_result. При вызове ей передается идентификатор результата, возвращаемый mysql_query( ). Функция mysql_free_result( ) освобождает всю память, связанную с данным запросом.

    mysqLaff ected_rows ( )

    Во многих ситуациях требуется узнать количество записей, участвующих в запросе SQL с командами INSERT, UPDATE, REPLACE или DELETE. Задача решается функцией mysql_affected_rows( ). Синтаксис функции:

    int mysql_affected_rows ([int идентификатор_соединения])

    Обратите внимание: параметр идентификатор_соединения не является обязательным. Если он не указывается, mysql_affected_rqws( ) пытается использовать последнее открытое соединение. Пример:

    <?

    // Подключиться к серверу и выбрать базу данных

    @mysql_connect("localhost", "web". "4tf9zzzf")



    or die(" Could not connect to MySQL server!");

    @mysql_select_db("company") or die("Could not select company database!");

    // Создать запрос

    $query = "UPDATE products SET prod_name = \"cantaloupe\"

    WHERE prod_id = \'10001pr\";

    // Выполнить запрос $result = mysql_query($query);

    // Определить количество обновленных записей

    print "Total row updated; ".mysql_affected_rows( );

    mysql_close( );

    ?>

    При выполнении этого фрагмента будет выведен следующий результат:

    Total row updated: 1

    Функция mysql_affected_rows( ) не работает с запросами, основанными на команде SELECT. Для определения количества записей, возвращенных при вызове SELECT, используется функция mysql_num_rows( ), описанная в следующем разделе.

    В одной специфической ситуации функция mysql_affected_rows( ) работает с ошибкой. При выполнении команды DELETE без секции WHEREmysql_affected_rows( ) всегда возвращает 0.

    mysql_num_rows( )

    Функция mysql_num_rows( ) определяет количество записей, возвращаемых командой SELECT. Синтаксис функции mysql_num_rows( ):

    int mysql_num_rows(int результат)

    Пример использования mysql_num_rows( ):

    <?

    // Подключиться к серверу и выбрать базу данных @mysql_connect("localhost", "web", "4tf9zzzf")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company") or die("Could not select company database!");

    // Выбрать все товары, названия которых начинаются с 'р'

    $query = "SELECT prod_name FROM products WHERE prod_name LIKE \"p*\"";

    // Выполнить запрос $result = mysql_query($query);

    print "Total rows selected: ".mysql_num_rows($result);

    mysql_close( );

    ?>

    Поскольку таблица содержит лишь один товар, название которого начинается с буквы р (pears), возвращается только одна запись. Результат:

    Total rows selected: 1

    mysql_result( )

    Функция mysql_result() используется в сочетании с mysql_query( ) (при выполнении запроса с командой SELECT) для получения набора данных. Синтаксис функции mysql_resu1t():



    int mysql_result (int идентификатор_результата, int запись [. mixed поле"]')

    В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Параметр запись ссылается на определенную запись набора данных, определяемого параметром идентификатор_результата. Наконец, в необязательном параметре поле могут передаваться:



    • смещение поля в таблице;


    • имя поля;


    • имя поля в формате имя_поля_имя_тдблицы.


    • В листинге 11.1 используется база данных, изображенная на рис. 11.1.

      Листинг 11.1.

      Выборка и форматирование данных в базе данных MySQL

      <?

      @mysql_connect("localhost", "web", "ffttss")

      or die("Could not connect to MySQL server!");

      @mysql_select_db("company")

      or die("Could not select products database!");

      // Выбрать все записи из таблицы products

      $query = "SELECT * FROM products"; $result = mysql_query($query);

      $x = 0;

      print "<table>\n";

      print "<tr>\n<th>Product ID</th><th>Product Name</th><th>Product Price</th>\n</tr>\n";

      while ($x < mysql_numrows($result)) :

      $id = mysql_result($result. $x. 'prod_id');

      $name = mysql_result($result, $x, 'prod_name');

      $price = mysql_result($result. $x, 'prod_price');

      print "<tr>\n";

      print "<td>$id</td>\n<td>$name</td>\n<td>$price</td>\n";

      print "</tr>\n";

      $x++;

      endwhile;

      print "</table>";

      mysql_close();

      ?>

      В результате выполнения этого примера с данными, изображенными на рис. 11.1, будет получен следующий результат:

      Листинг 11.2.

      Результат выполнения листинга 11.1

      <table>

      <tr>

      <th>Product ID</th><th>Product Name</th><th>Product Price</th>

      </tr>

      <tr>

      <td>1000pr</td>

      <td>apples</td>

      <td>1.23</td>

      </tr>

      <tr>

      <td>1001pr</td>



      <td>oranges</td>

      <td>2.34</td>

      </tr>

      <tr>

      <td>1002pr</td>

      <td>bananas</td>

      <td>3.45</td>

      </tr>

      <tr>

      <td>1003pr</td>

      <td>pears</td>

      <td>4.45</td>

      </tr>

      </table>

      Функция mysql_result( ) удобна для работы с относительно небольшими наборами данных, однако существуют и другие функции, работающие намного эффективнее, — а именно, функции mysql_fetch_row( ) и mysql_fetch_array( ). Эти функции описаны в следующих разделах.

      mysql_fetch_row()

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

      array mysql_fetch_row (int результат)

      Использование функции list( ) в сочетании с mysql_fetch_row( ) позволяет сэкономить несколько команд, необходимых при использовании mysql_result( ). В листинге 11.3 приведен код листинга 11.1, переписанный с использованием list( ) и mysql_fetch_row( ).

      Листинг 11.3.

      Выборка данных функцией mysql_fetch_row( ) <?

      @mysql_connect( "localhost", "web", "ffttss") or die("Could not connect to MySQL server!");

      @mysql_select_db("company") or die("Could not select products database!");

      $query = "SELECT * FROM products"; 

      $result = mysql_query($query);

      print "<table>\n";

      print "<tr>\n<th>Product ID</th><th>Product Name</th><th>

      Product Price</th>\n</tr>\n";

      while ($row = mysql_fetch_array($result)) :

      print "<tr>\n":

      print "<td>".$row["prod_id"]."</td>\n<td>".$row["prod_name"]."

      </td>\n<td>" .$row["prod_price"]. "</td>\n";



      print "</tr>\n"; 

      endwhile; 

      print "</table>"; 

      mysql_close();

      ?>

      Листинг 11. 3 выдает тот же результат, что и листинг 11.1, но использует при этом меньшее количество команд.

      my sq l_f etch_array ( )

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

      array mysql_fetch_array (int идентификатор результата [, тип_индексации])

      В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Необязательный параметр тип_индексации принимает одно из следующих значений:



      • MYSQL_ASSOC — функция mysql_fetch_array( ) возвращает ассоциативный массив. Если параметр не указан, это значение используется по умолчанию;


      • MYSQL_NUM — функция mysql_fetch_array( ) возвращает массив с числовой индексацией;


      • MYSQL_BOTH — к полям возвращаемой записи можно обращаться как по числовым, так и по ассоциативным индексам.


      • Листинг 11.4 содержит очередной вариант кода листингов 11.1 и 11.3. На этот раз используется функция mysql_fetch_array( ), возвращающая ассоциативный массив полей.

        Листинг 11.4.

        Выборка данных функцией mysql_fetch_array( )

        <?

        @mysql_connect( "local host", "web", "ffttss")

        or die("Could not connect to MySQL server!");

        @mysql_select_db( "company" )

        or die("Could not select products database!");

        $query = "SELECT * FROM products";

        $result = mysql_query($query);

        "<table>\n";

        print "<tr>\n<th>Product ID</th><th>Product Name</th> <th>Product Price</th>\n</tr>\n";

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

        print "<tr>\n";

        print "<td>".$row["prod_id"]."</td>\n <td>".$row["prod_name"]."</td>\n <td>" . $row["prod_price"] . "</td>\n" ;

        print "</tr>\n";

        endwhile;

        print "</table>";

        mysql_close();

        ?>

        Листинг 11.4 выдает тот же результат, что и листинги 11.1 и 11.3.

        Того, что сейчас вы знаете о функциональных возможностях MySQL в РНР, вполне достаточно, чтобы заняться созданием довольно интересных приложений. Первое приложение, которое мы рассмотрим, представляет собой простейшую поисковую систему. Этот пример демонстрирует применение форм HTML (см. предыдущую главу) для получения данных, которые в дальнейшем используются для выборки информации из базы.


        Содержание раздела