|
<html>
<head>
<title>PHP. Шаг за шагом.</title>
<meta content="text/html; charset=Windows-1251" http-equiv=Content-Type>
</head>
<body text=black bgcolor=white link=blue vlink=blue alink=red>
<font color=red><h2 align=center>Шаг 10. Заглянем в базу. Первый скрипт.</h2></font>
<p>Два замечания в начале:
<p>1) В предыдущем шаге я допустил досадную оплошность. Для установки <b>MySQL</b> как службы под <b>Windows NT</b> кроме создания <b>my.ini</b> файла <b>winmysqladmin</b>-ом надо, конечно же, выполнить саму установку сервера как службы вот так:
<pre>
C:\mysql\bin\mysqld-nt --install
</pre>
Приношу свои извинения за допущенную ошибку.
<p>2) После опубликования предыдущих трех шагов мне пришло письмо от Michael Vladimirov (спасибо, Michael !) - сайт "How IT works" <a href=http://it.sinor.ru/>http://it.sinor.ru/</a>, - по поводу проблемы с установкой <b>PHP</b> как модуля <b>Apache</b>. Michael пишет, что <b>PHP</b> не становится как модуль при включенной библиотеке <b>GD</b.. :-((( После комментирования строчки "<b>extension=php_gd.dll</b>" в <b>php.ini</b> веб-сервер <b>Apache</b> действительно запустился. К этой теме я еще вернусь, когда выясню некоторые пока для меня неясные моменты.
<p>Итак, база (и первая таблица в ней) созданы.
<p>Напишем скрипт, который будет формировать <b>html</b>-страницу с содержимым таблицы. Но сначала таблицу надо заполнить содержимым. Так как форма ввода у нас еще не создана, то воспользуемся методом из предыдущего шага - создадим <b>sql</b>-запрос на добавление записи в таблицу и направим его (файл с запросом) на вход <b>mysql.exe</b>.
<p>Вот этот скрипт:
<pre>
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);
</pre>
Несколько замечаний по этому запросу. Во-первых, я не сказал "<b>commit</b>". В данном случае это не обязательно, т.к. <b>commit</b> произойдет по окончанию скрипта автоматически. Во-вторых, в качестве значения для ключевого поля <b>id</b> выбрано значение <b>null</b>, что заставляет <b>mysql</b> присвоить (в силу параметра для поля <b>auto_increment</b>) числовое значение, на единицу большее, чем максимальное из существующих значений для этого поля в таблице. В-третьих, некоторые поля мы "занулили" - потом заполним. И в-четвертых, этот запрос к <b>sql</b>-серверу отличается от стандарта! Дело в том, что (как я уже говорил) <b>mysql</b> имеет некоторые отличия от <b>sql</b>-стандарта. В частности, <b>insert</b> допускает такую сокращенную форму записи. По правилам я бы должен был бы вместо одного insert-а с перечисленными через запятую группами значений в <b>values</b> использовать два запроса. Но мы облегчили себе жизнь. Вообще-то это, на мой взгляд, не лучшая практика - использовать всякие "отклонения от нормы". По крайней мере страдает переносимость. Но нас сейчас эта тема вряд ли должна волновать.
<p>Теперь напишем скрипт для нашей первой страницы. <b>HTML</b>-код пока использован по минимуму. Кстати, чуть не забыл. Если вы используете (готовитесь использовать ;) <b>PHP3</b>, то в <b>php3.ini</b> в виндючем каталоге раскомментируйте строчку
<pre>
extension=php3_mysql.dll
</pre>
Для <b>PHP4</b> (его <b>ini</b>-файл кличут <b>php.ini</b>) ничего делать не надо, т.к. поддержка <b>mysql</b> в 4-й версии встроенная.
<p>И еще замечание: <b>PHP3</b> и <b>PHP4</b> можно использовать на одном компьютере вместе. У меня в <b>apache</b> файлы с расширением <b>php3</b> обрабатывает 3-я версия, а <b>php4</b> и <b>phtml</b> - 4-я.
<p>Вот фрагмент из <b>httpd.conf</b>:
<pre>
<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"
</pre>
А вот фрагмент файла <b>mime.types</b>:
<pre>
application/x-httpd-php3 phtml php3
application/x-httpd-php4 php4
</pre>
А теперь обещанный скрипт:
<pre>
<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>
</pre>
Некоторые комментарии (более подробно в следующих шагах).
<p>Во-первых, даже в такой упрощенной форме код работы с <b>mysql</b> избыточен. Т.к. мы работает с одной базой, да еще и делаем единственный запрос, то вместо <b>mysql_connect()</b>, <b>mysql_select_db()</b> и <b>mysql_query()</b> достаточно было вызвать <b>mysql_db_query()</b>. Эта функция при необходимости выполнит коннекцию (в прочем, в этом она не одинока), выберет базу данных и выполнит запрос к базе.
<p>Во-вторых,
<b>mysql_close()</b> тоже необязательна, т.к. соединение с сервером будет автоматически закрыто при окончании скрипта.
<p>В-третьих, и уж конечно же в данном случае во <b>mysql_free_result()</b> никакой необходимости. Освобождать память при единственном запросе да еще такого незначительного объема... Здесь эта функция вызвана скорее для демонстрации возможных операций с <b>mysql</b> на <b>php</b>, ну или, если хотите, для порядка. ;)
<p>В-четвертых, функции <b>implode()</b> и <b>explode()</b> относятся к стринговым. Этой теме будет посвящен отдельный шаг (шаги). А пока: <b>explode()</b> создает массив из фрагментов строки, разбирая ее как строку с разделителем, указанном в первом параметре. <b>Implode()</b> делает обратную операцию. Эту пару я применил для удобства - по-моему это проще, чем набирать строку в виде "...текст</th><th>текст..." и уж тем более проще, чем делать кучу <b>echo</b> с текстами, обрамленными тегами <b><th>/</th></b>.
<p>И в-пятых, сие чудо программистской мысли ;) выполняется как под 4-й версией php4, так и под 3-ей.
<p>Далее в программе: подробное описание функций работы с <b>mysql</b>, форма для ввода записей, чтение (импорт) данных из файла и запись (экспорт) в файл, <b>index.php3</b>.
<hr>
<center><font size=2><a href=php9.html>Предыдущий Шаг</a> | <a href=php11.html>Следующий Шаг</a></font></center>
<hr><center><font size=2>By <a href="mailto:kgp@nm.ru?SUBJECT=FromPHPByStep">Konstantin Platonov</a>.</center>
</body>
</html>