Вы не зашли.
Главная » PHP » авторизация $_COOKIE
#81. tipsun Off (19)
Moderator
2012.03.04 03:03
Код:
<?php
 
/*
-- +MySQL
-- Table structure for table `users`
--
 
CREATE TABLE IF NOT EXISTS `users` (
  `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `session_id` varchar(32) NOT NULL,
  `session_expire` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  KEY `session_id` (`session_id`),
  KEY `session_expire` (`session_expire`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=120 ;
 
--
-- Dumping data for table `users`
--
 
INSERT INTO `users` (`user_id`, `session_id`, `session_expire`) VALUES
(1, '12345', '2012-03-05 14:23:59');
-- -MySQL
*/
 
//define('SESSION_NAME',                 'SID_CAPTCHA');
//define('SESSION_NAME',                 'SID_SPECIAL');
define('SESSION_NAME',                   'SID_DEFAULT');
define('SESSION_EXPIRE',                        129600);
define('SESSION_PATH',             DIRECTORY_SEPARATOR);
define('SESSION_DOMAIN', ('.' $_SERVER['HTTP_HOST']));
define('SESSION_SECURE',                         false);
define('SESSION_HTTPONLY',                        true);
 
define('TIMESTAMP''Y-m-d H:i:s');
 
//ini_set('display_errors', 1);
//error_reporting(E_ALL);
 
//include_once 'db.php'; //PDO Driver
 
/*
setCookie(SESSION_NAME,
          '12345', //Session value
          SESSION_EXPIRE + $_SERVER['REQUEST_TIME'],    //Session lifetime
          SESSION_PATH,
          SESSION_DOMAIN,
          SESSION_SECURE,
          SESSION_HTTPONLY);
*/
 
//$_COOKIE['someKey'] = 'someValue';
 
session_name(SESSION_NAME);
if (isset($_COOKIE[SESSION_NAME])) {
    
    session_start();
    
    if (! isset($_SESSION['SELF'])) {
        
        $_SESSION = array();
        $query $db->prepare("SELECT `user_id` FROM `users` WHERE `session_id` = ? AND `session_expire` > NOW() LIMIT 1;");
        //$query = $db->prepare("SELECT `user_id` FROM `users` WHERE `session_expire` > NOW() AND `session_id` = ? LIMIT 1;");
        //$query = $db->prepare("SELECT `user_id` FROM `users` WHERE `session_expire` > '" . date(TIMESTAMP) . "' AND `session_id` = ? LIMIT 1;");
        $query->execute(array($_COOKIE[SESSION_NAME]));
        
        if ($query->rowCount()) {
            
            $_SESSION['SELF'] = true;
            session_set_cookie_params(SESSION_EXPIRE,
                                      SESSION_PATH,
                                      SESSION_DOMAIN,
                                      SESSION_SECURE,
                                      SESSION_HTTPONLY);
            session_regenerate_id(true);
            $_SESSION += $query->fetch();
            $query $db->prepare("UPDATE `users` SET `session_expire` = NOW() + INTERVAL '" SESSION_EXPIRE "' SECOND, `session_id` = :new WHERE `session_id` = :old LIMIT 1;");
            //$query = $db->prepare("UPDATE `users` SET `session_expire` = '" . date(TIMESTAMP, SESSION_EXPIRE + $_SERVER['REQUEST_TIME']) . "', `session_id` = :new WHERE `session_id` = :old LIMIT 1;");
            $query->execute(array(':old'  => $_COOKIE[SESSION_NAME],
                                  ':new'  => $_COOKIE[SESSION_NAME] = session_id()));
        }
        else {
            
            session_destroy();
            setCookie(SESSION_NAME,
                      null//Session value.
                      0,    //Session expire.
                      SESSION_PATH,
                      SESSION_DOMAIN,
                      SESSION_SECURE,
                      SESSION_HTTPONLY);
            unSet($_COOKIE[SESSION_NAME]);
        }
    }
}
 
//*
echo '<pre>';
print_r($_COOKIE);
print_r($_SESSION);
echo '</pre>';
//*/
Отредактировано tipsun (2012.03.04 12:12)
#82. tipsun Off (19)
Moderator
2012.03.04 12:12
Вопрос, как лучше?
Средствами MySQL пользоваться NOW(), INTERVAL или средствами php?
#83. Gemorroj Off (107)
Administrator
2012.03.04 12:12
ключ с session_expire вероятно лучше убрать
Добавлено спустя    14 секунд:
лучше mysql
#84. tipsun Off (19)
Moderator
2012.03.04 12:12
Ок. Спс.
#85. tipsun Off (19)
Moderator
2012.03.04 13:01
Код:
<?php
 
