Сессии в базе данных


Я отправляю мой PHP-код для сеансов с использованием MySQL. Скажите, пожалуйста, если есть какие-то ошибки, если она может быть оптимизирована, или если безопасность может быть повышена.

  • Хост: localhost в
  • Пользователь: root
  • Пароль: ""
  • Базы данных: профессиональный

Структура таблицы:

Код [ПК] - данные - DateTouched

<?php
 function open($sess_id, $sess_name) {
  return true;
 }

 function close() {
  return true;
 }

 function read($sess_id) {
  $con = mysqli_connect("localhost", "root", "","pro");
  $stmt = mysqli_prepare($con,"SELECT Data FROM sessions WHERE SessionID = ?");
  mysqli_stmt_bind_param($stmt,"s",$sess_id);
  mysqli_stmt_execute($stmt);
  mysqli_stmt_bind_result($stmt,$data);
  mysqli_stmt_fetch($stmt);
  mysqli_stmt_close($stmt);
  $CurrentTime = date('Y-m-d H:i:s');
  if (!isset($data))
  {
   $stmt = mysqli_prepare($con,"INSERT INTO sessions (SessionID, DateTouched) VALUES (?,?)");
   mysqli_stmt_bind_param($stmt,"ss",$sess_id,$CurrentTime);
   mysqli_stmt_execute($stmt);
   mysqli_stmt_close($stmt);
   return false;
  }
  else
  {
   $stmt = mysqli_prepare($con,"UPDATE sessions SET DateTouched = ? WHERE SessionID = ?");
   mysqli_stmt_bind_param($stmt,"ss",$CurrentTime,$sess_id);
   mysqli_stmt_execute($stmt);
   mysqli_stmt_close($stmt);
   return $data;
  }
 }

  function write($sess_id, $data) {
   $con = mysqli_connect("localhost", "root", "","pro");
   $CurrentTime = date('Y-m-d H:i:s');
   $stmt = mysqli_prepare($con,"UPDATE sessions SET Data= ?,DateTouched=? WHERE SessionID=?");
   mysqli_stmt_bind_param($stmt,"sss",$data,$CurrentTime,$sess_id);
   mysqli_stmt_execute($stmt);
   return true;
  }

   function destroy($sess_id) {
   $con = mysqli_connect("localhost", "root", "","pro");
   $stmt = mysqli_prepare($con,"DELETE FROM sessions WHERE SessionID = ?");
   mysqli_stmt_bind_param($stmt,"s",$sess_id);
   mysqli_stmt_execute($stmt);
   return true;
  }

   function gc($sess_maxlifetime) 
  {
   $con = mysqli_connect("localhost", "root", "","pro");
   $stmt = mysqli_prepare($con,"Delete from sessions where TIMESTAMPDIFF (Second ,DateTouched,now())>=?");
   mysqli_stmt_bind_param($stmt,"s",$sess_maxlifetime);
   mysqli_stmt_execute($stmt);
   return true;
  }

  session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
  session_name('Session');
  session_start();
 ?>


600
3
задан 8 мая 2011 в 02:05 Источник Поделиться
Комментарии
2 ответа

Свой открыть и закрыть функции ничего не делают. Вы могли бы использовать их для подключения и отключения от базы данных. Таким образом, ошибка в подключении не будет читать или писать об ошибках, но будет ошибка в открытых. Что в дальнейшем может помочь диагностировать такие ошибки. Это также означает, меньше дублировать код и это может означать меньшее количество подключений к базе данных (которая может ускорить вещи немного).

2
ответ дан 8 мая 2011 в 04:05 Источник Поделиться

Особенно в средах ajaxy, много разных запросов может быть открыт на ваш сервер. В их текущей реализации нет проверки или блокировки, что означает, что установка переменной сеанса где-то можно отменить сеанс сохранить в другой запрос.


  1. Запросу открытое

  2. Запрос Б открыть

  3. Изменения данных

  4. Существует & сохраняет

  5. Б существует & сохраняет устаревшие данные

Я рекомендую либо делать выбор ..... Для обновления или проверки последней открытой-время с последнего изменен в базе данных.

1
ответ дан 8 июня 2011 в 12:06 Источник Поделиться