Понедельник, 23 Декабря 2024, 22:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Notice: Undefined variable
dima9595Дата: Вторник, 08 Июля 2014, 20:52 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Всем привет! Скорей всего, каждому разработчику, работающему с PHP приходилось сталкиваться с различными ошибками, например, "Notice: Undefined variable". Хоть она и не критична, но всё же, мне она очень мешает. Суть в чём - при создании переменной, которая приходит с POST запроса, выходит данная ошибка. Я не знаю как это убрать, может кто знает?

Ошибки:
Notice: Undefined index: login_users in /home/httpd/vhosts/.../subdomains/new/httpdocs/login.php on line 29
Notice: Undefined index: login in /home/httpd/vhosts/.../subdomains/new/httpdocs/login.php on line 30
Notice: Undefined index: password in /home/httpd/vhosts/.../subdomains/new/httpdocs/login.php on line 31
Код

function __construct(){
      ## Получаем данные
      $this->login_users = $_POST['login_users'];
      $this->login = $_POST['login'];
      $this->password = $_POST['password'];
      ## Защищаем данные
      // ...
     }


Добавлено (08.07.2014, 20:52)
---------------------------------------------
Кстати, не всегда выходит такая ошибка из-за POST запросов. Вот пример кода, которая вызывает ошибку:
Ошибка: Notice: Undefined variable: bad in /home/httpd/vhosts/.../subdomains/new/httpdocs/engine/db.php on line 40
Код

if($bad == 1){
      echo $error;
}




Сообщение отредактировал dima9595 - Вторник, 08 Июля 2014, 20:56
HabilisДата: Вторник, 08 Июля 2014, 20:53 | Сообщение # 2
был не раз
Сейчас нет на сайте
Я так понимаю валидация данных производится, тоесть пустые переменные не "сломают" ничего ниже?
тогда игнорировать, на прод сервере отключить отображение ошибок.


Dapf форум Дизайнеров и разработчиков, где помогают!
FolleahДата: Вторник, 08 Июля 2014, 20:55 | Сообщение # 3
Архитектор
Сейчас нет на сайте
Юзай if(isset($_POST['var'])) перед своим кодом

Цитата Habilis ()
Я так понимаю валидация данных производится, тоесть пустые переменные не "сломают" ничего ниже?
тогда игнорировать, на прод сервере отключить отображение ошибок.

Игнорировать ТС стоит только твой совет.




Сообщение отредактировал Folleah - Вторник, 08 Июля 2014, 20:57
dima9595Дата: Вторник, 08 Июля 2014, 20:57 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата Habilis ()
Я так понимаю валидация данных производится, тоесть пустые переменные не "сломают" ничего ниже?

То, что получают переменные ни чего не ломают в скрипте.
Цитата Habilis ()
тогда игнорировать, на прод сервере отключить отображение ошибок

Не охота) Люблю когда вообще ошибок нету) Кстати, а ошибки подобные этой не увеличат ответ от сервера?

Добавлено (08.07.2014, 20:57)
---------------------------------------------
Цитата Folleah ()
Юзай if(isset($_POST['var])) перед своим кодом

Это уже используется дальше по коду.




Сообщение отредактировал dima9595 - Вторник, 08 Июля 2014, 20:58
FolleahДата: Вторник, 08 Июля 2014, 20:59 | Сообщение # 5
Архитектор
Сейчас нет на сайте
Цитата dima9595 ()
Это уже используется дальше по коду.

Что мешает сделать лишнюю проверку при присваивании? От вас не убудет, а код будет нормальный.
Код

if(isset($_POST['login'])) $login = $_POST['login'];
else $login = FALSE;
if(isset($_POST['password'])) $password = $_POST['password'];
else $password = FALSE;

Etc
Вот даже еще более короткий вариант:
Код

$login = isset($_POST['login'] ? $_POST['login'] : FALSE;
$password = isset($_POST['password'] ? $_POST['password'] : FALSE;




Сообщение отредактировал Folleah - Вторник, 08 Июля 2014, 21:03
HabilisДата: Вторник, 08 Июля 2014, 21:00 | Сообщение # 6
был не раз
Сейчас нет на сайте
Цитата dima9595 ()
Не охота) Люблю когда вообще ошибок нету) Кстати, а ошибки подобные этой не увеличат ответ от сервера?

Неощютимо


Dapf форум Дизайнеров и разработчиков, где помогают!
dima9595Дата: Вторник, 08 Июля 2014, 21:06 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
Цитата Folleah ()
Что мешает сделать лишнюю проверку при присваивании? От вас не убудет, а код будет нормальный.

Спс за совет. Сейчас попробую...
Цитата Habilis ()
Неощютимо

Спс.

Добавлено (08.07.2014, 21:06)
---------------------------------------------

Цитата dima9595 ()
Что мешает сделать лишнюю проверку при присваивании? От вас не убудет, а код будет нормальный.

Всё работает! Спс большое. Для меня конечно не убудет, но теперь придётся не забывать такое писать)
Кстати, а вы так же делаете(если вообще пишите на php)?


FolleahДата: Вторник, 08 Июля 2014, 21:08 | Сообщение # 8
Архитектор
Сейчас нет на сайте
dima9595, я пишу на CodeIgniter (PHP фреймворк), мне там удобно и подобных ошибок в разы меньше возникает.



Сообщение отредактировал Folleah - Вторник, 08 Июля 2014, 21:08
dima9595Дата: Вторник, 08 Июля 2014, 21:50 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
Folleah, как нить тоже заценю)

Добавлено (08.07.2014, 21:50)
---------------------------------------------

Цитата dima9595 ()
Всё работает!

Ошибся...чё-то ни фига не работает)


