Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Последние сообщения
Ответить
1 2 3 ... >>

Работа с сессиями

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#1
Вы когда нибудь сталкивались с ситуацией, когда Вам надо передать значение из одного скрипта в другой? Вот именно для этого и служит сессии. Многие начинающие программисты при знакомстве с сессиями начинают срать кирпичами, но не огорчайтесь - тут нет ничего сложного, держитесь меня и я Вас научу.
Как обычно, сразу код, а в нем комменты...


Файл page1.php
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
<?php <?php
//стартуем сессию, это необходимо дл того что бы пользоваться сессиями
session_start();
//теперь нам доступен массив сессии и мы можем заносить в нее данные
//например тут я присвоил ключу "id" значение 777
$_SESSION['id'] = 777;
?>
echo '
<!-- это ссылка на ворую страницу -->
<a href="page2.php">Page 2</a>';?>


Файл page2.php
 1 
 2 
 3 
 4 
<?php //стартуем сессию, это необходимо дл того что бы пользоваться сессиями
session_start();
//выводим переменную, которую обьявили на другой странице.
echo $_SESSION['id'];?>

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

Отредактировано автором 18 Июн 2010
Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#2
Если есть авторизация, то как можно проверить задана ли сессия?

Добавлено 2010.10.10 22-00

Вот есть страничка, на которую по идее можно попасть только посредством авторизации.

Как проверить, авторизовался ли человек, если он тупо вбил адрес страницы в браузере

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#3
ну если он авторизовался то у него должна быть какаято переменная в сессии. в зависимости от этой переменной можно делать что-то вроде

if (empty($_SESSION['переменнвя'])) {
header('Location: /'); die();
}

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#4
 1 
 2 
<?php $_SESSION['user'] = 1;?>

задавать в обработчике

а в закрытом:

 1 
 2 
 3 
 4 
 5 
 6 
 7 
<?php if (!empty($_SESSION['user']))  // проверяем сессию (вот думаю, стоит ли приписывать isset?)
    
{  } // просто показываем содержимое страницы, так как юзер получил правильный ключ
else
 { 
 echo 
"Пройдите авторизацию: <a href=\"index.php\"> Авторизация </a>"// Отправляем на авторизацию
  
exit();
}
?>

Но даже при верном логине и пароле пишет отправление на авторизацию


 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
<?php <?php
error_reporting
(E_ALL);
include (
'mysql_conf.php');
//var_dump($users_tb);
$q mysql_query("SELECT * FROM `"$users_tb ."` WHERE  `password`='".$_POST['password'] ."' AND  `login`='".$_POST['login'] ."' LIMIT 1 ");
if (
mysql_num_rows($q) > 0) {
     
$result mysql_fetch_array($q);
     
$_SESSION['user'] = 1;
     
header("Location: ../main.php");
     die();
  } 
else  {
  unset(
$_SESSION['user']);
  echo 
"Такие пара логина и пароля найдены не были <br/> <a href=\"../index.php\"> На авторизацию </a>"
  
// отправляем обратно на авторизацию
  
die();
}
?>

rest

  • Заглянувший
  • Юзер
  • 17
  • Репутация:0 
  • Предупреждения: 0 
  • Регистрация:
    6 Окт 2010
#5
проверь проходит ли этот блок if

 1 
 2 
<?php if (mysql_num_rows($q) > 0) {?>

например вместо хидеров поставь там какоето echo и посмотри доходит ли туда выполнение. Так как по какимто причинам может не доходить. например запрос не выполняется или таких логина и пароля в базе всеже нет(ты сказал что есть так что отпадает), мало ли, причины могут быть разными.

Вообще важно понять что все пишут код с багами. нет программиста без багов. Программист пишущий без багов это программист не пишущий вообще. Большая часть потраченого времени любого программиста это не время на написание а время на отладку. По-этому очень важно научиться ее делать.

если что-то не работает, проверяй логические узлы. Проверяй куда доходит выполнение а куда нет и так далее, пока не найдешь причину.

 1 
 2 
<?php var_dump(переменная);?>
еще очень важно чтобы в самом начале выполнения скриптов было прописано
 1 
 2 
<?php error_reporting(E_ALL);?>

вар дамп все выводит в одну строку и это не удобно разбирать глазами, я например делаю так
 1 
 2 
<?php echo '<pre>'var_dump(переменная); echo '</pre>';?>
в таком случае масивы просматривать очень удобно. Можешь написать такой скрипт и посмотреть
 1 
 2 
<?php $x = array('key1' => 1'key2' => 2'key3' => 3);
echo 
'<pre>'var_dump($x); echo '</pre>';?>

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#6
rest, А лучше это вообще вынести в отдельную функцию


 1 
 2 
 3 
 4 
 5 
<?php function pr($data) {
   echo 
'<pre>'
   
print_r($data); 
   echo 
'</pre>';
}
?>

и потом просто пользоваться ей. Допустим хочешь чтото продампить и пишешь

 1 
 2 
<?php pr(переменная);?>

ЗЫ: print_r и var_dump это почти одно и тоже, просто вардамп еще типы показывает а это почти всегда пох)))

