Заканчиваем обзор.
Однако, продолжим рассмотрение (вернее, беглый обзор - что называется, голопом по европам) функций PHP.
- Функции доступа к dbm-базам.
- Функции даты и времени: получить, проверить правильность, вывести в формате.
- Dbase-функции. Ну тут стандартный dbase-, clipper-, и_иже_с_ними-набор: открыть/закрыть, читать/писать/заменять/добавлять/удалять записи, получить количества колонок и записей в таблице.
- Функции для работы с директориями: открыть/закрыть, читать, сменить каталог.
- Так называемые dl-функции (вернее, одна единственная функция) - динамическая загрузка PHP-библиотеки в рунтайме. Статическая загрузка предполагает наличие в ini-файле PHP указания на загружаемые модули (разделы "extension" - сами модули, - и "extension_dir" - где эти модули искать).
- Работа с DOM-объектами для XML-документов (для PHP 4-ой версии).
- Один из самых многочисленных разделов - группа функций работы с файловой системой. С этой группой мы еще не раз столкнемся. Я думаю, этой группе следует посвятить отдельный шаг.
- FTP-функции поддерживают весь стандартный набор команд ftp-протокола.
- Чрезвычайно ценные HTTP-функции (их всего 3) позволяют управлять HTTP-заголовком. Вот пример, в котором без функции header() вообще нельзя обойтись. Вы формируете картинку PHP-кодом (до image-функций мы еще доберемся). Если не сказать перед передачей картинки браузеруheader("Content-type: image/gif"), то в заголовке HTTP-запроса будет утверждаться, что пришедший от сервера файл имеет тип text/html.
- Image-функции позволяют создавать PNG- и Jpeg-файлы "налету" (поддержка gif-формата с 4-ой версии PHP прекращена в связи с проблемой лицензирования; впрочем, существуют сборки php_gd.dll с поддержкой gif-ов), рисовать графические примитивы, выводить в картинке текст и читать существующие картинки.
- IMAP-функции позволяют работать с imap-ящиками (чтение, проверка, посылка письма, работа с заголовками писем, с почтовыми ящиками, ping-и, mail-адреса, всякие там en-/decode, base64 и прочее).
- Математические функции (а как же без них!)
- Функции шифрования и хеш-функции (список поддерживаемых алгоритмов занимает 2 строки).
- Что называется, минеслаус-функции: проверка коннекта, define-функции, eval (выполнение строки как скрипта), работа с аргументами функций (4-я версия), сериализация, sleep и пр.
- MySQL-функции. Им будут посвящены несколько шагов.
- Сетевые функции: NDS, ip-адреса, связь номера и имени сетевого протокола и пр.
- ODBC-функции
- Очень полезная группа функций, возвращающих информацию о состоянии и настройках PHP-интерпретатора, записывающих сообщения в log-файлы, читающих окружения интерпретатора. Самая эффектная - phpinfo() . Откройте в браузере файл http://localhost/info.php3, содержащий такой текст:
Увидите чудо! - Четыре функции для запуска внешних программ. Вернее три, четвертая (escapeshellcmd) предназначена для экранирования символов "<", ">", "|" и некоторых других. Дело в том, что вызов внешней программы из скрипта - потенциально опасное действие. Не проверив содержимое строки, передаваемой в качестве параметра таким функциям, как eval(), можно создать потенциальную брешь для злоумышленников. Посмотрите, что выведет на экран такая конструкция: echo escapeshellcmd("echo y| format c:").
- Само собой, что в PHP есть функции работы с регулярными выражениями.
- В 4-ой версии появилась возможность работать с сессиями (в 3-ей для этих целей нужно писать эмулирующий сессии код). Сессиями мы займемся, когда будем разрабатывать систему регистраций в наших будущих проектах.
- Огромный список функций работы со строками (включая функцию для конвертации кириллицы в разные кодировки! - наверное, изобилием кодировок мы уже весь мир достали .
- Семь функций работы с URL: base64, разбор URL-строки на части (хост, порт, путь и т.д.), а также кодировка строки с заменой неанглийских символов и пробелов 16-ричными цифрами с лидирующим "%" и обратно (очень помогает при работе с файлами, имеющими русские буквы в названии).
- Функции проверки PHP-переменных на инициализированность (ух какое словечко получилось! , принадлежность определенному типу (число, строка и пр.) и т.п.
- 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 file" mysqld-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-код пока использован по минимуму. Кстати, чуть не забыл. Если вы используете (готовитесь использовать 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
А теперь обещанный скрипт:
",implode(" | ",$th)," |
---|---|
", implode(" | ",$data), " |
Некоторые комментарии (более подробно в следующих шагах).
Во-первых, даже в такой упрощенной форме код работы с mysql избыточен. Т.к. мы работает с одной базой, да еще и делаем единственный запрос, то вместоmysql_connect(), mysql_select_db() и mysql_query() достаточно было вызвать mysql_db_query(). Эта функция при необходимости выполнит коннекцию (в прочем, в этом она не одинока), выберет базу данных и выполнит запрос к базе.
Во-вторых,
mysql_close() тоже необязательна, т.к. соединение с сервером будет автоматически закрыто при окончании скрипта.
В-третьих, и уж конечно же в данном случае во mysql_free_result() никакой необходимости. Освобождать память при единственном запросе да еще такого незначительного объема... Здесь эта функция вызвана скорее для демонстрации возможных операций с mysql на php, ну или, если хотите, для порядка.
В-четвертых, функции implode() и explode() относятся к стринговым. Этой теме будет посвящен отдельный шаг (шаги). А пока: explode() создает массив из фрагментов строки, разбирая ее как строку с разделителем, указанном в первом параметре. Implode() делает обратную операцию. Эту пару я применил для удобства - по-моему это проще, чем набирать строку в виде "...текст
И в-пятых, сие чудо программистской мысли выполняется как под 4-й версией php4, так и под 3-ей.
Краткий справочник по MySQL. Типы данных.
Прежде чем продолжать разрабатывать наше творение я приведу краткую справку по MySQL, а точнее, коротко опишу типы данных mysql, функции и особенности sql-запросов. Сам sql, я думаю, Вы знаете (если это не так - то к вашим услугам соответствующий раздел про SQL на "Первых шагах"!
Я не буду описывать подробно все изобилие типов MySQL. Я уверен, что это лишнее. Дело в том, что в mysql-е числовые и текстовые группы типов очень многочисленны. Отличаются типы в этих группах размером в байтах и возможными модификаторами. Подробности можно посмотреть в мануале в директорииDocs каталога с mysql-ем в разделе "7.3 Column types". Там и английский знать особо не нужно - смотрите на название и цифры длины!
Здесь я сделаю обзор самих групп типов данных - для быстрого введение.
MySQL поддерживает следующие типы/группы типов данных:
- Числовые. Возможные модификаторы: UNSIGNED для объявления беззнаковости, ZEROFILL для заполнения лидирующих пробелов нулями (имеется в виду внешний вид при выводе). Могут быть созданы как целые (TINYINT, SMALLINT, INT, BIGINT и пр.), так и числа с плавающей точкой (FLOAT,DOUBLE, REAL и пр.).
- Строковые. Возможные модификаторы: BINARY для объявления поля как бинарного (любые коды хранимых символов), NATIONAL - модификатор по умолчанию, - использование набора символов для сортировки, сравнения и пр. Занятный модификатор. Отвечает за конструкцию SET-группы: SET CHARACTER SET character_set_name | DEFAULT, где character_set_name может принимать значение cp1251_koi8. Однако эти установки выставлены по умолчанию. Выходит, без модификатора результат тот же, что и с ним. Я так понял, что эти фишки для будущего использования. Модификатор для типаCHAR VARYING создает строковое поле переменной длины.
- BLOB-поля - поля для хранения двоичных данных.
- TIMESTAMP - поле хранит дату и время последнего изменения записи. Это значит, что, добавив в таблицу поле типа TIMESTAMP (например, воспользовавшись конструкцией ALTER TABLE table_name ADD COLUMN column_name TIMESTAMP), Вы, не производя никаких изменений поля типаTIMESTAMP, будете в нем иметь время последней операции с записью, влияющей на содержимое строки таблицы.
- DATE, TIME, DATETIME - поля хранения даты, времени, и того, и другого. Тут, я думаю все ясно.
- YEAR - поле, добавленное в версии 3.22, - для хранения года в интервале с 1901 по 2155.
- 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\'). - тип 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-группы функций PHP: MYSQL_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.
Песочница Увлечённых Самоделкиных в редакции Гарика » Всё про Компьютер » Немного Теории » PHP-step and steps » РНР-шаг за шагом, глава3
Похожие темы
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
Вход
Партнеры
Май 2024
Единомышленники, вперед!
Единомышленники, вперед!Форум для планирования, обсуждения и отчетов при создании бизнеса в интернет. http://forward.forum2x2.ru/search?search_id=egosearch ******************************************************
=+=Единомышленники, вперед! Форум для планирования, обсуждения и отчетов при создании бизнеса в интернет.Мудрый человек сказал однажды: "Три вещи никогда не возвращаются обратно: время, слово, возможность" "Три вещи не следует терять: спокойствие, надежду, честь" "Три вещи в жизни наиболее ценны: любовь, убеждение, доверие" "Три вещи в жизни ненадежны: власть, удача, состояние" "Три вещи определяет человека: труд, честность, достижения" "Три вещи разрушают человека: вино, гордыня, злость" "Три вещи труднее всего сказать: Я люблю тебя, прости, помоги мне"
g неувядаемый цвет икона Казанской Божьей матери святитель СпиридонНиколай ЧудотворецСвятой великомученик и целитель Пантелеймон????Во имя матери Земли
На труд меня благослови!
Позволь служить душою светлой
Не требуя любви ответной
Ты мой водитель, Свете ясный!
Мы Землю сделаем прекрасной!
Окрепнет наш союз, я верю в сердце
С ног сброшу груз и будем вместе
Идти по жизни непростой
Сияя первозданной чистотой.
Прими мою любовь, Неизреченный
свети святым сердцам, Благословенный!
Слова упали каплей золотой
Пролился свет из чаши огневой.
Идущих к свету в единеньи
Ты нареки "Священной простотой"
Открой бутоны лепестки, Любовь святую призови.
Быть верным спутником твоим по жизни утверди
Единый Боже, нас прости!..
лучами света освети во мгле томящиеся души
Желаем Зов небес услышать
И внять ему без размышлений
Избавь нас, Отче, от сомнений.
Войду в поток. Омоюсь Светом.
Не буду долго ждать ответа с Вездесущего.
Быть может, сердцу было плохо слышно?
Дай , Отче, Дар распознавать всегда
Из мира света доносящиеся голоса.
Единый сущий, научи с тобою рядом быть
И сердцем пламенным Вселенные творить.
Избавь меня от ложных голосов, Единый Сущий!
Пошли звучание Твоих прекрасных слов.
Узор из света сердцем распознаю
Внесу в него жемчужину одну
Звезды своей луч обниму
И вместе с ним перед тобой предстану
Благослови меня на путь Златой!
Воскресну к жизни новой, Тобой ведомый.
Воспряну ото сна, сковавшего меня .
Прошу Тебя, Благослави
Ступившего на путь Любви!&
&Моя Леночка проходит полосу препятствий на байке...&&&&& V kurkiiokki-& My Lenohka& and Fish& my Lenochka&garik-&перед рыбалкой&наши змеюшечки ( ужики)-&КАРАСЬ
- | CWER.WS | ФайлообмнеН | Как удалить вирусы с помощью AVZ | MapViewGPS 2.52 | Хелп-Ком | Я.ру | Сайт + магазин | Мой MediaFire | FREE_SOFT | ГИМС МЧС РФ | Мир Тесен | Цветовые коды HTML | Коды мобильных операторов. Коды стран и городов. | 4pda | PHP Manual | Мир Мастеров | БИБЛИОТЕКА ОККУЛЬТНОЙ И ТЕОСОФИЧЕСКОЙ ЛИТЕРАТУРЫ | | Комп-схема | Песочница от Sandboxie | BestFREE.RU | MEGA | МИР ДРУЗЕЙ | Сайт-ПАЯЛЬНИК "cxem.net" | Мир в Мэйле | My Joomla-shablon | (P2P)-ПЕРЕСЫЛКА ФАЙЛОВ | Трава | ЮНЫЕ СПАСАТЕЛИ | Установка и настройка программ | Любимый интернет | MID-US | Ключи Мастерства | АНТИВИРУС,ФАЙЕРВОЛ бесплатно | МИР РЕЙКИ. Путь в тысячу миль начинается с первого | Radmin 3 | CWER.WS1