| Листинг 23.5. Сеансы PHP, сохраненные в базе данных MySQL
<?php
class mySession
{
private $dbLink; public function open()
{
if(!($this->dbLink =
mysql_connect("localhost", "httpd", "")))

{

 return(FALSE); 
// выбрать базу данных, а затем проверить на ошибку
if(!($dbResult =
mysql_query("USE test", $this->dbLink)))
{
return(FALSE);
}
return(TRUE);
}
public function close()
{
mysql_close($this->dbLink); return(TRUE);
}
public function read($id)
{
$Query = "SELECT SessionData " . "FROM session " .
"WHERE ID = '" . addslashes($id) . "'";
if(!($dbResult = mysql_query($Query, $this->dbLink)))
{
return(FALSE);
}
$dbRow = mysql_fetch_assoc($dbResult); //обозначить сеанс, как уже имевший доступ $Query = "UPDATE session " . "SET " .
"LastAction=NOW() " .
"WHERE ID='".addslashes($id)."' "; if(!($dbResult = mysql_query($Query, $this->dbLink)))
{
return(FALSE);
}
return($dbRow['SessionData']);
}
public function write($id, $data)
{
// создать сеанс, если он еще не существует
$Query = "INSERT IGNORE " . "INTO session (ID) " . "VALUES ('".addslashes($id)."')";
if(!($dbResult = mysql_query($Query, $this->dbLink)))
{
return(FALSE);
}
// обновить сеанс $Query = "UPDATE session " . "SET " .
"SessionData='".addslashes($data)."', " .
"LastAction=NOW() " .
"WHERE ID='".addslashes($id)."' ";
if(!($dbResult = mysql_query($Query, $this->dbLink)))
{
return(FALSE);
}
return(TRUE);

}
public function destroy($id)
{
$Query = "DELETE session " .
"WHERE ID='".addslashes($id)."' ";
if(!($dbResult = mysql_query($Query, $this->dbLink)))
{
return(FALSE);
}
return(TRUE);
}
public function garbage($lifetime)
{
$Query = "DELETE session " .
"WHERE (LastAction + $lifetime) < NOW() ";
if(!($dbResult = mysql_query($Query, $this->dbLink)))
{
return(FALSE);
}
return(TRUE);
}
}
$s = new mySession(); session_set_save_handler(
array($s, 'open'),
array($s, 'close'),
array($s, 'read'),
array($s, 'write'),
array($s, 'destroy'),
array($s, 'garbage')
);
// начать сеанс session_start();
// наращивать счетчик по мере доступа к страницам
if(isset($_SESSION['Count']))
$_SESSION['Count']++;
else
//начать отсчет с 1 $_SESSION['Count'] = 1;
// подключиться к базе данных
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 использовать базу данных test!<br>n");
//если пользователь изменяет идентификатор счета, // обновить этот столбец и сеанс
if(isset($_REQUEST['invoice'])) 
//преобразовать идентификатор счета в целое число
$_REQUEST['invoice'] = (integer)$_REQUEST['invoice'];
if(!($dbLink = mysql_connect("localhost", "httpd", "")))
{
print("Невозможно подключиться к базе данных!<br>n");
}
//выбрать базу данных, затем проверить на ошибку
if(!($dbResult = mysql_query("USE test", $dbLink)))
{
print("Невозможно использовать базу данных test!<br>n");
}
$Query = "UPDATE session " .
"SET Invoice={$_REQUEST['invoice']} " . "WHERE ID = '" . session_id() . "' ";
if(!($dbResult = mysql_query($Query, $dbLink)))
{
print("Невозможно обновить счет!<br>n");
}
$Invoice = $_REQUEST['invoice'];
}
else
{
//получить инвойс
$Query = "SELECT Invoice FROM session " . "WHERE ID = '" . session_id() . "' ";
if(!($dbResult = mysql_query($Query, $dbLink)))
{
print("Невозможно получить счет!<br>n");
}
$dbRow = mysql_fetch_assoc($dbResult); $Invoice = $dbRow['Invoice'];
}
?>
<html> <head>
<title>Листинг 23.5</title>
</head>
<body>
<?php
print("Вы просматривали эту страницу {$_SESSION['Count']}
раз!<br>n"); print("Текущий счет: $Invoice<br>n"); // отобразить форму для получения имени print("<form " .
"action="{$_SERVER['PHP_SELF']}" " . "method="post">" .
"<input type="text" name="invoice" " .
"value="">n" .
"<input type="submit" value="set order number"><br>n" . "</form>");
// для перезагрузки этой страницы воспользуйтесь ссылкой
print("<a href="{$_SERVER['PHP_SELF']}">reload</a><br>n");
?>
</body> </html>