308 РНР-шаг за шагом, глава3

увлечения и хобби Богданова Игоря, для всех самоделкиных

Поиск
 
 

Результаты :
 

 


Rechercher Расширенный поиск

Талисман 2021 года

гороскоп
Гороскопы и Сонники
⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂⁂Погода
!!!Погода в Рощино

влажность:

давление:

ветер:

⁂⁂
Похожие темы
Социальные закладки
Социальные закладки reddit      

Поместите адрес форума Песочница Увлечённых Самоделкиных в редакции Гарика на вашем сайте социальных закладок (social bookmarking)

Андрей Щедрин рулит...index.php (336×448)Ремонт ГБЦ на Дельте=и Леночка РНР-шаг за шагом, глава3 0_fcbb3_a46da45a_XXXL
Посмотреть на Яндекс.Фотках РНР-шаг за шагом, глава3 0_fcbbc_adb6f71f_M
Посмотреть на Яндекс.Фотках
Фото131.jpg 110kv Фото129.jpg
моя фея

и ДЖИН

фортуна

Вы не подключены. Войдите или зарегистрируйтесь

РНР-шаг за шагом, глава3

Перейти вниз  Сообщение [Страница 1 из 1]

Gor

Gor
Admin


Заканчиваем обзор.
Однако, продолжим рассмотрение (вернее, беглый обзор - что называется, голопом по европам) функций PHP.



  1. Функции доступа к dbm-базам.

  2. Функции даты и времени: получить, проверить правильность, вывести в формате.

  3. Dbase-функции. Ну тут стандартный dbase-, clipper-, и_иже_с_ними-набор: открыть/закрыть, читать/писать/заменять/добавлять/удалять записи, получить количества колонок и записей в таблице.

  4. Функции для работы с директориями: открыть/закрыть, читать, сменить каталог.

  5. Так называемые dl-функции (вернее, одна единственная функция) - динамическая загрузка PHP-библиотеки в рунтайме. Статическая загрузка предполагает наличие в ini-файле PHP указания на загружаемые модули (разделы "extension" - сами модули, - и "extension_dir" - где эти модули искать).

  6. Работа с DOM-объектами для XML-документов (для PHP 4-ой версии).

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

  8. FTP-функции поддерживают весь стандартный набор команд ftp-протокола.

  9. Чрезвычайно ценные HTTP-функции (их всего 3) позволяют управлять HTTP-заголовком. Вот пример, в котором без функции header() вообще нельзя обойтись. Вы формируете картинку PHP-кодом (до image-функций мы еще доберемся). Если не сказать перед передачей картинки браузеруheader("Content-type: image/gif"), то в заголовке HTTP-запроса будет утверждаться, что пришедший от сервера файл имеет тип text/html.

  10. Image-функции позволяют создавать PNG- и Jpeg-файлы "налету" (поддержка gif-формата с 4-ой версии PHP прекращена в связи с проблемой лицензирования; впрочем, существуют сборки php_gd.dll с поддержкой gif-ов), рисовать графические примитивы, выводить в картинке текст и читать существующие картинки.

  11. IMAP-функции позволяют работать с imap-ящиками (чтение, проверка, посылка письма, работа с заголовками писем, с почтовыми ящиками, ping-и, mail-адреса, всякие там en-/decodebase64 и прочее).

  12. Математические функции (а как же без них!)

  13. Функции шифрования и хеш-функции (список поддерживаемых алгоритмов занимает 2 строки).

  14. Что называется, минеслаус-функции: проверка коннекта, define-функции, eval (выполнение строки как скрипта), работа с аргументами функций (4-я версия), сериализация, sleep и пр.

  15. MySQL-функции. Им будут посвящены несколько шагов.

  16. Сетевые функции: NDSip-адреса, связь номера и имени сетевого протокола и пр.

  17. ODBC-функции

  18. Очень полезная группа функций, возвращающих информацию о состоянии и настройках PHP-интерпретатора, записывающих сообщения в log-файлы, читающих окружения интерпретатора. Самая эффектная - phpinfo() Wink. Откройте в браузере файл http://localhost/info.php3, содержащий такой текст:

    Увидите чудо!

  19. Четыре функции для запуска внешних программ. Вернее три, четвертая (escapeshellcmd) предназначена для экранирования символов "<", ">", "|" и некоторых других. Дело в том, что вызов внешней программы из скрипта - потенциально опасное действие. Не проверив содержимое строки, передаваемой в качестве параметра таким функциям, как eval(), можно создать потенциальную брешь для злоумышленников. Посмотрите, что выведет на экран такая конструкция: echo escapeshellcmd("echo y| format c:").

  20. Само собой, что в PHP есть функции работы с регулярными выражениями.

  21. В 4-ой версии появилась возможность работать с сессиями (в 3-ей для этих целей нужно писать эмулирующий сессии код). Сессиями мы займемся, когда будем разрабатывать систему регистраций в наших будущих проектах.

  22. Огромный список функций работы со строками (включая функцию для конвертации кириллицы в разные кодировки! - наверное, изобилием кодировок мы уже весь мир достали Wink.

  23. Семь функций работы с URLbase64, разбор URL-строки на части (хост, порт, путь и т.д.), а также кодировка строки с заменой неанглийских символов и пробелов 16-ричными цифрами с лидирующим "%" и обратно (очень помогает при работе с файлами, имеющими русские буквы в названии).

  24. Функции проверки PHP-переменных на инициализированность (ух какое словечко получилось! Wink, принадлежность определенному типу (число, строка и пр.) и т.п.

  25. XML-функции (парсинг XML-тегов). В прошлом шаге я давал ссылку на сайт, где эта тема очень хорошо освещена.




Первый проект - начало. MySQL.
Очень надеюсь, что обзор возможностей был не слишком утомителен.
Я думаю, сейчас самое время перейти от слов к делу - сделать первый небольшой скрипт. Возьмем для примера следующую задачу. Нужно сделать базу с книгами, которые появились или скоро появятся в продаже, и которые вызывают интерес.
Для этого нам понадобятся: база (таблицы сделаем в MySQL), форма ввода, процедура загрузки из текстового файла (на тот случай, если ранее список книг лежал в файле - у меня дело именно так и обстоит), страница для вывода с сортировкой по критериям и, как дополнительный прибамбас (его сделаем в самую последнюю очередь), загрузка новостей с сайтов издательств с занесением выбранных позиций в базу.
Цель проекта проста. Не упустить интересующее чтиво.
Структура таблиц будет такой. Таблица описания книг BOOKS:



id int(5) - уникальный id autoincrement primary key - сначала хотел сделать автора и название ключем, решил, что это будет неудобно, если решим добавлять ссылочные таблицы)

author char(60) - автор

namebook text(100) - название книги

series int(2) - id серии (если книга принадлежит серии) - для серий отдельная таблица

edition int(2) - издание

year int(4) - год издания

isbn char(20) - ISBN (интересно, 20 символов хватит?)

pages int(4) - объем книги

when_create int(2) - номер квартала (за точку отсчета возьмем I квартал 2000)

how int(4) - предположительная цена

status int(1) - id статуса: обязательно заказать, посмотреть подробнее и т.п.


Для начала хватит. Потом добавим серии книг, статусы, таблицу оглавлений и обложек (в blob-ах), комментарии к книгам и список интернет-магазинов, в которых книга была обнаружена.
Для создания таблицы нам понадобится создать базу данных в MySQL (назовем ее тоже BOOKS) и в ней уже саму таблицу. Но сначала об установке MySQL. Я опишу установку под WinNT (под *nix-ы его надо собирать - я пока это проделывать не пробовал).
Процедура эта довольно проста. Надо забрать дистрибутив с http://www.mysql.com, раскрыть zip, запустить setup.exe. После окончания установки в каталогеMySQL-я будет лежать файл my-example.cnf. Предполагается, что его надо будет скопировать в каталог c:\\ под именем my.cnf. Я этого не делал. Вместо этого, следуя Readme-файлу, я запустил winmysqladmin.exe, выбрал закладку "my.ini Setup", указал директорию, в которой живут поддиректории MySQL-я (у меня это C:/usr/local/mysql), выбрал радиобаттон в секции "mysqld filemysqld-nt (запуск MySQL-сервера как службы в NT) и нажал на "Save Modification". После чего в WINNT-каталоге обнаружил файл my.ini. Все. Осталось убедиться, что в списке служб появилась служба "mysql", и выставить ей атрибут запуска (руками/автоматом).
Итак, заходим в каталог (если вы, конечно, не внесли эту директорию в path-окружение)
c:\\mysql\\bin (или туда, куды вы установили MySQL; далее будем полагать, что mysql установлен в c:\\mysql) и запускаем mysqladmin с параметром (краткую справку по параметрам mysqladmin-а я приведу в следующем шаге).

create <имя база>.
В нашем случае
create books.
mysqladmin никакой мессагой нас не порадовал,
но, зайдя в c:\\mysql\\data (там по умолчанию mysql хранит базы данных, если не
задано противное в конфигурации сервера), можно с чувством глубокого удовлетворения обнаружить
директорию books. Это и есть наша база. Правда, директория пуста - мы ведь не создали в базе еще
ни одной таблицы. (Кстати, если вы решите удалить базу пудем удаления директории -
лучше откажитесь от этой затеи. Mysql хранит у себя информацию о существующих базах.
Для корректного удаления базы есть параметр у mysqladmin-а:

drop <имя базы>.


Создаем таблицу. Можно зайти в mysql.exe и создать там, а можно скормить тектовый файл с командами для mysql-я на вход exe-шнику. (При заходе с локальной машины mysql считает, что пришел root со всеми полномочиями - о пользователях и полномочиях в mysql-е поговорим позднее).
Итак, либо, зайдя в mysql, введите нижеследующую последовательность команд,
либо сохраните их в файле (например, books.sql) и скажите

mysql < books.sql


А вот содержимое books.sql:

connect books;

create table books (

id int(5) not null primary key auto_increment,

author char(60),

namebook varchar(100),

series int(2),

edition int(2),

year int(4),

isbn char(20),

pages int(4),

when_create int(2),

how int(4),

status int(1)

);


Зайдя теперь в каталог c:\\mysql\\data\\books, вы обнаружите целых три файла: books.frm (структура таблицы), books.myd (данные; сейчас он нулевой длины -insert-ов ведь не было!) и books.myi (данные о ключах).
Напоследок небольшое пояснение по первой строке (полю) в insert-е. По идее, параметр "not null" не нужен, раз "primary key" говорим. Но есть мнение, что лучше все же его указать (я не готов это утверждение как-либо комментировать). Auto_increment, соответственно, присваивает одноименный атрибут полю, позволяя при insert-е автоматически генерить цифру на единицу большую, чем в предыдущем insert-е.


Заглянем в базу. Первый скрипт.
Два замечания в начале:
1) В предыдущем шаге я допустил досадную оплошность. Для установки MySQL как службы под Windows NT кроме создания my.ini файла winmysqladmin-ом надо, конечно же, выполнить саму установку сервера как службы вот так:

C:\\mysql\\bin\\mysqld-nt --install


Приношу свои извинения за допущенную ошибку.
2) После опубликования предыдущих трех шагов мне пришло письмо от Michael Vladimirov (спасибо, Michael !) - сайт "How IT works" http://it.sinor.ru/, - по поводу проблемы с установкой PHP как модуля Apache. Michael пишет, что PHP не становится как модуль при включенной библиотеке GDextension=php_gd.dll" вphp.ini веб-сервер Apache действительно запустился. К этой теме я еще вернусь, когда выясню некоторые пока для меня неясные моменты.
Итак, база (и первая таблица в ней) созданы.
Напишем скрипт, который будет формировать html-страницу с содержимым таблицы. Но сначала таблицу надо заполнить содержимым. Так как форма ввода у нас еще не создана, то воспользуемся методом из предыдущего шага - создадим sql-запрос на добавление записи в таблицу и направим его (файл с запросом) на вход mysql.exe.
Вот этот скрипт:

