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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: проблема с сессией

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
smittt
Отправлено: 15 Октября, 2013 - 04:34:33
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




Доброго времени суток всем.
проблема со скриптом авторизации.
скажем login1.php
PHP:
скопировать код в буфер обмена
  1. <?
  2.         ini_set('display_errors',1);
  3.         error_reporting(E_ALL);
  4.         include("mysql.inc");
  5.         if (isset($_POST['login']))
  6.         {
  7.                 $login = mysql_real_escape_string($_POST['login']);
  8.                 $passwd = mysql_real_escape_string($_POST['passwd']);
  9.                 $query = "SELECT * FROM users WHERE login='$login' AND passwd='$passwd'";
  10.                 $res = mysql_query($query) or trigger_error(mysql_error().$query);
  11.                 if ($row = mysql_fetch_assoc($res))
  12.                 {
  13.                         session_start();
  14.                         $_SESSION['id'] = $row['uid'];
  15.                         $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  16.                 }
  17.         header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
  18.         exit;
  19.         }
  20.         if (isset($_GET['action']) AND $_GET['action']=="logout")
  21.                 {
  22.                         session_start();
  23.                         session_destroy();
  24.                         header("Location: http://".$_SERVER['HTTP_HOST']."/");
  25.                         exit;
  26.                 }
  27.         if (isset($_REQUEST[session_name()])) session_start();
  28.         if (isset($_SESSION['id']) AND $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) return;
  29.         else
  30.         {
  31. ?>
  32. <form method="POST">
  33. <input type="text" name="login"><br>
  34. <input type="password" name="passwd"><br>
  35. <input type="submit"><br>
  36. </form>
  37. <?
  38.         }
  39. ?>


далее вставляю эту авторизацию в test.php
PHP:
скопировать код в буфер обмена
  1. <?
  2.         echo 111;
  3.         require "login1.php";
  4.         echo 222;
  5.         echo "OK";
  6.         echo 111;
  7. ?>
  8.  

ошибок ни каких нет, но и выводится только 111 и снова авторизация.
вставляя login1.php в другие скрипты, после ввода логина пароля, остается все равно авторизация(
подскажите пожалуйста уважаемые, в чем может быть засада..
(Добавление)
вообще сессии работают.
вот такой скрипт работает "на ура".
PHP:
скопировать код в буфер обмена
  1. <?
  2. if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;
  3. echo "Вы обновили эту страницу ".$_SESSION['counter']++." раз. ";
  4. echo "<br><a href=".$_SERVER['PHP_SELF'].">обновить";
  5. ?>
 
 Top
ugin_root
Отправлено: 15 Октября, 2013 - 06:02:40
Post Id


Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011  
Откуда: Киргизия


Помог: 5 раз(а)




1) Функцию session_start() нужно вызвать до любого вывода, подробнее тут, а у тебя выводится '111' до функции session_start()
2) Твои '222OK111' не выведутся по тому что у тебя в конце скрипта стоит функция exit()
 
 Top
smittt
Отправлено: 15 Октября, 2013 - 06:12:57
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




ugin_root пишет:
1) Функцию session_start() нужно вызвать до любого вывода, подробнее тут, а у тебя выводится '111' до функции session_start()
2) Твои '222OK111' не выведутся по тому что у тебя в конце скрипта стоит функция exit()

Хорошо, спасибо! Если не сложно, расскажи как это должно работать тогда?
http://phpfaq[dot]ru/sessions
 
 Top
ugin_root
Отправлено: 15 Октября, 2013 - 07:41:28
Post Id


Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011  
Откуда: Киргизия


Помог: 5 раз(а)




перенеси exit() в последний блок else

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         ini_set('display_errors',1);
  3.         error_reporting(E_ALL);
  4.         include("mysql.inc");
  5.        
  6.        
  7.         if (isset($_POST['login'])){
  8.                 $login = mysql_real_escape_string($_POST['login']);
  9.                 $passwd = mysql_real_escape_string($_POST['passwd']);
  10.                 $query = "
  11.                         SELECT *
  12.                         FROM users
  13.                         WHERE login='$login' AND passwd='$passwd'
  14.                 ";
  15.                 $res = mysql_query($query) or trigger_error(mysql_error().$query);
  16.                 if ($row = mysql_fetch_assoc($res)){
  17.                         session_start();
  18.                         $_SESSION['id'] = $row['uid'];
  19.                         $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  20.                 }
  21.                 header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
  22.                 exit();
  23.         }
  24.        
  25.        
  26.         else if (isset($_GET['action']) AND $_GET['action']=="logout"){
  27.                 session_start();
  28.                 session_unset();
  29.                 session_destroy();
  30.                 header("Location: http://".$_SERVER['HTTP_HOST']."/");
  31.                 exit();
  32.         }
  33.        
  34.        
  35.         else if (isset($_REQUEST[session_name()])){
  36.                 session_start();
  37.         }
  38.        
  39.        
  40.         if (!isset($_SESSION['id']) OR $_SESSION['ip'] != $_SERVER['REMOTE_ADDR']){
  41.                 ?>
  42.                         <form method="POST">
  43.                         <input type="text" name="login"><br>
  44.                         <input type="password" name="passwd"><br>
  45.                         <input type="submit"><br>
  46.                         </form>
  47.                 <?PHP
  48.                 exit();
  49.         }

