Ваш первый Сайт С использованием РНР-скриптов
СЧЕТЧИК ПОСЕТИТЕЛЕЙ С ИСПОЛЬЗОВАНИЕМ БАЗЫ ДАННЫХ MYSQL
Все скрипты в этой книге написаны без использования баз данных. Однако, для построения своего сайта, вы можете использовать для удобства реляционные базы данных, например MySQL. Литературы по базам данных предостаточно, и вы, при желании, можете ее изучить. В этой же книге я лишь кратко ознакомлю с базами данных и приведу пример их использования для нашего счетчика посещений.
Сначала рассмотрим основные понятия:
1. Реляционная база данных - совокупность связанных таблиц, где хранятся данные.
2. Таблица состоит из полей (field), которые имеют имя и тип. Тип поля зависит от того, какие данные в этом поле записаны. Существуют следующие типы полей: целые, вещественные, строковые, бинарные, дата и время, перечисления и множества.
3. Запись {record) - это набор полей в таблице, содержащих связанную между собой информацию. Например, если в таблице имеется 3 поля строкового типа, содержащие соответственно имя, фамилию и отчество, то совокупность содержимого этих трех полей и будет называться записью.
4. Запрос (query) - оператор, который выбирает записи и поля из одной или
Нескольких таблиц согласно заданному условию.
Для написания запросов к базам данных разработан язык SQL (структурированный язык запросов). Рассмотрим несколько операторов этого языка. Создать таблицу в базе данных можно при помощи оператора CREATE. Создадим, например, таблицу, с названием Schetchik для нашего счетчика посещений. Пусть таблица будет содержать 3 поля с именами vcego (поле будет содержать общее число посещений страницы), segodna (будет содержать число посещений за текущие сутки) и chislo (будет содержать текущую дату). Тогда создание нашей таблицы на языке SQL будет выглядеть так: CREA ТЕ TABLE Schetchik (
Vcego int NOT NULL, segodna int NOT NULL, chislo data NOT NULL, )
После имени каждого поля стоит тип поля. Первые два поля (общее число посещений и число лосещений за текущие сутки) будут содержать целочисленный тип данных, а именно, тип int, который может содержать числа в диапазоне от -2 147 483 648 до 2' 147 483 647. Думаю, что нам этого достаточно. Третье поле (текущая дата) имеет тип data и содержит дату в формате ГГГГ-ММ-ДД (год, месяц, число). Модификатор NOT NULL указывает, что поле должно быть определено, т. е. оно не может быть пустым.
Добавить данные в созданную таблицу можно при помощи оператора INSERT. Заполним первые два поля единицей, а в третье поле впишем текущую дату:
INSERT INTO Shetchik
VALUES (1,1, TO DA TE(15/09/08, 'YY/MM/DD'));
В списке VALUES перечисляются значения полей таблицы. Дату в третье поле записываем в формате год/месяц/число.
Если мы хотим изменить запись в таблице, то нужно использовать оператор UPDATE. Синтаксис этого оператора выглядит так: UPDA ТЕ Имя таблицы SET Поле 1 =значеиие1, 11оле2=3начение2... WHERE Условие;
После SET пишется имя поля и присваиваемое ему значение (через знак равенства). Условие WHERE - какое значение того или иного поля изменить. В нашем простом случае в каждом поле по одному значению, поэтому условие WHERE здесь не нужно. Вообще приведенные выше строчки можно записать и в одну строку:
UPDA ТЕ Имя таблицы SET Поле1 =значениеI, Поле2=3начение2... WHERE условие;
Перейдем, наконец, к практике.
Практически на любом уважающем себя хостинге клиенту предоставляется возможность создания и управления базами данных. Для создания базы данных предоставляется достаточно удобный интерфейс. Например, на хостинге, где рассположен мой сайт (majordomo. ru), можно легко создать базу данных (кнопка «Создать»). На рис. 4.3 видно, как я создал на хостинге базу данных с именем b 19147 baza.
Убавление MvSOL |
||
* |
РерсиярНР |
Создать базу данным |
Ы9147 Jbaza | 1ШШШ |
||
* |
||
Crontab |
||
Ш£ |
Данные для подключения из скриптов Perl и РНР |
|
DocumentRoot Архи^ия. СЭМТЭ |
DB host - 78.108.81.240; DB user - U19147 ; DB name - указывайте нужное название базы ; Пароль для mysql-польэователя можно поменять в форме ниже. |
|
3#ке? нчить работу |
Интерфейс для доступа к базам данных PhpMyAdmin (в новом окне ) ht; tp: //rr^il. maiordorno. rq/rny sql^dmin9 |
Рис. 4.3 |
Запомните или запишите потом данные (DB host, DB user) для подключения базы данных из скрипта РНР, который мы потом составим. Пароль создаете сами.
Вообще создать базу данных можно и используя интерфейс PhpMyAdmin, Нажав на соответствующую ссылку (рис. 4.3). Вас попросят ввести имя (DB user) пользователя (в нашем случае это ul9147) и пароль, который вы должны были создать. Только после этого вы попадете на PhpMyAdmin (рис. 4.4).
После создания базы данных нужно потом ее выбрать из ниспадающего списка слева. Затем надо создать таблицу в этой базе данных. Создадим таблицу с именем Schetchik. Количество полей сделаем, как договорились, 3 (рис. 4.5).
После создания таблицы нужно указать тип и имена полей (рис. 4.6). Пусть в первом поле у нас будет находиться число, определяющее общее число посетителей страницы сайта. Это поле с именем vcego. Тип поля зада - даем INT (целые числа). Далее задается длина числа (максимальная - 11), значение (можно ничего не ставить), значение по умолчанию поставьте 1. Аналогично для второго поля с именем segodna (там, если помните, будет храниться число посещений за текущие сутки) задайте те же значения. Третье поле с именем chislo будет содержать дату. Тип поля задаем DATE, а значением по умолчанию зададим любую дату в формате ГГГГ-ММ-ДД, например 2008-12-23.
ElMySQL-кодировка UTF-8 Unicode (utfS)
ЕЯСопоставление соединения с MySQL! Utt8_uniCOde_CI ®
Г£>Новая база данных ®
Ы9 47?inter ]: Сравнение *
| Создать |
ФПокгк-ать состояние
Й)Пох»ать системные переменные ©
^Процессы @
ИЗКодировки и сравнения
(^Хранилища
©Базы данных
#>Эксп>рт
Бдза; |
► Размер шрифта [l00% У ^Документация по phpMy^ ^Официальная страница р ► [ChangeLog] [CVS] [Lists] |
(Базы данных) Пожалуйста, выберите базу данных |
^Импсрт
ЙВыйти m системы ®
Рис. 4.4
Gl Сервер: 192.168.0.52:3306 ► © База данных: Ы9147_Ьага ШСтрухгф* SSSQL /'Искать IP Запрос по примеру Gb Экспорт IP Импорт Операции
База данных B19147_baza (0) |
В БД не обнаружено таблиц
- Щ Созда ть новр^ таблицу в БД b!9147jbaza-—
Яш ISche Chik Количество полей; 13
Ы*И7
ВБДяе обнаружено таблиц.
Рис. 4.5
(Ш Сервер: |
192.168,0.52:3306 ► iP База |
Данных: Ь19147_Ьага ► ИШ таблш |
|
Пеле Jvcego |
Тип© J - INT "Щ |
Дшшы^шчения*1 Q |
|
1 segodna |
...... J |JNT......... |
| |
|
L—J L=J li=J L_2_J L_LI ______ База данных :b19147_baza (0) "™y| |
I chislo I |
........ 1 (DATE............. v! Комментарий к таблице: |
1 Storage Engine: © |
Ь19147_Ьага (0) |
J! MylSAM v] |
||
В БД не обнаружено таблиц |
Рис. 4.6
Далее нажимаете на кнопку «Создать» (текст на кнопке может быть различным, например «Пошел» или «Вперед»). Все, поля созданы (рис. 4.7).
Нишщ |
FllOSsop Й? Структура «В SQL /-Искать Вставить ®Экспорт ©Импорт J^Qnepau |
Таблица Schetchik была создана |
|
Feasa данных ;b19M7^taza(iy Ь19147_Ьа»(1) Щ) Schetchik |
CREATE TABLE 'SchsiclaK < NOTNULL 's « di NOTNULL, ih NOTNULL ) ENGINE - MY1SAM, |
Коле Тип Сравнение Атрибуты Ноль По умолчанию Дополнительно □ vcego mt(l 1) Нет ПИ J? □ segodaa Ю*(И) ПВ J1 П chisln date Нет ПИ J T Отметить все / Снять отметку со всех С отмеченными: ЕЕ Jf X 2S Е Ш |
|
Версия для печати tP& Предлагаемая структура таблицы ® ^ Добавить ;1 | поле(я) 0В конец таблицы ОВ начало таблицы ОПосле vcego v' | Пошел | |
Рис. 4.7 |
После того, как поля созданы, можно выходить из интерфейса PhpMyAdmin. На других хостингах интерфейс для создания и управления баз данных может быть другим. Если вы не сможете самостоятельно создать на хостинге (где будет находиться создаваемый вами сайт) базу данных и таблицу, то попросите помощи по E-mail у хостера. На любом хостинге есть возможность написать письмо с вопросом в службу технической поддержки.
Итак, база и таблица в базе созданы. Напишем теперь скрипт счетчика, используя созданную нами базу данных. t
Подключиться к серверу баз данных в PHP-сценарии можно при помощи функции mysql_connect($Server,$User,$Password), где SServer - имя сервера базы данных, $User - имя пользователя базы данных, $Password - пароль. Имя сервера, имя пользователя (DB host и DB user) вы получите у своего хостера при создании базы данных (см. рис. 4.3). Пароль указываете тот, который вы создали при создании самой базы данных.
После подключения к серверу базы данных, нужно выбрать нужную нам базу данных. Делается это при помощи функции mysql_select_db($name), где $пате - имя базы данных, созданной вами на сервере.
После того как мы подключились к серверу и выбрали базу данных, нужно сделать запрос к этой базе данных. Делает это функция mysqlquery ("Текст запроса"). Эта функция возвращает идентификатор выполнения запроса. Например:
$m=mysql_query("select * from Schetchik");
В данном случае функция mysql_query() возвратит набор, состоящий из записей в таблице Schetchik. Идентификатор этого набора будет находиться в переменной $т. Используя данный идентификатор, можно получить нужный элемент из набора записей при помощи функции mysql_result($m,
$str, $stl), где $str - номер строки или записи в таблице (в нашем случае у нас всего одна запись), $stl - номер столбца или поля таблицы (у нас есть 3 поля). Например, код: $v=mysql_result($m, 0, 2); echo $w;
Выведет в окно браузера содержимое третьего поля таблицы Schetchik (нумерация полей и записей начинается с нуля). У нас там, если помните, записана дата.
Получить нужный элемент из набора $т позволяет и функция Mvsql_fetch_array($m). Данная функция возвращает строку в виде массива, ключами которого будуг имена полей. Например, следующий код: $k=mysqlJ'etch array ($т); echo $k[segodna];
Выведет в браузер содержимое поля с именем segodna. У нас там записана единица.
Давайте теперь изменим данные в нашей таблице. Сделать это достаточно просто:
$day=date("Y-m-d"); - в переменной $day У нас будет текущая дата. Mysql_que}y("UPDATE Schetchik SETvcego= '2segodna= '2 chislo= '$day' ");
Мы делаем запрос к текущей базе данных при помощи функции Mysql_query() и вносим изменения в таблицу при помощи оператора UPDATE.
Составим теперь код счетчика с использованием базы данных (листинг 4.8). Счетчик будет показывать общее число посетителей и число посетителей за текущие сутки. Создайте PHP-страницу под названием, например ChetchikMySql.php.
Листинг 4.8 (файл ChetchikMySqLphp). <?php
If ($rc=mysql_connect(M78.108.81.240",Mul9147M,"parol"))
{
$day=date("Y-m-d"); mysql_select_db("bl9147_baza"); $tabl="Schetchik";
$mar=mysql_query("SELECT * FROM Stabl"); Sk —mysql_fetch_array($mar); $k|vcego]=$k[vcego]+l; if($day!==$k[chisloJ)
Строганов Л. С. Ваш первый сайт с использованием РНР-скриптов {
$k[chislo]=$day; $k[segodnal=l;
}
Else {
$k{segodna]=$k[segodna]+l; }
Mysql_query("UPDATE Schetchik SET vcego='$k[vcegol segodna='$k[segodna] chislo='$k[chislo]'");
Echo "<table border=2 bordercolor=orangextr> <td colspan=2 align=center>riocemaeMocTb</tdx/tr> <tr><td align=center>Bcero</tdxtd align=center>CeroflHH</tdx/tr> <trxtd align=center>$k[vcego] </td>
<td align=center>$k[segodna]</tdx/trx/table>"; }
Else {
Echo "Error!"; }
?>
Разберем некоторые строчки кода: < ?php - начало PHP-кода;
If ($rc=mysql_connect("78.108.81.240", "и19147", "parol")) - при помощи оператора mysql_connect соединяемся с сервером, указывая DB host, DB user и пароль. Этому соединению присваиваем идентификатор $гс. При помощи условия //проверяем, произошло ли соединение, т. е. определена ли переменная $гс. Если соединение произошло успешно, выполнится весь код между фигурными скобками под номером 1;
Ц
$day=date("Y-m-d"); - переменой $day присваиваем текущую дату в формате Y-m-d (четыре цифры года, две цифры месяца и две цифры числа месяца);
Mysql_select_db("bl9147_baza"); - выбираем созданную нами базу данных; $tabl = "Schetchik"; - переменной $tabl присваиваем название созданной нами таблицы;
$mar=mysql_query("SELECT * FROM $tabl"); - делаем запрос к выбранной базе данных. Получаем набор, состоящий из записей в таблице Schetchik. Идентификатор этого набора будет находиться в переменной $таг $k=mvsqlJetch_array($mar); - функция mysqlJetcharray, как указывалось выше, возвращает строку в виде массива $к, ключами которого будут имена полей;
$k[vcego]=$k[vcego]+l; - в элементе массива $k[vcego] содержится общее число посетителей. Увеличиваем его на единицу;
If($day!==$k[chisloJ) - если текущая дата не совпадает с той датой, которая указана в поле chislo базы данных (дата уже изменилась), то выполнится код между фигурными скобками под номером 2. Дату в поле chislo, если помните, мы записали в том же формате, что и потом в переменной $day (четыре цифры года, две цифры месяца и две цифры числа месяца); 2{
$k[chislo]=$day; - присваиваем элементу массива $k[chislo] текущую дату, чтобы потом обновить содержимое поле chislo в базе данных;
$k[segodna]=l; - элементу массива $k[segodna] присваиваем единицу (если наступили новые сутки, значение числа посетителей текущих суток сбрасывается опять на единицу); 2}
Else - если текущая дата совпадает с той датой, которая указана в поле chislo Базы данных (дата еще не изменилась), то выполнится строка между фигурными скобками под номером 3.
А
$k[segodna]=$k[segodna]+l; - элемент массива $k[segodna] просто увеличиваем на единицу;
3}
Mysql_query("UPDA ТЕ Schetchik SET vcego-$k[vcego]',
Segodna='$k[segodna] chislo='$k[chislo],n); - мы опять делаем запрос к текущей базе данных при помощи функции mysql quetyQ и вносим изменения в таблицу при помощи оператора UPDATE. Обновляем запись в полях таблицы. В поле vcego вносится обновленное значение общего числа посетителей, в поле segodna - значение числа посетителей за текущие сутки, в поле Chislo обновляем дату;
Echo "<table border=2 bordercolor=orange><tr>
<td colspan=2 align=center>Посещаемость</td> </tr>
<tr> < td align=center>Всего </td> < td align=center> Сегодня </td> </tr>
<tr><td align =center> $k[vcego] </td>
<td align=center>$k[segodnaJ</td></tr></table>"; - заносим значения переменных $k[vcego] и $k[segodna] в небольшую таблицу и выводим эту таблицу при помощи оператора echo в окно браузера;
1} - окончание кода, выполняющегося при удачном соединении с сервером;
Else - если соединения с сервером базы данных не произошло, то выводится сообщение об ошибке;
Echo "Error!";
4}
?> - конец РНР-кода.
Ну, вот и все. Как видите, использование базы данных позволяет значительно сократить код счетчика. Здесь нам не понадобились текстовые файлы. Однако скрипт работает быстрее без использования базы данных (для соединения с сервером требуется некоторое время). В общем, выбирать вам. Конечно, для счетчика посещений базу данных можно и не использовать (просто использовать текстовые файлы), но для более сложных проектов базы данных могут быть просто необходимы.
Вы, конечно, заметили что я не использовал подсчет уникальных посетителей (посетителей с различным IP). Попробуйте сделать это самостоятельно. Для этого создайте в базе данных вторую таблицу с единственным полем строкового типа, где будут сохраняться IP посетителей. Для поиска IP посетителя (посещал ли страницу данный посетитель с данным IP) можно применить функцию mysqlJetcharray(). При помощи данной функции можно перебрать все записи в таблице. Если таблица Schetchik содержит 3 поля и только одну запись, то таблица с IP-адресами будет иметь только одно поле и много записей (одна запись - один IP-адрес). При каждом вызове в скрипте функции mysqlJetch_ array() она выбирает следующую запись. Используя операторы цикла, можно, таким образом, перебрать все записи в таблице. Общее число записей в таблице можно определить при помощи функции Mysql_num_rows(). Допустим, вы назовете таблицу с IP-адресами adress, А единственное поле этой таблицы будет называться iprow. Приведу кусок кода, который ищет IP-адрес в базе данных: $tabl= "adress ";
$mar2=mysql query ("SELECT * FROM$tabl"); $ipnum=mysq In Umro ws ($mar2); $ip=$JSER VER["REMOTE_ADDR "]; $s=0;
For ($i=0; $i<$ipnum; $i++)
(
X
$ipadr=mysql Jetch_ array($mar2);
If (Sipadr[iprow]==$ip) $s=$s+I; }
If ($s=0) @mysqI_query("INSERTINTO $tabl VALUES('$ip')");
В этом коде в переменной Sipnum находится общее число записей, т. е. общее число IP-адресов. В переменной $ipadr[iprow] находится выбранный из таблицы IP-адрес и сравнивается с IP-адресом пришедшего посетителя. Если IP-адрес не найден, т. е. посетитель посещает вашу страницу впервые, переменная $s останется равной нулю. В этом случае при помощи оператора INSERT мы вносим новую запись с новым IP в таблицу. Значок @ ставится для подавления ошибок при записи в таблицу.
Вот и все, что я хотел вам сказать о базах данных. Сделал я это очень кратко. Если хотите знать о базах данных больше, обратитесь к соответствующей литературе.