1 Востаннє редагувалося Stadnik Roman (08.05.2013 01:53:55)

Тема: Сесії

Привіт всім! Попередню тему удалив тому що вона була помилковою, можна і так сказати! Весь код був поганий!
Я на годину часу сів за компютер і розібрався що за що відповідає в цьому коді! Всі помилки виправив.
Але виникла нова помилка, коли я увів логін і пароль в браузері, та натиснув кнопку входу в мене все успішно виконало,
на екрані вибило Ви увійшли та кнопка виходу з сесії! На перший погляд все добре, коли я натиснув вийти з сесії я успішно вийшов і знову появилося поле для входу але також над цим полем появилася помилка
Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in Z:\home\localhost\test-proekt\index.php on line 51
Вона не мішає, але все ж було б ліпше її забрати! Мені щось підказує що такі помилки можна скривати здається потрібно перед рядком поставити якись знак (це тільки здається) Це так?
Ну або виправити, але ось її я уж точно без Вашої допомоги не виправлю!
Якщо я Вам ще ненадоїв можете мені будь-ласка в цьому допомогти? Якщо так то виставлю код сторінки!

2

Re: Сесії

Просто не викликайте функцію session_destroy() зайвого разу та й все! Це попередження можливо приховати, але все ж краще виправити помилку.

3

Re: Сесії

Trying to destroy uninitialized session

постарайтесь детально перекласти цю фразу і напишіть її тут ;)

4

Re: Сесії

funivan написав:

Trying to destroy uninitialized session

постарайтесь детально перекласти цю фразу і напишіть її тут ;)

Спроба знищити неініціалізовану сессію. Вже написали, чому.

5

Re: Сесії

Очі.завидющі написав:

Просто не викликайте функцію session_destroy() зайвого разу та й все! Це попередження можливо приховати, але все ж краще виправити помилку.

Що ви маєте наувазі

не викликайте функцію session_destroy() зайвого разу

Як це? Цією ж фунццією ми закриваємо сесію!

6

Re: Сесії

Дарма, до речі, видалили. По ваших слідах ще не один початківець піде, і та тема могла комусь допомогти.
Ну і ще раз: тут телепатів немає без коду помилки в коді вказувати. Не хочете свій суперсекретний код викладати - не викладайте, але тоді ми вам точно не допоможемо.

7

Re: Сесії

В даному випадку помилка очевидна тут навіть коду не потрібно.

Роман, звертаюсь до Вас.

постарайтесь детально перекласти цю фразу і напишіть її тут!! Я впевнений що ви не знаєте її точного перекладу на даному етапі.

Trying to destroy uninitialized session

8

Re: Сесії

Як це? Цією ж фунццією ми закриваємо сесію!

Я вам намагався сказати що ви не лише закривали створену сесію, але й десь спробували закрити ще не існуючу/вже видалену сесію. А взагалі треба приводити код.

Подякували: Stadnik Roman1

9

Re: Сесії

koala написав:

Не хочете свій суперсекретний код викладати - не викладайте, але тоді ми вам точно не допоможемо.

Та ні, який сепр секретний код?! Тут напевне тисячі помилок! Ось -

<?php
  $connect = mysql_connect('localhost', 'root', 'Naruto1996') or die(mysql_error());
  mysql_select_db("games");
   
 # робимо провірку. 
  if(isset($_POST['submit'])){
    $username = $_POST['username'];
    $login = $_POST['login'];
    $password = $_POST['password'];
    $r_password = $_POST['r_password'];
  if ($password == $r_password) {
   $password = md5($password);
    $query = mysql_query ("INSERT INTO users(`username`,`login`,`password`) VALUES ('$username','$login','$password')") or die (mysql_error());
}
   else{
    die ('Пароли не совпадают!');
     }
}
/* кінець коду реєстрації */
?>
Регистрация</br>
<form method="post" action="index.php">
   Ваше имя: <input type="text" name="username"placeholder="username"required/></br>
    Логин:<input type="text" name="login"placeholder="Login"required/></br>
    Пароль:<input type="password" name="password"placeholder="Password"required/></br>
    Повторите пароль:<input type="password" name="r_password"placeholder="Repeat Password"required/></br>
