Сравним методы, которые использовались в листинге 23.5, с методами, использованными в листинге 23.6. При первом обращении к сценарию в листинге 23.6 он создает сеанс для пользователя. Каждый щелчок на ссылке "reload" приводит к проверке сеанса сценарием. И если идентификатор сеанса в таблице session отсутствует, то сценарий отвергает идентификатор сеанса и создает новый. Создать неверный идентификатор сеанса можно, удалив один символ в окне адреса вашего браузера.
I Листинг 23.6. Обработка сеанса работы посетителя I
<html> <head>
^^^хЛистинг 23.6</title>
</head>
<body>
<?php
//Создать идентификатор сеанса function SessionID($length=32)
{
// Задать набор допустимых символов $Pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .
"abcdefghijklmnopqrstuvwxyz"; $lastChar = strlen($Pool) - 1;
$sid = "";
for($i = 0; $i < $length;
{
$sid .= $Pool[mt_rand(0, $lastChar)];
}
return($sid); // подключиться к базе данных
if(!($dbLink = mysql_connect("localhost", "httpd", "")))
print("Heвoзмoжнo подключиться к базе данных!<br>n");
//выбрать базу данных, затем проверить на ошибку if(!($dbResult = mysql_query("USE test", $dbLink)))
print("Heвoзмoжнo выбрать базу данных!<br>n");
//Очистить все старые сеансы $Query = "DELETE FROM session " .
"WHERE DATE_ADD(LastAction, INTERVAL 1800 SECOND) < " .
"NOW()";
if(!($dbResult = mysql_query($Query, $dbLink)))
{
// невозможно выполнить запрос
print("Невозможно удалить старые сеансы!<br>n");
}
//проверка сеанса $mySession = NULL; if(isset($_REQUEST['sid']))
{
//сеанс существует, проверить его
$Query = "SELECT SessionData, Invoice " .
"FROM session " .
"WHERE ID='" . addslashes($_REQUEST['sid']) . "' "; if(!($dbResult = mysql_query($Query, $dbLink)))
{
//невозможно выполнить запрос print("Heвoзмoжнo выполнить запрос к таблице
session!<br>n");
print("MySQL сообщает: " . mysql_error() . "<br>n");
}
//Если есть строка, соответствие обнаружено if($dbRow = mysql_fetch_assoc($dbResult))
{
//получить данные сеанса
$mySession = unserialize($dbRow['SessionData']); $mySession['Invoice'] = $dbRow['Invoice'];
}
else
{
//неверный идентификатор сеанса print("Heвeрный идентификатор сеанса ({$_REQUEST['sid']})!<br>n");
unset($_REQUEST['sid']);
}
}
//если сеанс отсутствует, его необходимо создать if(!isset($_REQUEST['sid']))
{
//сеанса нет, создать его $_REQUEST['sid'] = SessionID(); $mySession = array('Count'=>0); // добавить сеанс в базу данных $Query = "INSERT INTO session " .
"(ID, SessionData, LastAction) " .
"VALUES (" .
"'" . addslashes($_REQUEST['sid']) . "', " .
"'" . addslashes(serialize($mySession)) . "', " .
"NOW()) ";
if(!($dbResult = mysql_query($Query, $dbLink)))
{
//невозможно выполнить запрос print("Heвoзмoжнo сделать вставку в таблицу
session!<br>n");
print("MySQL сообщает: " . mysql_error() . "<br>n"); exit();
}
}
//если пользователь меняет идентификатор счета, //обновить столбец и сеанс if(isset($_REQUEST['invoice']))
{
// номер счета должен быть целым
$_REQUEST['invoice'] = (integer)$_REQUEST['invoice'];
$Query = "UPDATE session " .
"SET Invoice={$_REQUEST['invoice']} " .
"WHERE ID = '" . addslashes($_REQUEST['sid']) . "' ";
if(!($dbResult = mysql_query($Query, $dbLink)))
{
print("Heвoзмoжнo обновить счет!<br>n");
}
$mySession['Invoice'] = $_REQUEST['invoice'];
}
//увеличить счетчик просмотров
$mySession['Count']++;
if(!isset($mySession['Invoice']))
{
$mySession['Invoice'] = 'NULL';
}
prinM^bi просмотрели эту страницу " .
"{$mySession['Count']} раз!<br>n");
print("Current Invoice: {$mySession['Invoice']}<br>n"); //вывести форму ввода имени print("<form " .
"action="{$_SERVER['PHP_SELF']}" " .
"method="post">" .
"<input type="hidden" name="sid" " . "value="{$_REQUEST['sid']}">" . "<input type="text" name="invoice" " . "value="">n" .
"<input type="submit" value="set order number">" .
"<br>n" .
"</form>");
// воспользоваться ссылкой для использования этой страницы print("<a href="" .
"{$_SERVER['PHP_SELF,]}?sid={$_REQUEST[,sid,]}">reload" . "</a><br>n");
/*
** сохранить сеанс */
// выбрать счет
$Invoice = $mySession['Invoice']; unset($mySession['Invoice']); $Query = "UPDATE session " .
"SET LastAction = NOW(), " .
"Invoice = $Invoice, " .
"SessionData = '" . serialize($mySession) . "' " . "WHERE ID='" . addslashes($_REQUEST['sid']) . "' "; if(!($dbResult = mysql_query($Query, $dbLink)))
{
//невозможно выполнить запрос
print("Heвoзмoжнo модифицировать таблицу session!<br>n"); print("MySQL сообщает: " . mysql_error() . "<br>n"); exit();
}
?>
</body> </html>
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
PHP. Интеграция баз данных. Часть Шестая.
01-06-2015
<< Предыдущая статья | Следующая статья >> |
PHP. Интеграция баз данных. Часть Пятая. | PHP. Интеграция баз данных. Часть Седьмая. |