Два замечания в начале:
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:
<Directory "C:/usr/local/php4"> Options ExecCGI </Directory> ScriptAlias "/__php4_dir__/" "C:/usr/local/php4/" Action application/x-httpd-php4 "/__php4_dir__/php.exe" <Directory "C:/usr/local/php3"> Options ExecCGI </Directory> 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
А теперь обещанный скрипт:
<html><body> <table border=1> <?php $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 "<tr><th>",implode("</th><th>",$th),"</th></tr>"; //выведем результаты в HTML-документ while($data=mysql_fetch_row($result)) { echo "<tr><td>", implode("</td><td>",$data), "</td></tr>"; } //освободить выделенную под результат выборки память mysql_free_result($result); mysql_close($link); ?> </table> </body></html>
Некоторые комментарии (более подробно в следующих шагах).
Во-первых, даже в такой упрощенной форме код работы с mysql избыточен. Т.к. мы работает с одной базой, да еще и делаем единственный запрос, то вместо mysql_connect(), mysql_select_db() и mysql_query() достаточно было вызвать mysql_db_query(). Эта функция при необходимости выполнит коннекцию (в прочем, в этом она не одинока), выберет базу данных и выполнит запрос к базе.
Во-вторых, mysql_close() тоже необязательна, т.к. соединение с сервером будет автоматически закрыто при окончании скрипта.
В-третьих, и уж конечно же в данном случае во mysql_free_result() никакой необходимости. Освобождать память при единственном запросе да еще такого незначительного объема... Здесь эта функция вызвана скорее для демонстрации возможных операций с mysql на php, ну или, если хотите, для порядка. ;)
В-четвертых, функции implode() и explode() относятся к стринговым. Этой теме будет посвящен отдельный шаг (шаги). А пока: explode() создает массив из фрагментов строки, разбирая ее как строку с разделителем, указанном в первом параметре. Implode() делает обратную операцию. Эту пару я применил для удобства - по-моему это проще, чем набирать строку в виде "...текст</th><th>текст..." и уж тем более проще, чем делать кучу echo с текстами, обрамленными тегами <th>/</th>.
И в-пятых, сие чудо программистской мысли ;) выполняется как под 4-й версией php4, так и под 3-ей.
Далее в программе: подробное описание функций работы с mysql, форма для ввода записей, чтение (импорт) данных из файла и запись (экспорт) в файл, index.php3.