<input name="submit" type="submit" value="Регистрация" required/>
</form>



<?php
 if(isset($_POST['enter'])) {
   $e_login = $_POST['e_login'];
  $e_password = md5($_POST['e_password']);
  
  $query = mysql_query ("SELECT * FROM users WHERE login = '$e_login'");
  $user_data = mysql_fetch_array($query);
  
  if ($user_data['password'] == $e_password) {
  session_start();
  $_SESSION['name'] = $e_login;
  }
  else {
  echo "Не верний пароль или логин";
  }
  }
  
  if(isset($_POST['logout'])) {
  unset( $_SESSION['name']);
  session_destroy();
  }
  
  
  
  if (isset($_SESSION['name'])) 
 {
 echo 'Ви увійшли як<br>'.$e_login.'
     <form method="post" action="index.php">
     <input type="button" value="Войти" onClick=location.href="akk.php">
     <input type="submit" name="logout" value="Выход"/>
     </form>
     ';
}
  else {
echo  '<center>
Вход 
<form method="post" action="index.php">
Логин:<input type="text" name="e_login"placeholder="Login"required/>
Пароль:<input type="password" name="e_password"placeholder="Password"required/>
<input name="enter" type="submit" value="Войти"/>
</form>';
}
?>

А нашот того що попередню тему видалив то це тому що там дуже поганий код, потрібно багато чого виправляти!
Якщо комусь потрібен код реєстрації та входу то я його щойно виклав!

10

Re: Сесії

funivan написав:

В даному випадку помилка очевидна тут навіть коду не потрібно.

Роман, звертаюсь до Вас.

постарайтесь детально перекласти цю фразу і напишіть її тут!! Я впевнений що ви не знаєте її точного перекладу на даному етапі.

Trying to destroy uninitialized session

Переклад - Намагаючись знищити неініціалізованих сесій

11

Re: Сесії

Намагаючись знищити неініціалізованих сесій

Вірно.
Давайте тепер подумаємо як можна обійти цю фішку.
Логічно думаючи ми можемо знищувати тільки ініціалізовані сесії.
Або якщо сесія не ініціалізована тоді і знищувати її не потрібно.

Отже дальше є два варіанти написання коду ;)

Подякували: Stadnik Roman1

12

Re: Сесії

Вірно.
Давайте тепер подумаємо як можна обійти цю фішку.
Логічно думаючи ми можемо знищувати тільки ініціалізовані сесії.
Або якщо сесія не ініціалізована тоді і знищувати її не потрібно.

Отже дальше є два варіанти написання коду wink

Так давайте по прядку,
Помилка в цьому кусці коду

 
if(isset($_POST['logout'])) {
 unset( $_SESSION['name']);
  session_destroy();
  }

цим куском ми перевіряємо якщо нажата кнопка logout то ми відключаємо сесію " unset( $_SESSION['name']);"
а це тоді навіщо   session_destroy(); ?
Це виходить що ми намагаємося два рази відключити сесію чи що?
Якщо цей рядок видалити то помилка зникає!

13

Re: Сесії

Вирівняв код по відступах. Тепер стало видно, що session_start виконується тільки за певних умов, і session_destroy може викликатися без session_start. І взагалі читайте документацію на php.net.