(Отредактировано автором: 15 Октября, 2013 - 07:43:04)

 
 Top
smittt
Отправлено: 15 Октября, 2013 - 10:58:46
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




ugin_root пишет:
перенеси exit() в последний блок else

Уважаемый, мне не помогло..
Вы, попробовали так? У вас работает?
 
 Top
ugin_root
Отправлено: 15 Октября, 2013 - 11:36:18
Post Id


Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011  
Откуда: Киргизия


Помог: 5 раз(а)




Да пробовал. У вас база данных есть? табличка users с полями uid, login, password? Если да то всё должно работать. Что происходит в mysql.inc? Где вы подключаетесь к БД?

(Отредактировано автором: 15 Октября, 2013 - 11:38:25)

 
 Top
smittt
Отправлено: 15 Октября, 2013 - 12:30:58
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




ugin_root пишет:
Да пробовал. У вас база данных есть? табличка users с полями uid, login, password? Если да то всё должно работать. Что происходит в mysql.inc? Где вы подключаетесь к БД?

С базой данной нормально все! Авторизация проходит нормально!
Я почему то предполагаю, что проблема где то в return ибо все остальное вроде работает, авторизация проходит , var_dump сессии говорит, что то вроде
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(2) { ["id"]=> string(1) "1" ["ip"]=> string(12) "46.хх.ххх.хх" }
 
 Top
ugin_root
Отправлено: 15 Октября, 2013 - 12:37:17
Post Id


Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011  
Откуда: Киргизия


Помог: 5 раз(а)




Посмотрите тот вариант который я прислал, там нету никакого return, я его убрал и условие поменял на обратное, что-бы сократить

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if (!isset($_SESSION['id']) OR $_SESSION['ip'] != $_SERVER['REMOTE_ADDR']){
  3.         ?>
  4.                 <form method="POST">
  5.                 <input type="text" name="login"><br>
  6.                 <input type="password" name="passwd"><br>
  7.                 <input type="submit"><br>
  8.                 </form>
  9.         <?PHP
  10.         exit();
  11. }

(Отредактировано автором: 15 Октября, 2013 - 12:38:28)

 
 Top
smittt
Отправлено: 15 Октября, 2013 - 13:29:01
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. https://ххххх/pass/test.php // проверка работы сессий
  3. https://ххххх/pass/info.php // phpinfo()
  4. https://ххххх/pass/testses.php // тестовый скрипт с подключаемой авторизацией
  5. https://ххххх/pass/login1.php // авторизация
  6. https://ххххх/pass/testses.php.txt
  7. https://ххххх/pass/login1.php.txt
  8.  
  9. DROP TABLE IF EXISTS `users`;
  10. CREATE TABLE `users` (
  11.   `id` int(10) NOT NULL,
  12.   `login` varchar(100) DEFAULT NULL,
  13.   `passwd` varchar(100) DEFAULT NULL,
  14.   `email` varchar(100) DEFAULT NULL,
  15.   `contact` varchar(100) DEFAULT NULL,
  16.   PRIMARY KEY (`id`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  18.  
  19. -- ----------------------------
  20. -- Records of users
  21. -- ----------------------------
  22. INSERT INTO `users` VALUES ('1', 'admin', 'password', 'test@test.com', 'my@jabber');
  23.  

проверку работоспособности авторизации провожу вот так :
PHP:
скопировать код в буфер обмена
  1. ....
  2.         if ($row = mysql_fetch_assoc($res)){
  3.                         session_start();
  4.                         $_SESSION['uid'] = $row['id'];
  5.                         $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  6.                         } else {
  7.                         echo "error password";
  8.                         }
  9. /*              header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);*/
  10.                 exit();
  11.                 }
  12. ....

на не верный пароль , выдает еррор пассворд.

(Отредактировано автором: 16 Октября, 2013 - 19:07:41)

 
 Top
ugin_root
Отправлено: 15 Октября, 2013 - 13:59:57
Post Id


Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011  
Откуда: Киргизия


Помог: 5 раз(а)




Посмотри что лежит в переменной $res может запрос не выполнился вовсе и произошла ошибка.

И немножко поменяй в коде что-бы знать что происходит во время подключения
PHP:
скопировать код в буфер обмена
  1. $res = mysql_query($query);
  2. if(!$res){
  3.         echo mysql_error();
  4.         exit();
  5. }else{
  6.         $row = mysql_fetch_assoc($res);
  7.         if($row){
  8.                 session_start();
  9.                 $_SESSION['id'] = $row['id'];
  10.                 $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  11.         }
  12.         header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
  13. }


И мне кажется сервер никак не реагирует на твоё ini_set('display_errors',1);
Смотри логи в папке '/var/log/apache2/' туда сыпятся все ошибки и нотисы сервера

----------------
Для табличек в базе latin1 никогда не используй, намучаешься с крякозябрами, используй лучше utf-8

(Отредактировано автором: 15 Октября, 2013 - 14:08:43)

 
 Top
smittt
Отправлено: 15 Октября, 2013 - 14:19:08
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




Чуть повоевал с твоим последним кодом, извини, пошел по пути наименьшего сопротивления..
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.         ini_set('display_errors',1);
  4.         error_reporting(E_ALL);
  5.         include("#mysql.inc");
  6.         if (isset($_POST['login'])){
  7.                 $login = mysql_real_escape_string($_POST['login']);
  8.                 $passwd = mysql_real_escape_string($_POST['passwd']);
  9.                 $query = "SELECT * FROM users WHERE login='$login' AND passwd='$passwd'";
  10.                 $res = mysql_query($query) or trigger_error(mysql_error().$query);
  11.                 if ($row = mysql_fetch_assoc($res)){
  12.                         session_start();
  13.                         $_SESSION['uid'] = $row['id'];
  14.                         $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  15.                         echo $res;
  16.                         echo $row;
  17.                         }
  18. /*              header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);*/
  19.                 exit();
  20.                 }
  21. ...


вывод

PHP:
скопировать код в буфер обмена
  1.  
  2. https://ххххх/pass/login1.php
  3. Resource id #4Array


а значит запрос выполняется..

(Отредактировано автором: 16 Октября, 2013 - 19:07:56)

 
 Top
ugin_root
Отправлено: 15 Октября, 2013 - 14:21:29
Post Id


Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011  
Откуда: Киргизия


Помог: 5 раз(а)




Ну тогда не echo $row, а print_r($row)

(Отредактировано автором: 15 Октября, 2013 - 14:22:32)

 
 Top
smittt
Отправлено: 15 Октября, 2013 - 14:22:04
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




Ошибки да, могут не работать(
Это мой действующий и рабочий сервер, не хотелось бы на нем устраивать даже временные тесты.
Я залил туда, что бы хоть как то было наглядно видно, что я делаю..
На счет utf-8, да, я в курсе, спасибо! Это просто я на скорую состряпал табличку.
(Добавление)
CODE (htmlphp):
скопировать код в буфер обмена
  1. Resource id #4Array ( [id] => 1 [login] => admin [passwd] => password [email] => test@test.com [contact] => my@jabber )

(Отредактировано автором: 15 Октября, 2013 - 14:27:17)

 
 Top
ugin_root
Отправлено: 15 Октября, 2013 - 14:31:23
Post Id


Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011  
Откуда: Киргизия


Помог: 5 раз(а)




И всё таки придётся смотреть логи. Ищи всё что связано с функцией session_start();

Две самых распространённых ошибки это файлы в формате utf-8(нужен utf-8 без BOM) и скрипт не может записать сессию на диск (нету доступа или папка не существует)

Логи
CODE (htmlphp):
скопировать код в буфер обмена
  1. tail -f -n 50 /var/log/apache2/error.log


Правильная папка
CODE (htmlphp):
скопировать код в буфер обмена
  1. sudo mkdir /var/www/hms/data/mod-tmp

CODE (htmlphp):
скопировать код в буфер обмена
  1. sudo chmod a+rw /var/www/hms/data/mod-tmp

(Отредактировано автором: 15 Октября, 2013 - 14:36:09)

 
 Top
smittt
Отправлено: 15 Октября, 2013 - 14:36:07
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




перехватил темпером сессию
CODE (htmlphp):
скопировать код в буфер обмена
  1. PHPSESSID=pseim09246uc2vak86qn6d2ad7; path=/
  2.  
  3. root@debian-min:/var/www/ххххх/data/mod-tmp# ls -la | grep pseim09246uc2vak86qn6d2ad7
  4. -rw------- 1 www-data hms    88 Oct 15 15:34 sess_pseim09246uc2vak86qn6d2ad7
  5. root@debian-min:/var/www/ххххх/data/mod-tmp#
  6.  

(Добавление)
Весь error.log за сегодня
но эта ошибка была и вчера и позавчера и еще ранее, не думаю, что она имеет отношение к этим скриптам

CODE (htmlphp):
скопировать код в буфер обмена
  1. [Tue Oct 15 00:41:23 2013] [error] [client 127.0.0.1] (13)Permission denied: cannot read directory for multi: /var/www/
  2. [Tue Oct 15 00:41:24 2013] [error] [client 127.0.0.1] (13)Permission denied: cannot read directory for multi: /var/www/
  3. [Tue Oct 15 00:41:26 2013] [error] [client 127.0.0.1] (13)Permission denied: cannot read directory for multi: /var/www/
  4. [Tue Oct 15 12:28:23 2013] [error] [client 127.0.0.1] (13)Permission denied: cannot read directory for multi: /var/www/
  5. [Tue Oct 15 12:39:19 2013] [error] [client 127.0.0.1] (13)Permission denied: cannot read directory for multi: /var/www/
  6. [Tue Oct 15 13:43:48 2013] [error] [client 127.0.0.1] (13)Permission denied: cannot read directory for multi: /var/www/

(Отредактировано автором: 16 Октября, 2013 - 19:08:22)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Если скрипт не работает »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB