\n\n\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 "\n"; print "\n\n\n"; print "\n"; $x++; endwhile; print "
Изучаем PHP программирование

   Search   

Русская версия | English version   

Скрипты :: Секреты профессионалов :: Link :: FAQ   Пишите письма  



 

главная :: основы PHP

Заголовок

Стандартные функции РНР для работы с MySQL Итак, вы успешно создали и протестировали все необходимые разрешения; все готово для работы с сервером MySQL. В этом разделе я представлю стандартные функции РНР, при помощи которых вы сможете легко организовать взаимодействие сценариев РНР с сервером MySQL. Общая последовательность действий при взаимодействии с сервером MySQL выглядит так: Установить соединение с сервером MySQL. Если попытка завершается неудачей, вывести соответствующее сообщение и завершить процесс. Выбрать базу данных сервера MySQL. Если попытка выбора завершается неудачей, вывести соответствующее сообщение и завершить процесс. Допускается одновременное открытие нескольких баз данных для обработки запросов. Обработать запросы к выбранной базе (или базам). После завершения обработки запросов закрыть соединение с сервером баз данных. В примерах этого раздела используются таблицы 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: @mysql_connect(" local host", "web", "4tf9zzzf") or die("Could not connect to MySQL server!"); В данном примере localhost — имя компьютера, web— имя пользователя, а 4tf9zzzf — пароль. Знак @ перед вызовом функции mysql_connect( ) подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, — они заменяются сообщением, указанным при вызове die( ). Обратите внимание: значение, возвращаемое при вызове rnysql_connect( ), в данном примере не используется. Если в программе используется всего одно соединение с сервером MySQL, это вполне нормально. Но если программа устанавливает соединения с несколькими серверами MySQL на разных хостах, следует сохранить идентификатор соединения, возвращаемый при вызове mysql_connect( ), чтобы адресовать последующие команды нужному серверу MySQL. Пример: Идентификаторы $link1 и $link2 передаются при последующих обращениях к базам данных с запросами. Вскоре вы узнаете, как именно адресовать запрос нужному серверу при помощи идентификатора соединения. Функция mysql_pconnect( ) обеспечивает поддержку восстанавливаемых (persistent) соединений. В многопользовательских средах рекомендуется использовать mysql_pconnect( ) вместо mysql_connect( ) для экономии системных ресурсов. По типам параметров и возвращаемого значения функция mysql_pconnect( ) в точности совпадает c mysql_connect( ). mysql_select_db( ) После успешного соединения с MySQL необходимо выбрать базу данных, находящуюся на сервере. Для этого используется функция mysql_select_db( ). Синтаксис функции mysql_select_db( ): int mysql_select_db (string имя_базы_данных [, int идентификатор_соединения]) Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор которой возвращается функцией mysql_select_db( ). Обратите внимание: параметр идентификатор_соединения необязателен лишь при одном открытом соединении с сервером MySQL. При наличии нескольких открытых соединений этот параметр должен указываться. Пример выбора базы данных функцией mysql_select_db( ): Если в программе выбирается только одна база данных, сохранять ее идентификатор не обязательно. Однако при выборе нескольких баз данных возвращаемые идентификаторы сохраняются, чтобы вы могли сослаться на нужную базу при обработке запроса. Если идентификатор не указан, используется последняя выбранная база данных. mysql_close( ) После завершения работы с сервером MySQL соединение необходимо закрыть. Функция mysql_close( ) закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close( ) закрывает последнее открытое соединение. Синтаксис функции mysql_close( ): int mysql_close ([int идентификатор_соединения]) Пример использования mysql_close( ): В этом примере указывать идентификатор соединения не нужно, поскольку на момент вызова 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( ) пытается использовать последнее открытое соединение. Пример: При выполнении этого фрагмента будет выведен следующий результат: 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( ): Поскольку таблица содержит лишь один товар, название которого начинается с буквы р (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 \n"; print "

Product IDProduct NameProduct Price
$id$name$price
"; mysql_close(); ?> В результате выполнения этого примера с данными, изображенными на рис. 11.1, будет получен следующий результат: Листинг 11.2. Результат выполнения листинга 11.1
Product IDProduct NameProduct Price
1000pr apples 1.23
1001pr oranges 2.34
1002pr bananas 3.45
1003pr pears 4.45
Функция 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( ) \n"; print "\nProduct IDProduct Name Product Price\n\n"; while ($row = mysql_fetch_array($result)) : print "\n": print "".$row["prod_id"]."\n".$row["prod_name"]." \n" .$row["prod_price"]. "\n"; print "\n"; endwhile; print ""; 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( ) \n"; print "\nProduct IDProduct Name Product Price\n\n"; while ($row = mysql_fetch_array($result)) ; print "\n"; print "".$row["prod_id"]."\n ".$row["prod_name"]."\n " . $row["prod_price"] . "\n" ; print "\n"; endwhile; print ""; mysql_close(); ?> Листинг 11.4 выдает тот же результат, что и листинги 11.1 и 11.3. Того, что сейчас вы знаете о функциональных возможностях MySQL в РНР, вполне достаточно, чтобы заняться созданием довольно интересных приложений. Первое приложение, которое мы рассмотрим, представляет собой простейшую поисковую систему. Этот пример демонстрирует применение форм HTML (см. предыдущую главу) для получения данных, которые в дальнейшем используются для выборки информации из базы. Простейшая поисковая система Всем нам неоднократно приходилось пользоваться поисковыми системами в Web, но как устроены такие системы? Простейшая поисковая система принимает по крайней мере одно ключевое слово. Это слово включается в запрос SQL, который затем используется для выборки информации из базы данных. Результат поиска форматируется поисковой системой по тому или иному критерию (скажем, по категории или степени соответствия). Поисковая система, приведенная в листинге 11.5, предназначена для поиска информации о клиентах. В форме пользователь вводит ключевое слово и выбирает категорию (имя, идентификатор или адрес электронной почты клиента), в которой будет производиться поиск. Если введенное пользователем имя, идентификатор или адрес существует, поисковая система извлекает из базы данных остальные атрибуты. Затем по идентификатору покупателя из таблицы orders выбирается история заказов. Все заказы, оформленные этим клиентом, отображаются по убыванию объема. Если заданное ключевое слово не встречается в категории, указанной пользователем, поиск прекращается, программа выводит соответствующее сообщение и снова отображает форму. Листинг 11.5. Простейшая поисковая система (searchengine.php) Keyword:

Search Focus:

, // Если форма еще не отображалась - отобразить ее if (Sseenform != "у") : print $form; else : // Подключиться к серверу MySQL и выбрать базу данных @mysql_connect("localhost", "web", "ffttss") or die("Could not connect to MySQL server!"); @mysql_select_db("company") or die("Could not select company database!"); // Построить и выполнить запрос $query = "SELECT cust_id. cust_name, cust_email FROM customers WHERE $category = '$keyword'"; $result = mysql_query($query); // Если совпадения не найдены, вывести сообщение // и заново отобразить форму if (mysql_num_rows($result) == 0) : print "Sorry, but no matches were found. Please try your search again:"; print $form; // Найдены совпадения. Отформатировать и вывести результаты, else : // Отформатировать и вывести значения полей. list($id, $name, $email) = mysql_fetch_row($result); print "

Customer Information:

"; print "Name: $name
"; print "Identification #: $id
"; print "Email: $email
"; print "

Order History:

"; // Построить и выполнить запрос к таблице 'orders' $query = "SELECT order_id, prod_id, quantity FROM orders WHERE cust_id = '$id' ORDER BY quantity DESC"; $result = mysql_query($query): print ""; print ""; // Отформатировать и вывести найденные записи. while (list($order_id, $prod_id, $quantity) = mysql_fetch_row($result)); print ""; print ""; print ""; endwhile; print "
0rder IDProduct IDQuantity
$order_id$prod_id$quantity
"; endif; endif; ?> Если ввести ключевое слово Mi 1 апо и выбрать в раскрывающемся списке категорию Customer Name (Имя клиента), программа выводит следующую информацию: Customer information: Name:Milano Identification#:2000cu Email:felix@milano.com Order History: Order Id Product Id Quantity 100003 1000pr 12 100005 1002pr 11 Конечно, мы рассмотрели простейшую реализацию поисковой системы. Существует немало дополнительных возможностей — поиск по нескольким ключевым словам, поиск по неполным ключевым словам или автоматическая выборка записей с похожими ключевыми словами. Попробуйте применить свою творческую фантазию и реализовать их самостоятельно. Сортировка таблиц При выводе данных из базы необходимо предусмотреть возможность их сортировки по различным критериям. В качестве примера рассмотрим результаты, выведенные нашей поисковой системой, — обратим особое внимание на следующие после заголовка Order History: (История заказов). Допустим, список получился очень длинным, и вы хотите отсортировать данные по идентификатору товара (или идентификатору заказа). Чтобы вы лучше поняли, о чем идет речь, рекомендую посетить один из моих любимых сайтов, http://download.cnet.com. Если в процессе просмотра программ конкретной категории щелкнуть на заголовке столбца (название, дата размещения, количество загрузок или размер файла), то список автоматически упорядочивается по содержимому указанного столбца. Далее показано, как реализовать подобную возможность. В листинге 11.6 мы производим выборку данных из таблицы orders. По умолчанию данные сортируются по убыванию объема заказа (поле quantity). Однако щелчок на любом заголовке таблицы приводит к тому, что страница загружается заново с упорядочением таблицы по указанному столбцу. Листинг 11.6. Сортировка таблиц (tablesorter.php) "; print " Order ID Customer ID Product ID Quantity "; // Отформатировать и вывести каждую строку таблицы while (list($order_id,$cust_id,$prod_id, $quantity) = mysql_fetch_row($result)) : print ""; print "$order_id$cust_id$prod_id $quantity"; print ""; endwhile; // Завершить таблицу print ""; Для базы данных company, изображенной на рис. 11.1, стандартные выходные данные листинга 11.6 выглядят следующим образом: Order ID Customer ID Product ID Quantity 100003 2000cu 1000pr 12 100005 2000cu 1002pr 11 100004 2000cu 1000pr 9 100002 2000cu 1001pr 5 100001 2000cu 1002pr 3 Обратите внимание: заголовки таблицы представляют собой гиперссылки. Поскольку по умолчанию сортировка осуществляется по полю quantity, записи отсортированы по убыванию последнего столбца. Если щелкнуть на ссылке Order_ID, страница загружается заново, но на этот раз записи сортируются по убыванию идентификатора заказа. Таблица будет выглядеть так: Order ID Customer ID Product ID Quantity 100005 2000cu 1002pr 11 100004 2000cu 1000pr 9 100003 2000cu 1000pr 12 100002 2000cu 1001pr 5 100001 2000cu 1002pr 3 Сортировка выходных данных приносит огромную пользу при форматировании баз данных. Простая модификация запроса SELECT позволяет упорядочить данные по любому критерию — по возрастанию, по убыванию или с группировкой записей. На этом наше знакомство с MySQL подходит к концу. Учтите, что материал этой главы отнюдь не исчерпывает всего, что необходимо знать о MySQL. Полный список команд MySQL в РНР приведен в документации (http://www.php.net/manuat).

Designed by Fedin
All right reserved
2003-2004
Hosted by uCoz