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 иф (если там ты не выпелил еще что-то конечно ) Код 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(); ? если мы наследуем какой то класс, то можем напрямую обращаться к его методам, если они не приватные большое спасибо за совет, учту...скоро проверю!
|
|
| |