-- нет
WHERE `session_expire` > NOW() AND `session_id` = ?
 
-- да
WHERE `session_id` = ? AND `session_expire` > NOW()
Отредактировано tipsun (2012.03.04 13:01)
#86. tipsun Off (19)
Moderator
2012.03.09 01:01
Только сейчас додумался, что можно пароль и потом проверить. Вот дурья башка.
Обычно с запросом проверяется.

Код:
<?php
 
$getName     $_GET['name'];
$getPassword $_GET['password'];
 
$query $db->prepare("SELECT `user_id`, `user_password` FROM `users` WHERE `user_name` = ? LIMIT 1;");
$query->execute(array($getName));
$result $query->rowCount();
 
if ($result and isSet($_GET['auth'])) {
    
    $array $query->fetch();
    
    if ($array['user_password'] == md5($getPassword)) {
        
        // Добро пожаловать.
        exit('1');
    }
    else {
        
        // Неверный пароль.
        exit('2');
    }
}
else if (! $result and isSet($_GET['save'])) {
    
    $db->prepare("INSERT INTO `users`(`user_name`, `user_password`) VALUES(?, ?);")->execute(array($getNamemd5($getPassword)));
    
    // Теперь вы пользователь.
    exit('3');
}
else {
    
    // Нет такого пользователя.
    // Или имя пользователя занято.
    // Или не нажали кнопку.
    
    if (isSet($_GET['auth'])) exit('4');
    else if (isSet($_GET['save'])) exit('5');
    else exit('6');
}
Отредактировано tipsun (2012.03.09 01:01)
#87. tipsun Off (19)
Moderator
2012.06.29 10:10
Хотел в класс запихать код для старта сессии при получении печеньки и при присутствии/отсутствии файла сессии, но чет не знаю как практичней.
Не хочу трогать базу, ну через конструктор заносить сингтон базы.
Я за независимость smile
Просто почитал чуть про хороший код. И типа лучше всего, когда класс не зависит от другого класса/кода.
Добавлено спустя   1 минуту  9 секунд:
Сейчас наброски скину.
#88. tipsun Off (19)
Moderator
2012.06.29 12:12
Еще думал, как принимать тучу параметров печенья.
Была мысль о ini_set()
Но потом подумал, это на 1 раз или нет,
т.к. другие скрипты тоже могут использовать сессию.
Код:
<?php
 
class Ticket
{
 
// Набросок.
 
    const LONG 129600;
    
    private $_id;
    
    public function __construct ($var)
    {
        if (isset($_COOKIE[$var])) {
            
            session_name($var);
            session_start();
            
            $this->_id $var;
        }
    }
    
    public function isCorrect ()
    {
        if (isset($_SESSION[$_COOKIE[$this->_id]])) {
            
            return true;
        }
        else {
            
            return false;
        }
    }
    
    public function register ()
    {
        $_SESSION = array();
        session_set_cookie_params(SESSION_EXPIRE,
                                  SESSION_PATH,
                                  SESSION_DOMAIN,
                                  SESSION_SECURE,
                                  SESSION_HTTPONLY);
        session_regenerate_id(true); // если сессия не запущена, то функция сработает, откроет новую сессию?
        $_COOKIE[$this->_id] = session_id();
    }
    
    public function unregister ()
    {
        setcookie($this->_id,
                  null//Session value.
                  0,    //Session expire.
                  SESSION_PATH,
                  SESSION_DOMAIN,
                  SESSION_SECURE,
                  SESSION_HTTPONLY);
        unset($_COOKIE[SESSION_NAME], $_SESSION);
        session_destroy();
    }
}
Добавлено спустя   5 минут  54 секунды:
Можно сказу задать параметры через конструктор или потом в методе указывать...
Добавлено спустя   6 минут  55 секунд:
Или плюнуть на файлы и сделать класс на базе?
Отредактировано tipsun (2012.06.29 12:12)
#89. Gemorroj Off (107)
Administrator
2012.06.29 13:01
файлы в случае с сессиями устроят в 95% случаев, так что замачиваться я бы не стал. либо сразу писать прослойки для работы с сессиями в разных хранилищах.
#90. tipsun Off (19)
Moderator
2012.06.29 13:01
Ну если файлы использовать.
Просто прослойку хочу сделать.
Страниц: 17 8 9 10 11 12 Все
Главная
WEB
PunBB Mod v0.6.2
0.021 s