Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Работа с куки и сессиями
Форумы портала PHP.SU » » Вопросы новичков » Работа с куки и сессиями

Страниц (1): [1]
 

1. 3d_killer - 20 Января, 2014 - 13:35:09 - перейти к сообщению
Не пойму в чем проблема пробую сделать авторизацию по куки, если авторизован пользователь то куки не используются сразу прилагаю код (тест просто)
login.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $user="123";
  4. setcookie("user", $user,0,'/');                                        
  5. echo("<meta http-equiv='refresh' content='0; url=/' />");
  6. ?>
  7.  

logout.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. setcookie("user", "", 0,'/'); //Удаляем
  4. echo("<meta http-equiv='refresh' content='1; url=/' />");
  5. ?>
  6.  

в самом индексе:
PHP:
скопировать код в буфер обмена
  1.  
  2. public function __construct() {
  3.     global $DBH;
  4.     if ($_SESSION['user'] == NULL)
  5.         {
  6.             //Проверим куки
  7.             if (empty($_COOKIE["user"]))
  8.                 {
  9.                     //Пользователь не залогинен
  10.                 }
  11.             else
  12.                 {
  13.                     $STH = $DBH - > prepare("SELECT * FROM table_users WHERE control_summ=:control_summ AND activation=1 LIMIT 1");
  14.                     $STH - > bindParam(':control_summ', $_COOKIE["user"]);
  15.                     $STH - > execute();
  16.                     if ($STH - > rowcount() > 0)
  17.                         {
  18.                             //Пользователь есть
  19.                             $this - > user = $STH - > fetch();
  20.                             $_SESSION['user'] = $this - > user;
  21.                         }
  22.                     else
  23.                         {
  24.                             //
  25.                         }
  26.                 }
  27.         }
  28.     else
  29.         {
  30.             //ничего не делаем пользователь залогинен
  31.             $this - > user = $_SESSION['user'];
  32.         }
  33.     }
  34.  

происходит следующее нажимаем логин пользователь залогинен кука установлена все хорошо,
нажимаем логаут пользователь отлогинен куки в отладчике нет вроде бы все норм, но стоит обновить страницу получаю массив с данными пользователя пользоватетель залогинен, в отладчике куки нет, не пойму в чем проблема
2. esterio - 20 Января, 2014 - 13:39:30 - перейти к сообщению
почему не использовать сессии. Туда же зразу и загнать всю инфу о юзере
3. 3d_killer - 20 Января, 2014 - 13:43:11 - перейти к сообщению
так в сессии и есть просто в куки как бы флаг сидит логинить или нет пользователя при входе на сайт
(Добавление)
не вставляется нормально отредактированный код в индексе который там по коду видно
4. esterio - 20 Января, 2014 - 13:46:42 - перейти к сообщению
Тоесть логинить не логинить. Незнаю знакомы ли Вы с тем как работают сессии, но там также есть кука (по дефолту PHPSESSID), которая также жива только на время сеанса (час ее жизни также равно 0 по дефолту). Загнали в массив все данные о пользователе. Ну и проверка только isset
5. 3d_killer - 20 Января, 2014 - 13:51:49 - перейти к сообщению
я знаком, но нужно сделать именно с куками так как будет еще корзина с товарами тоже куки и завязано данное дело с пользователем (стоимость товара скидка зависит от пользователя).
Необходимо так сделать но как я уже писал:
esterio пишет:
происходит следующее нажимаем логин пользователь залогинен кука установлена все хорошо,
нажимаем логаут пользователь отлогинен куки в отладчике нет вроде бы все норм, но стоит обновить страницу получаю массив с данными пользователя пользоватетель залогинен, в отладчике куки нет, не пойму в чем проблема

(Добавление)
я пока не говорю о времени жизни сессии или куки необходимо чтобы кнопки вход и выход работали безотказно не как к сожелению сейчас
6. esterio - 20 Января, 2014 - 14:03:48 - перейти к сообщению
Также следующие ошыбки
3d_killer пишет:
global $DBH;

