Сравним методы, которые использовались в листинге 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>