Прихований текст
Stadnik Roman написав:
<?php
  $connect = mysql_connect('localhost', 'root', 'Naruto1996') or die(mysql_error());
  mysql_select_db("games");
   
  # робимо перевірку. 
  if(isset($_POST['submit'])){
    $username = $_POST['username'];
    $login = $_POST['login'];
    $password = $_POST['password'];
    $r_password = $_POST['r_password'];
    if ($password == $r_password) {
      $password = md5($password);
      $query = mysql_query ("INSERT INTO users(`username`,`login`,`password`) 
                                        VALUES  ('$username', '$login', '$password')") 
                   or die (mysql_error());
    }
    else{
      die ('Пароли не совпадают!');
    }
  }
  /* кінець коду реєстрації */
?>
Регистрация</br>
<form method="post" action="index.php">
   Ваше имя: <input type="text" name="username"placeholder="username"required/></br>
    Логин:<input type="text" name="login"placeholder="Login"required/></br>
    Пароль:<input type="password" name="password"placeholder="Password"required/></br>
    Повторите пароль:<input type="password" name="r_password"placeholder="Repeat Password"required/></br>
<input name="submit" type="submit" value="Регистрация" required/>
</form>

<?php
  if(isset($_POST['enter'])) {
    $e_login = $_POST['e_login'];
    $e_password = md5($_POST['e_password']);
  
    $query = mysql_query ("SELECT * FROM users WHERE login = '$e_login'");
    $user_data = mysql_fetch_array($query);
  
    if ($user_data['password'] == $e_password) {
      session_start();//буде виконано тільки якщо є $_POST['enter'] і $user_data['password'] == $e_password
      $_SESSION['name'] = $e_login;
    }
    else {
      echo "Не верний пароль или логин";
    }
  }
  
  if(isset($_POST['logout'])) {
    unset( $_SESSION['name']);//буде виконано тільки якщо є $_POST['logout']
    session_destroy();
  }
  
  
  
  if (isset($_SESSION['name'])) 
  {
    echo 'Ви увійшли як<br>'.$e_login.'
     <form method="post" action="index.php">
     <input type="button" value="Войти" onClick=location.href="akk.php">
     <input type="submit" name="logout" value="Выход"/>
     </form>
     ';
  }
  else {
    echo  '<center>
Вход 
<form method="post" action="index.php">
Логин:<input type="text" name="e_login"placeholder="Login"required/>
Пароль:<input type="password" name="e_password"placeholder="Password"required/>
<input name="enter" type="submit" value="Войти"/>
</form>';
}
?>
Stadnik Roman написав:

А нашот того що попередню тему видалив то це тому що там дуже поганий код, потрібно багато чого виправляти!
Якщо комусь потрібен код реєстрації та входу то я його щойно виклав!

Ви не розумієте. Нікому не потрібен "код реєстрації та входу", бо він є більш-менш унікальним для кожного сайта. А от побачити, яких люди припускаються помилок, і почитати відповіді на ніби очевидні запитання, може бути дуже корисним.

Подякували: Stadnik Roman1

14

Re: Сесії

Зрозуміло! Дякую що пояснили!

15

Re: Сесії

Очі.завидющі написав:

Просто не викликайте функцію session_destroy() зайвого разу та й все! Це попередження можливо приховати, але все ж краще виправити помилку.

Дякую за відповідь! Але все ж мені інтересно на майбутнє як саме можна приховати? Я читав десь про це, але де саме не паматяю! Здається на одному з етапів вивчення php

16

Re: Сесії

Особисто я не рекомендую приховувати помилки. Помилки треба виправляти.
Приховування помилок сповільнює сайт ;)

Подякували: Replace, Stadnik Roman2

17 Востаннє редагувалося Stadnik Roman (08.05.2013 17:07:12)

Re: Сесії

funivan написав:

Особисто я не рекомендую приховувати помилки. Помилки треба виправляти.
Приховування помилок сповільнює сайт ;)

Ну я теж так думаю, не дуже хочу щоб моя ігра була створена на одних какашках які приховані! (це я образно сказав) 
Я бачу тільки один вихід виправлення помилки, це видалити строку  session_destroy();

18

Re: Сесії

funivan написав:

Особисто я не рекомендую приховувати помилки. Помилки треба виправляти.
Приховування помилок сповільнює сайт ;)

І створює підвалини для рішучих бубнових плясок...

19

Re: Сесії

Stadnik Roman, дивіться у вас є фунція закривання дверей, яка у 50% звертань буде вилітати з попередження неможливо закрити закриті двері. Якщо ви її видалите, то не забувайте що у вас також буде вилітати фунція відкривання дверей з попередженням неможлило відкрити відкриті двері.

ну як появились якісь ідеї?

20

Re: Сесії

Романе, в двох словах:
- session_start має викликатися в усіх файлах, що використовують сесію, незалежно від того, чи вони її розпочинають; якщо сесія вже розпочата, то це просто прикріпить файл до сесії
- session_destroy має викликатися тільки після визову session_start;
- session_destroy не знищує змінні сесії, це треба робити самотужки, наприклад

$_SESSION=array();