глобальние переменные плохо
3d_killer пишет:
if ($_SESSION['user'] === NULL) {

или is_null
3d_killer пишет:
$this -> user = $_SESSION['user'];

здесь без пробела


Но еще раз настою на своем. Чем работа с сессией отличаеться от кук.
Можно ж сделать так
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. if(isset($_SESSION['user_data']))
  4.         $user_data = $_SESSION['user_data'];
  5. else
  6.         $user_data = false;
  7.  
  8. if($user_data)
  9.         echo 'USER IS LOGIN';
  10. else
  11.         echo 'USER IS GUEST';
  12.  
  13. // Login
  14. $_SESSION['user_data'] = array(); // PUT FROM SQL

не стоит забивать, что ето всего-лишь пример
7. 3d_killer - 20 Января, 2014 - 14:06:32 - перейти к сообщению
а как без глобальных в классе?
PHP:
скопировать код в буфер обмена
  1.  
  2. class MY_caller
  3.         {
  4.                 var $user=null; //Пользователь
  5.                 var $count_product=0; //Количество товаров в корзине
  6.                 var $back = array();
  7.                 public function __construct()
  8.                         {
  9.                                 global $DBH;
  10.  
8. teddy - 20 Января, 2014 - 14:08:22 - перейти к сообщению
после bind_param сделайте var_dump($_COOKIE['user']);
если увидите там NULL(если не NULL то показывайте каков результат)

то походу у Вас в БД есть запись там где control_summ равно NULL, поэтому и возвращается массив.

3d_killer пишет:
а как без глобальных в классе?

сделайте класс для работы с БД как синглтон и цепляйте instance там где он нужен

PHP:
скопировать код в буфер обмена
  1. class someclass{
  2.     private $_dbh;
  3.    
  4.     public function __construct(){
  5.         $this->_dbh = DBConn::getInstance();
  6.     }
  7.  
  8.     public function __destruct(){
  9.          unset($this->_dbh);
  10.     }
  11. }
9. 3d_killer - 20 Января, 2014 - 14:12:13 - перейти к сообщению
исправление указанных ошибок не помогает все равно при логауте
в сессии нет ничего проверил так:

FireBug смотрю куки установленной нет,
и визуально по условиям отображение блоков выглядит так, как будто пользователь не залогинен, но обновляю страницу:
куки нет,
блоки как у залогиненного,
<?php var_dump($_SESSION); ?> выдает массив данных пользователя
(Добавление)
если сделать var_dump($_COOKIE['user']); в классе то как раз выводит значение куки старое, но ее то не существует откуда она берется?
10. teddy - 20 Января, 2014 - 14:21:24 - перейти к сообщению
3d_killer пишет:
если сделать var_dump($_COOKIE['user']); в классе то кака раз выводит значение куки старое, но ее то не существует откуда она берется?

3d_killer пишет:
setcookie("user", $user,0,'/');

обращаем внимание на четвертый параметр, это путь куда ставить куку... подозреваю что Вы $_COOKIE['user'] используйете по одному пути, а пытаетесь обнулить куку по другому пути.

Почистите все куки в браузере, измените сеткуки на

и попробуйте заново.

Если не выйдет то укажите одинаковый путь 4ым параметром и при авторизации и при логауте тот же самый путь или вот так
PHP:
скопировать код в буфер обмена
  1. setcookie('user', 'value',time()-1)
11. 3d_killer - 20 Января, 2014 - 14:33:06 - перейти к сообщению
видимо да в данный момент почистил использую так:

PHP:
скопировать код в буфер обмена
  1.  
  2. setcookie("user", "",0,'/');
  3.  

Скорее всего изначально когда пробовал поставил без пути
единственное что не понял при
PHP:
скопировать код в буфер обмена
  1. var_dump($_COOKIE['user']);

по какому пути считывается кука?
12. teddy - 20 Января, 2014 - 14:41:56 - перейти к сообщению
По глобальному... т.е не важно куда установлена кука(по какому пути)
var_dump($_COOKIE['user']); покажет содержимое независимо от пути если кука есть
13. 3d_killer - 20 Января, 2014 - 14:48:19 - перейти к сообщению
так если здесь

не указывать путь
при установке и при удалении, но скрипты установки и удаления находятся по разному пути то все будет работать или надо указывать какую то общую директорию?
14. teddy - 20 Января, 2014 - 15:04:54 - перейти к сообщению
Надо проверять-) сейчас протестил в хроме, указал при удалении expires в прошедшем времени - все норм удалилось. Устанавливал в одном файле а удалял в другом(пути не указывал). А без expires в прошлом времени не удалилось хотя должно было... возможно зависит от браузера
поиграйтесь на досуге если это так важно для вас =)
15. 3d_killer - 20 Января, 2014 - 15:17:10 - перейти к сообщению
Попробую, спасибо большое

 

Powered by ExBB FM 1.0 RC1