connect books;

insert into books (

id, author, namebook, series, edition, year, isbn,

pages, when_create, how, status)

values (null, "Р. Яргер и др.",

"MySQL и mSQL. Базы данных для небольших предприятий и Интернета",

0, 0, 2000, "5-93286-010-3", 557, 3, 170, 0),

       (null, "Ларри УОЛЛ", "Программирование на Perl",

0, 3, 2001, null, 1200, 5, null, 0);


Несколько замечаний по этому запросу. Во-первых, я не сказал "commit". В данном случае это не обязательно, т.к. commit произойдет по окончанию скрипта автоматически. Во-вторых, в качестве значения для ключевого поля id выбрано значение null, что заставляет mysql присвоить (в силу параметра для поляauto_increment) числовое значение, на единицу большее, чем максимальное из существующих значений для этого поля в таблице. В-третьих, некоторые поля мы "занулили" - потом заполним. И в-четвертых, этот запрос к sql-серверу отличается от стандарта! Дело в том, что (как я уже говорил) mysql имеет некоторые отличия от sql-стандарта. В частности, insert допускает такую сокращенную форму записи. По правилам я бы должен был бы вместо одного insert-а с перечисленными через запятую группами значений в values использовать два запроса. Но мы облегчили себе жизнь. Вообще-то это, на мой взгляд, не лучшая практика - использовать всякие "отклонения от нормы". По крайней мере страдает переносимость. Но нас сейчас эта тема вряд ли должна волновать.
Теперь напишем скрипт для нашей первой страницы. HTML-код пока использован по минимуму. Кстати, чуть не забыл. Если вы используете (готовитесь использовать Wink PHP3, то в php3.ini в виндючем каталоге раскомментируйте строчку

extension=php3_mysql.dll


Для PHP4 (его ini-файл кличут php.ini) ничего делать не надо, т.к. поддержка mysql в 4-й версии встроенная.
И еще замечание: PHP3 и PHP4 можно использовать на одном компьютере вместе. У меня в apache файлы с расширением php3 обрабатывает 3-я версия, аphp4 и phtml - 4-я.
Вот фрагмент из httpd.conf:



  Options ExecCGI



ScriptAlias "/__php4_dir__/" "C:/usr/local/php4/"

Action application/x-httpd-php4 "/__php4_dir__/php.exe"



  Options ExecCGI



ScriptAlias "/__php3_dir__/" "C:/usr/local/php3/"

Action application/x-httpd-php3 "/__php3_dir__/php.exe"


А вот фрагмент файла mime.types:

application/x-httpd-php3 phtml php3

application/x-httpd-php4 php4


А теперь обещанный скрипт:






$db_name="books"; //база данных

$table="books"; //таблица

$host="localhost"; //хост

$user=""; //логин

$pass=""; //password

//законнектимся - получаем link-идентификатор или вывод номера и текста ошибки

//с последующим прерыванием работы скрипта (die())

$link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link));