FolleahДата: Вторник, 08 Июля 2014, 21:53 | Сообщение # 10
Архитектор
Сейчас нет на сайте
Что не работает то?

dima9595Дата: Вторник, 08 Июля 2014, 22:08 | Сообщение # 11
почти ветеран
Сейчас нет на сайте
Остальные ошибки пофиксил, но вот если писать так:
Код

if(isset($error)){
     if(isset($_SESSION['id']) || isset($_SESSION['login'])){
      $bad = 1;
      $error .= 'Вы уже авторизованы!<br>';
     }
    }

то переменная оказывается пустой и не засчитывается код дальше. А если использовать empty вместо isset, то ошибка будет таже.




Сообщение отредактировал dima9595 - Вторник, 08 Июля 2014, 22:10
HabilisДата: Вторник, 08 Июля 2014, 22:13 | Сообщение # 12
был не раз
Сейчас нет на сайте
Цитата


if(isset($error)){
if(isset($_SESSION['id']) || isset($_SESSION['login'])){
$bad = 1;
$error .= 'Вы уже авторизованы!<br>';
}
}



Не видно всего контекста......, но так не делай глаза сломаещь

все это можно в 1 иф (если там ты не выпелил еще что-то конечно smile )
Код

if(isset($error) && isset($_SESSION['id'])){           
                    $bad = 1;    
         $error .= 'Вы уже авторизованы!<br>';       
}

Я позволил себе выпелить
|| isset($_SESSION['login']
думаю ЙД без логина существовать сам по себе ен может)

А по основному вопросу, зачем ты проверяеш isset($error)?


Dapf форум Дизайнеров и разработчиков, где помогают!


Сообщение отредактировал Habilis - Вторник, 08 Июля 2014, 22:49
dima9595Дата: Суббота, 12 Июля 2014, 16:31 | Сообщение # 13
почти ветеран
Сейчас нет на сайте
Переписал весь код:
Код

<?php
## Настройки
session_start();    // Запускаем сессию

error_reporting('E_ALL');
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

## Подключения
require_once('engine/core.php');    // Подключаем движок

class Auth extends DB{

  function auth_login(){
   if(isset($_POST['login_users'])){
    $db = new DB();

    ## Получаем данные
    $login = $_POST['login'];
    $password = $_POST['password'];
    ## Защищаем данные
    $login = htmlspecialchars($login);
    $login = htmlspecialchars($login);
    $password = stripcslashes($password);
    $password = stripcslashes($password);
    $login = mysql_real_escape_string($login);
    $password = mysql_real_escape_string($password);

    ## Проверка на введённость
    if($login == ''){
     $bad = 1;
     $error_auth .= 'Введите логин!<br>';
    }
    if($password == ''){
     $bad = 1;
     $error_auth .= 'Введите пароль!<br>';
    }

    ## Проверка на существования данных в БД, а так же авторизация
    if(!isset($_SESSION['login'])){
     if($bad != 1){
      ## Хэшируем пароль
      $password = md5(md5($password . 'kdaoriginname.ru'));

      ## Проверяем данные в БД
      $db->select($tables = "id_users, login_users, password_users", $table = "users", $where = "WHERE login_users = '$login'", $sort = "");
      $db->fetch_array();
      if($db->fetch_array['password_users'] == $password){
       $_SESSION['id_users'] = $db->fetch_array['id_users'];
       $_SESSION['login_users'] = $login;
       $bad = 2;
       $success_auth = 'Вы успешно авторизовались! Теперь вы можете перейти в <a href="/users?id='.$_SESSION['id_users'].'">личный кобинет</a>.<br>';
      }else{
       $error_auth = 'Вы не авторизованы!<br>';
      }
     }
    }else{
     $bad = 1;
     $error_auth = 'Вы уже авторизованы!<br>';
    }

    if($bad == 1){
     echo '<div class="brd">';
     echo $error_auth;
     echo '</div>';
    }
    if($bad == 2){
     echo '<div class="brd">';
     echo $success_auth;
     echo '</div>';
    }
   }
  }
}
$auth = new Auth();
?>
<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="templates/default/css/cloudcss003.css">
  <title>Авторизация</title>