Отредактировано автором 11 Окт 2010
Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#7
Code:
Array
(
    [0] => 1
    [id] => 1
    [1] => admin
    [login] => admin
    [2] => rte56t7y56
    [password] => rte56t7y56
    [3] => 375617099
    [icq] => 375617099
    [4] => antonk96
    [skype] => antonk96
    [5] => SKAD!
    [about] => SKAD!
    [6] => dwarts@yandex.ru
    [email] => dwarts@yandex.ru
    [7] => Skad
    [name] => Skad
    [8] => 3
    [group] => 3
)

Дамп результата.
Поидее if неверно работает? Если выносит всю таблицу

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#8
Смотря где дампишь. в каком месте и какую переменную дампишь? приведи пример своего кода как выше только с дампом(в смысле где ты там его пишешь)

Добавлено 2010.10.11 12-31

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

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

skad0

  • Атом-мозг
  • Юзер
  • 841
  • Репутация:10 
  • Предупреждения: 0 
  • Регистрация:
    2 Окт 2010
#9
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
<?php <?php
 
function pr($data) {
   echo 
'<pre>'
   
print_r($data); 
   echo 
'</pre>';

error_reporting(E_ALL);
include (
'mysql_conf.php');
//var_dump($users_tb);
$q mysql_query("SELECT * FROM `"$users_tb ."` WHERE  `password`='".$_POST['password'] ."' AND  `login`='".$_POST['login'] ."' LIMIT 1 ");
if (
mysql_num_rows($q) > 0) {
     
$result mysql_fetch_array($q);
     
pr($result);
     
$_SESSION['user'] = 1;
    
// header("Location: ../main.php");
     
echo "проходит"
     die();
  } 
else  {
  unset(
$_SESSION['user']);
  echo 
"Такие пара логина и пароля найдены не были <br/> <a href=\"../index.php\"> На авторизацию </a>"
  
// отправляем обратно на авторизацию
  
die();
}
?>


Судя по всему, ошибка в проверке авторизации в закрытом файле:

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
<?php if (!empty($_SESSION['user']))  // проверяем сессию
    
{  } // просто показываем содержимое страницы, так как юзер получил правильный ключ
else
 { 
 echo 
"Пройдите авторизацию: <a href=\"index.php\"> Авторизация </a>"// Отправляем на авторизацию
  
exit();
}

?>?>

Если юзер авторизован, то $_SESSION['user'] принимает значение 1, при проверке мы делаем: Если $_SESSION['user'] не пустое, то пропустить. В ином случае echo с отправкой на авторизацию

Добавлено 2010.10.11 12-45

Если ставить так:
 1 
 2 
 3 
 4 
 5 
 6 
 7 
<?php if ($_SESSION['user']=1)  // проверяем сессию (вот думаю, стоит ли приписывать isset?)
    
{  } // просто показываем содержимое страницы, так как юзер получил правильный ключ
else
 { 
 echo 
"Пройдите авторизацию: <a href=\"index.php\"> Авторизация </a>"// Отправляем на авторизацию
  
exit();
}
?>

то даже если просто открывать страницу, прописывая в адресной строке, содержимое показывается

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#10
в самом начале закрытого файла проверь переменную которую проверяешь в ифе(продампи)

и еще ты вроде не стартуешь сессию в закрытом файле и пытаешься проверить ее содержание.

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)
1 2 3 ... >>
Сейчас online: 32. Зарегистрированных: 2. Гостей: 30.