//выбираем базу данных BOOKS, созданную нами ранее

$db=mysql_select_db($db_name,$link) or die(mysql_errno($link).mysql_error($link));

//выберем данные

$result=mysql_query("SELECT * FROM ".$table, $link) or die(mysql_errno($link).mysql_error($link));

//сформируем заголовок таблицы результатов выборки

$th=explode("#","ID#Автор#Название книги#Серия#Ред.#Год#ISBN#Стр.#Когда#Цена#Статус");

echo "";

//выведем результаты в HTML-документ

while($data=mysql_fetch_row($result)) {

echo "";

}

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

mysql_free_result($result);

mysql_close($link);

?>

",implode("",$th),"
", implode("",$data), "

  


Некоторые комментарии (более подробно в следующих шагах).
Во-первых, даже в такой упрощенной форме код работы с mysql избыточен. Т.к. мы работает с одной базой, да еще и делаем единственный запрос, то вместоmysql_connect()mysql_select_db() и mysql_query() достаточно было вызвать mysql_db_query(). Эта функция при необходимости выполнит коннекцию (в прочем, в этом она не одинока), выберет базу данных и выполнит запрос к базе.
Во-вторых,
mysql_close() тоже необязательна, т.к. соединение с сервером будет автоматически закрыто при окончании скрипта.
В-третьих, и уж конечно же в данном случае во mysql_free_result() никакой необходимости. Освобождать память при единственном запросе да еще такого незначительного объема... Здесь эта функция вызвана скорее для демонстрации возможных операций с mysql на php, ну или, если хотите, для порядка. Wink
В-четвертых, функции implode() и explode() относятся к стринговым. Этой теме будет посвящен отдельный шаг (шаги). А пока: explode() создает массив из фрагментов строки, разбирая ее как строку с разделителем, указанном в первом параметре. Implode() делает обратную операцию. Эту пару я применил для удобства - по-моему это проще, чем набирать строку в виде "...тексттекст..." и уж тем более проще, чем делать кучу echo с текстами, обрамленными тегами /.
И в-пятых, сие чудо программистской мысли Wink выполняется как под 4-й версией php4, так и под 3-ей.


Краткий справочник по MySQL. Типы данных.
Прежде чем продолжать разрабатывать наше творение я приведу краткую справку по MySQL, а точнее, коротко опишу типы данных mysql, функции и особенности sql-запросов. Сам sql, я думаю, Вы знаете (если это не так - то к вашим услугам соответствующий раздел про SQL на "Первых шагах"! Wink
Я не буду описывать подробно все изобилие типов MySQL. Я уверен, что это лишнее. Дело в том, что в mysql-е числовые и текстовые группы типов очень многочисленны. Отличаются типы в этих группах размером в байтах и возможными модификаторами. Подробности можно посмотреть в мануале в директорииDocs каталога с mysql-ем в разделе "7.3 Column types". Там и английский знать особо не нужно - смотрите на название и цифры длины! Wink
Здесь я сделаю обзор самих групп типов данных - для быстрого введение.
MySQL поддерживает следующие типы/группы типов данных:



  1. Числовые. Возможные модификаторы: UNSIGNED для объявления беззнаковости, ZEROFILL для заполнения лидирующих пробелов нулями (имеется в виду внешний вид при выводе). Могут быть созданы как целые (TINYINTSMALLINTINTBIGINT и пр.), так и числа с плавающей точкой (FLOAT,DOUBLEREAL и пр.).

  2. Строковые. Возможные модификаторы: BINARY для объявления поля как бинарного (любые коды хранимых символов), NATIONAL - модификатор по умолчанию, - использование набора символов для сортировки, сравнения и пр. Занятный модификатор. Отвечает за конструкцию SET-группы: SET CHARACTER SET character_set_name | DEFAULT, где character_set_name может принимать значение cp1251_koi8. Однако эти установки выставлены по умолчанию. Выходит, без модификатора результат тот же, что и с ним. Я так понял, что эти фишки для будущего использования. Модификатор для типаCHAR VARYING создает строковое поле переменной длины.

  3. BLOB-поля - поля для хранения двоичных данных.

Типы данных, не попавшие в предыдущие три группы:



  1. TIMESTAMP - поле хранит дату и время последнего изменения записи. Это значит, что, добавив в таблицу поле типа TIMESTAMP (например, воспользовавшись конструкцией ALTER TABLE table_name ADD COLUMN column_name TIMESTAMP), Вы, не производя никаких изменений поля типаTIMESTAMP, будете в нем иметь время последней операции с записью, влияющей на содержимое строки таблицы.

  2. DATETIMEDATETIME - поля хранения даты, времени, и того, и другого. Тут, я думаю все ясно.

  3. YEAR - поле, добавленное в версии 3.22, - для хранения года в интервале с 1901 по 2155.

  4. ENUM - поле, хранящее одно из значений, указанных в списке при создании (модификации структуры)
    таблицы, например, ALTER TABLE tab_name ADD COLUMN col_enum ENUM(\'Ага\', \'Угу\', \'Ну его нафиг\').
    Теперь поместить в поле col_enum одно из перечисленных значений можно так:

    INSERT INTO tab_name SET col_enum=\'Ага\'

    или

    UPDATE tab_name SET col_enum=3.


    В последнем случае в col_enum будет значение \'Ну его нафиг\'. Присвоение полю значения не из списка (например, col_enum=7 илиcol_enum=\'format c:\') запишет в поле пустую строку (даже не \'NULL\').

  5. тип SET в отличии от типа ENUM предназначен для хранения списка значений, например,

    ALTER TABLE tab_name ADD COLUMN col_set SET (\'один\',\'два\',\'три\',\'четыре\')


    Теперь изменим значение поля:

    UPDATE tab_name SET col_set=\'один\' WHERE поле=значение


    После такого запроса col_set будет содержать значение \'один\'.

    UPDATE tab_name SET col_set=15


    Здесь col_set содержит значение \'один,два,три,четыре\'. Да, именно строку с set-значениями, разделенными запятыми. Цифра 15 - это двоичное 1111. Каждый бит отвечает за свое значение в списке. Например: 1 - \'del\', 10 - \'file1.txt\', 11 - \'del,file1.txt\' и т.д. Как и в случае с ENUM установка недопустимого значения записывает в поле пустую строку.



Функции работы с MySQL.
В предыдущем шаге я обещал дать краткий справочник по функциям MySQL.
Однако сейчас я пришел к выводу, что лучше все же поступить немного по-другому. По SQL на "Первых шагах" есть специальный раздел. Так что я сосредоточусь на функциях PHP.
В "Подробностях" приведен список некоторых операторов и функций MySQL в основном из числа отличных от SQL-стандарта.
Вернемся к скрипту 10-го шага и рассмотрим его подробнее.
Во-первых, в скрипте постоянно используется функция DIE() с параметром
"mysql_errno($link).mysql_error($link)". Функция DIE(текст) выводит текст в выходной поток (в HTML-код) и прерывает дальнейшее выполнение скрипта. В данном случае текст для DIE() формируется двумя функциями из группы mysql-функций: MYSQL_ERRNO() - код ошибки и MYSQL_ERROR() - текст ошибки.
Оператор PHP "точка" конкатенирует строки. Необязательный параметр (здесь переменная $link) - идентификатор, возвращаемый функцией MYSQL_CONNECT()после соединения с сервером. (Об этом чуть ниже). Текст же ошибки, возвращаемый функцией MYSQL_ERROR(), выбирается из файлов, расположенных в подкаталоге "share" директории, в которой установлен MySQL.
Управлять выбором языка сообщений можно с помощью параметра language в my.ini, расположенном (напомню) в каталоге winnt (или в том, где у Вас живет виндюк). Вот строка из моего ini-файла:

language=d:/usr/local/mysql/share/russian


В этих файлах все сообщения на русском языке в кодировке KOI-8, поэтому учитывайте это.
Разобравшись с DIE() и функциями-формирователями строки для нее, пройдем весь скрипт 10-го шага по порядку. Секция PHP в файле открыта, как всегда, тегом ". Далее объявляются переменные для работы с функциями MySQL (забегая вперед, замечу, что лучше такие переменные выносить в отдельные файлы и включать в скрипты, скажем, функцией REQUIRE() или INCLUDE()).
Перед началом работы с MySQL выполняем соединение с сервером:

    $link=MYSQL_CONNECT($host,$user,$pass).


Здесь одно замечание. К $host может быть приписан через двоеточие номер tcp-порта, который слушает сервер в надежде, что кто-нибудь его позовет. По умолчанию порт 3306. Изменяется это значение опять же в my.ini. Кстати, напомню, что для актуализации изменений ini-файла надо перестартовать серверMySQL (т.е. службу, если речь идет об NT).
Есть еще одна функция, предназначенная для установки соединения с сервером - MYSQL_PCONNECT(). Эта функция в отличии от предыдущей обеспечивает так называемый устойчивый коннект к базе, т.е. соединение, которое не разрывается после завершения выполнения скрипта. Речь идет о следующем. После окончания работы текущего скрипта все открытые соединения с базами закрываются автоматически (если Вы явно не вызвали функцию MYSQL_CLOSE($[link])). Соединения, полученные с помощью функции устойчивого коннекта, не только сохраняются (повторные вызовы MYSQL_PCONNECT() просто возвращают $linkуже установленного соединения), но и прямой вызов MYSQL_CLOSE() соединения не разрывает. Здесь надо отметить следующее. Во-первых, по сообщениям в конференциях по PHP время, затрачиваемое на соединение с сервером MySQL, весьма незначительно (в отличие, скажем, от Oracle, у которого процесс коннекта достаточно ресурсоемок), чтобы к его экономии относиться столь серьезно. Я это утверждение не проверял, но склонен с ним согласиться. Наверное, так и есть, учитывая объем работы, проводимой сервером для установления соединения (обслуживание запросов с tcp-порта, проверка полномочий, выделение памяти под данные соединения и пр.). Во-вторых, я так и не понял, как же разрывать pconnect-соединение. Узнаю - опишу.
Следующая (и последняя из рассматриваемых в этом шаге) функция - MYSQL_SELECT_DB(). Она имеет два параметра: первый - имя базы, и второй (необязательный) - id соединения ($link). Под необязательностью идентификатора соединения как параметра понимается следующее. Если параметр не указан, то используется последнее открытое соединение. А если ни одно соединение не открыто, то неявно выполняется connect (т.е. при использовании одного соединения MYSQL_CONNECT() явно вызывать не обязательно).
Следующий шаг будет полностью посвящен выборке данных из базы. До следующего шага!
P.S. В фидошной конференции по php я увидел чудную ссылку: http://php.weblogs.com/adodb. Речь идет о классе-оболочке для работы с разными sql-серверами на PHP (некий аналог DBI в Perl). Правда, я сей класс еще не тестировал. Попробую - опишу. А так выглядит очень интересно - набор методов, одинаковый для множества sql-серверов. Только строку инициализации библиотеки меняй под конкретный sql-сервер - и вперед!


Функции работы с MySQL. Часть 2.
Продолжим рассмотрение скрипта 10-го шага. Все внимание функциям выборки данных.
В предыдущем шаге мы законнектились к mysql-серверу и выбрали базу. Теперь формируем запрос к базе. Для этой цели используется функцияMYSQL_QUERY() или MYSQL_DB_QUERY(). Разница между ними, как Вы, наверное, уже догадываетесь, заключается в том, что первая из них предполагает, что база данных уже выбрана а вторая наряду с выполнением запроса осуществляет выбор базы.
Параметры: MYSQL_QUERY(строка запроса [, $link]), где $link - идентификатор коннекта, возвращаемого функцией MYSQL_CONNECT();MYSQL_DB_QUERY(база данных, строка запроса [, $link])). Как обычно, если не указан $link, то используется последнее выполненное соединение. Обе функции выполняют соединение с mysql-сервером (MYSQL_CONNECT()), если ранее не выполнено такое соединение. При этом неявный вызовMYSQL_CONNECT() осуществляется без параметров, используя в качестве имени хоста "localhost", а в качестве имени пользователя и пароля - пустые  строки. И обе функции возвращают переменную (идентификатор ресурса), которую потом нужно использовать при обработке запроса (см. ниже). Например,

mysql_select_db("books");

$result = mysql_query("select * from books");


или

$result = mysql_db_query("books","select * from books");


Теперь самое интересное - обработка запроса. Эта операция осуществляется с помощью fetch-группы функций PHPMYSQL_FETCH_ARRAY(),MYSQL_FETCH_FIELD()MYSQL_FETCH_LENGTHS()MYSQL_FETCH_OBJECT() и MYSQL_FETCH_ROW(), а также некоторыми дополнительными функциями (функций управления fetch-курсором, информационными функциями и пр.). Эти функции возвращают очередную строку выборки в виде массива или объекта, перемещая внутренний указатель на следующую строку. Поэтому их следует использовать в циклах.
Сразу небольшое замечание. Среди mysql-функций в PHP есть MYSQL_RESULT(). Она возвращает значение одного столбца в указанной строке. В мануале рекомендуют вместо нее использовать более быстрые функции fetch-группы. Кроме того, по моему мнению, эта функция самая неудобная для работы с выбранными данными. Посему эту функцию я рассматривать не буду.
В 10-м шаге мы использовали функцию MYSQL_FETCH_ROW(). С нее и начнем. Итак, в результате выполнения одной из двух query-функций мы имеем указатель на ресурс выборки. Пусть сей указатель хранится в переменной $result. Тогда в таком цикле



while ($data=mysql_fetch_row($result)) {

    echo implode(" | ",$data), "
";

}


можно вывести результаты запроса. Эта функция возвращает массив (здесь $data), в котором каждый элемент - поле строки выборки, возвращаемое select-ом в query-функции. Функция из string-группы IMPLODE() вернет строку, состоящую из элементов массива, указанного во втором параметре, разделенных разделителем - первым параметром.
Теперь попробуем повторить вывод результатов запроса дважды (пример, конечно, надуманный, но на практике иногда требуется пройтись по результатам запроса более одного раза):



    echo "Первый раз";

    while ($data=mysql_fetch_row($result)) {

        echo implode(" | ",$data), "
";

    }

    echo "Второй раз";

    while ($data=mysql_fetch_row($result)) {

        echo implode(" | ",$data), "
";

    }


После строки "Второй раз" мы ничего не увидим. Причина в том, что при каждом вызове fetch-функции внутренний указатель (курсор) автоматически переходит к следующей записи. Как только этот указатель доберется до конца выборки, fetch-функция вернет FALSE, и произойдет выход из цикла. Управлять указателем можно с помощью функции MYSQL_DATA_SEEK(). Параметры: id результата и номер строки, на которую надо установить указатель. Отсчет строк начинается с нуля. В последнем примере перед вторым циклом нужно было бы сказать

mysql_data_seek($result, 0);





Функции работы с MySQL. Часть 3.

http://igorb962007.ya.ru/

Вернуться к началу  Сообщение [Страница 1 из 1]

Права доступа к этому форуму:
Вы не можете отвечать на сообщения