</head>
<body>

<div class="container">
  <div class="row">
    
   <div class="grid2">
    <?php require_once('templates/default/left.php'); ?>
   </div>

   <div class="grid10">
    <?php $auth->auth_login(); ?>

    <div class="brd">
     <h3>Авторизация</h3>
     <div class="line-solid"></div>
     <form class="form-vert" action="/login" method="POST">
      <div class="form-group">
       <label class="form-label" for="login">Логин:</label>
       <div class="controls">
        <input type="text" name="login" placeholder="Введите ваш логин">
       </div>
      </div>

      <div class="form-group">
       <label class="form-label" for="password">Пароль:</label>
       <div class="controls">
        <input type="text" name="password" placeholder="Введите ваш пароль">
       </div>
      </div>

      <div class="form-group">
       <div class="controls">
        <button type="submit" name="login_users" class="btn btn-info">Войти</button>
       </div>
      </div>
     </form>
    </div>
   </div>

   <div class="grid12">
    <?php require_once('templates/default/footer.php'); ?>
   </div>

  </div>
</div>
   
</body>
</html>


Но теперь постоянно пишет: Доступно только для пользователей
При чём во всех местах, где есть bad переменная...

Уже голова не варит. Целый день мучаюсь... Помогите плиз!


FolleahДата: Суббота, 12 Июля 2014, 16:38 | Сообщение # 14
Архитектор
Сейчас нет на сайте
Я не знаю, что тебе посоветовать... Я максимум это фиксил за день, при нулевых знаниях в пхп.

dima9595Дата: Суббота, 12 Июля 2014, 17:27 | Сообщение # 15
почти ветеран
Сейчас нет на сайте
Folleah, был бы это процедурный подход - то таких ошибок, наверное, не было. Я просто недавно начал переписывать под ООП.

atorisДата: Суббота, 12 Июля 2014, 17:51 | Сообщение # 16
участник
Сейчас нет на сайте
Цитата dima9595 ()
Folleah, был бы это процедурный подход - то таких ошибок, наверное, не было. Я просто недавно начал переписывать под ООП.

То, что вы весь код засунули меж строчек class{...}, не означает что вы пишете под ООП, зачем создавать ссылку на BD $db = new DB(); если вы и так наследуете класс DB class Auth extends DB?


Вступайте в групу
dima9595Дата: Суббота, 12 Июля 2014, 19:58 | Сообщение # 17
почти ветеран
Сейчас нет на сайте
Цитата atoris ()
То, что вы весь код засунули меж строчек class{...}, не означает что вы пишете под ООП

Знаю, я имел ввиду то, что я стараюсь перейте на ООП.
Цитата atoris ()
зачем создавать ссылку на BD $db = new DB();

Я конечно мало знаю об ООП, но почему-то без этой строчки код не работал.


atorisДата: Суббота, 12 Июля 2014, 21:19 | Сообщение # 18
участник
Сейчас нет на сайте
Цитата dima9595 ()
Я конечно мало знаю об ООП, но почему-то без этой строчки код не работал.

а вместо $db-> поставить $this-> например вместо $db->fetch_array(); $this->fetch_array(); ?
если мы наследуем какой то класс, то можем напрямую обращаться к его методам, если они не приватные



Вступайте в групу
dima9595Дата: Воскресенье, 13 Июля 2014, 12:32 | Сообщение # 19
почти ветеран
Сейчас нет на сайте
Цитата atoris ()
а вместо $db-> поставить $this-> например вместо $db->fetch_array(); $this->fetch_array(); ?
если мы наследуем какой то класс, то можем напрямую обращаться к его методам, если они не приватные

большое спасибо за совет, учту...скоро проверю!


  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг