Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с куками...
 
 автор: DEM   (06.08.2011 в 10:53)   письмо автору
55.8 Кб
 
 

Сделал авторизацию через куки. Через jQuery передаю логин и пароль РНР-файлу в котором происходит такой код:

        $pass = md5($pass);      
        $num = $db->query("SELECT * FROM `users` 
                            WHERE `login`=" . $db->quote($login) . " 
                            AND `pass`='" . $pass . "'");    
            
        if($num->rowCount() == 1){            
            $user = $num->fetch(PDO::FETCH_ASSOC);
            $_SESSION['login'] = $user['login'];
            $_SESSION['pass'] = $user['pass'];
            $_SESSION['id'] = $user['id'];            
            setcookie('login', $user['login'], time()+604800);
            setcookie('pass', $user['pass'], time()+604800);
            setcookie('id', $user['id'], time()+604800);        
            echo "Вы удачно авторизировались!";
        }


Возвращает "Вы удачно авторизировались!". Но на главной странице стоит код проверки авторизации:


if(empty($_COOKIE['login']) OR empty($_COOKIE['pass'])){
              $Auth = new Auth();
              $Auth->authForm();
          
          } else {
              echo "Добро пожаловать " . htmlspecialchars($_COOKIE['login'], ENT_QUOTES);
              echo "<BR> <a href='" . URL . "?logout=1'>Выйти</a>";
          }
//Если в куках логин или пароль пусты - вывести форму авторизации, иначе вывести приветствие.


И вот в чём проблема. Я авторизируюсь, в Опере куки появляются (в аттаче фотография), но он всё равно выводит форму авторизации :( Уже голову сломал в чём может быть дело, но так и не понял :(


PS. когда делал не через jQuery был еще один глюк, он мог создать по две куки. Только тогда в ОПЕРЕ было написано не class, а Catalog (так называется ГЕТ-переменная, а адрес выглядит примерно так www.why/Catalog/news, через mod_rewrite)

  Ответить  
 
 автор: cheops   (06.08.2011 в 11:40)   письмо автору
 
   для: DEM   (06.08.2011 в 10:53)
 

А если вывести дамп массива $_COOKIE в нем что-то есть?
<?php
  
echo "<pre>";
   
print_r($_COOKIE);
  echo 
"</pre>";
?>

  Ответить  
 
 автор: DEM   (06.08.2011 в 12:03)   письмо автору
 
   для: cheops   (06.08.2011 в 11:40)
 

Array
(
    [PHPSESSID] => 534ada3c9e93e1236b0f0bbd1cad051a
)


А если делать не через jQuery, то на главной странице может быть пусто, а вот в разделе Category\news будет заполнен (и тогда на главной странице будет выводится форма, а не на главной - приветствие)...

Вот файл .htaccess:


DirectoryIndex index.php
RewriteEngine On
RewriteBase /
RewriteRule index.php.* - [L]
RewriteRule ^News/id([0-9]+)$ /index.php?razdel=News&id=$1
RewriteRule ^Category/([a-zA-Z0-9]+)$ /index.php?razdel=Category&name=$1
RewriteRule ^Category/([a-zA-Z0-9]+)/page([0-9]+)$ /index.php?razdel=Category&name=$1&page=$2
RewriteRule ^id([0-9]+)$ /index.php?razdel=Why&id=$1
RewriteRule ^id([0-9]+)/plus/comm([0-9]+)$ /index.php?razdel=Why&id=$1&plus=1&comm=$2
RewriteRule ^id([0-9]+)/minus/comm([0-9]+)$ /index.php?razdel=Why&id=$1&minus=1&comm=$2

  Ответить  
 
 автор: cheops   (06.08.2011 в 13:05)   письмо автору
 
   для: DEM   (06.08.2011 в 12:03)
 

А jQuery каким методом передает данные (GET, POST)? И как вы их принимаете? Не могут они на этом этапе теряться?

  Ответить  
 
 автор: DEM   (06.08.2011 в 13:40)   письмо автору
 
   для: cheops   (06.08.2011 в 13:05)
 

Данные передаются через $.post("API,php", {тут методы перечисляем});
Возвращается только "Вы удачно авторизировались!" и всё. все записи в куки производится в файле API.php

  Ответить  
 
 автор: cheops   (06.08.2011 в 13:58)   письмо автору
 
   для: DEM   (06.08.2011 в 13:40)
 

Хорошо, jQuery отвправил вам данные методом POST, а где вы их извлекаете из $_POST? Там они никак теряться не могут? Хотя, конечно, если выводится фраза "Вы удачно авторизировались!", то вероятно все нормально.

PS А у вас смены домена не происходит? Т.е. переключения с site.dev на www.site.dev и наоборот?

  Ответить  
 
 автор: DEM   (06.08.2011 в 14:06)   письмо автору
 
   для: cheops   (06.08.2011 в 13:58)
 

А вот это мысль, как буду дома проверю.
Спасибо!

  Ответить  
 
 автор: DEM   (06.08.2011 в 14:28)   письмо автору
 
   для: DEM   (06.08.2011 в 14:06)
 

Проверил, вроде всё нормально(((
Вот код jQuery:

$('#AuthButt').live('click', function(){
    // varLoad = $(this).parent().html("<div>Загрузка...</div>");
    $.post("class/API.php", 
          {method: "Auth", 
          login: $('#login').val(),
          pass: $('#pass').val()},
          function(html){             
                if(html!=""){
                    alerter(2, html);                                         
                } else {
                    alerter(0, 'Произошла ошибка!'); 
                }            
          });      

   
});


А вот метод, который отвечает за авторизацию (при обращении к API.php идёт проверка отправленой переменной $_POST['method'] и если всё норм - вызывается определённый метод):

public function Auth($login, $pass){
    global $db;  //Знаю что это устарело, как исправлю баг с авторизацией, сразу исправлю
        $pass = md5($pass);      
        $num = $db->query("SELECT * FROM `users` 
                            WHERE `login`=" . $db->quote($login) . " 
                            AND `pass`='" . $pass . "'");    
            
        if($num->rowCount() == 1){            
            $user = $num->fetch(PDO::FETCH_ASSOC);
            $_SESSION['login'] = $user['login'];
            $_SESSION['pass'] = $user['pass'];
            $_SESSION['id'] = $user['id'];            
            setcookie('login', $user['login'], time()+604800);
            setcookie('pass', $user['pass'], time()+604800);
            setcookie('id', $user['id'], time()+604800);        
            echo "Вы удачно авторизировались!";
        } else {
            session_destroy();
            setcookie('login');
            setcookie('pass');
            setcookie('id'); //на всякий случай удаляю данные, мало ли...
            echo "Такой пользователь не найден!";            
        }
    }

  Ответить  
 
 автор: Drago   (06.08.2011 в 15:01)   письмо автору
 
   для: DEM   (06.08.2011 в 14:28)
 

http://php.net/setcookie
Параметр $path.

  Ответить  
 
 автор: DEM   (07.08.2011 в 06:56)   письмо автору
 
   для: Drago   (06.08.2011 в 15:01)
 

Поставил везде так:
setcookie('id', $user->info['id'], time()+604800, "", ""); (для логина и пароля тоже)

Но не помогло(((

  Ответить  
 
 автор: Drago   (07.08.2011 в 11:31)   письмо автору
 
   для: DEM   (07.08.2011 в 06:56)
 

Конечно не поможет, потому что ничего не изменилось.

У вас проблема в том, что вы ставите куки в файле /class/API.php, а проверяете в /index.php. Без указания параметра $path, куки устанавливаются для всех файлов текущего каталога и вложенных в него. Если указать в $path корень веб-сервера "/", куки будут доступны в любом месте.

Параметр $domain там тоже неспроста, но об этом вам уже Хеопс намекал.

  Ответить  
 
 автор: DEM   (07.08.2011 в 12:49)   письмо автору
 
   для: Drago   (07.08.2011 в 11:31)
 

О! Теперь всё работает! Спасибо большое!
Раньше просто никогда не работал с $path и $domain и поэтому столкнулся с такой проблемой :)

Еще раз спасибо!

  Ответить  
 
 автор: DEM   (07.08.2011 в 12:49)   письмо автору
 
   для: Drago   (07.08.2011 в 11:31)
 

О! Теперь всё работает! Спасибо большое!
Раньше просто никогда не работал с $path и $domain и поэтому столкнулся с такой проблемой :)

Еще раз спасибо!

  Ответить  
 
 автор: DEM   (07.08.2011 в 15:51)   письмо автору
 
   для: DEM   (07.08.2011 в 12:49)
 

Только еще один вопрос: а как обращаться к кукам из файла API.php? А то он перестал его видеть :( Я, к счастью, храню это всё еще и в сессии, но на будущее знать было бы полезно :)

  Ответить  
 
 автор: Drago   (07.08.2011 в 16:51)   письмо автору
 
   для: DEM   (07.08.2011 в 15:51)
 

Значит опять что-то не так делаете. Если в $path стоит корень веб-сервера, куки должны быть доступны в любом каталоге, любом файле.

  Ответить  
 
 автор: DEM   (07.08.2011 в 17:04)   письмо автору
 
   для: Drago   (07.08.2011 в 16:51)
 

Ясно, спасибо, буду смотреть :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования