Неопределенная ошибка переменной в PHP - PullRequest
3 голосов
/ 26 мая 2009
Notice: Undefined variable: username in C:\xampp\htdocs\test_class.php
        on line 20
Notice: Undefined variable: password in C:\xampp\htdocs\test_class.php
        on line 20

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

<?php
    class test_class {

        public function __construct() { 

        }
        public function doLogin() {

            include("connection.php");

            if (isset($_POST['username']))
                {
                $username= $_POST['username'];
                }
                if (isset($_POST['password']))
                {
                $password= $_POST['password'];
                } 

            $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
            $result = mysql_fetch_array(mysql_query($query));
            if(!$result)

            {

            return 'assa';

            }else{

            return 'assa112121212';

            }

                }
        }
?>

Ответы [ 6 ]

11 голосов
/ 26 мая 2009

Это, скорее всего, означает, что ваша форма не была отправлена. Вы должны убедиться, что вы используете переменные, только если они существуют. Кроме того, вы никогда не должны использовать входные данные пользователей без их проверки. Попробуйте следующее, например:

if (isset($_POST['username']) && isset($_POST['password']))
{
    $username= $_POST['username'];
    $password= $_POST['password'];
    $query = "SELECT *
                      FROM users
                      WHERE username = '".mysql_real_escape_string($username)."'
                      AND password = '".mysql_real_escape_string($password)."'";
    $result = mysql_fetch_array(mysql_query($query));
    # ...
}
else
{
    return NULL;
}
10 голосов
/ 26 мая 2009

Это просто уведомление о том, что на переменные ссылаются в запросе, не находясь в области действия.

Определите $ username и $ password в верхней части doLogin () и инициализируйте их как Null или аналогичные. Затем проверьте их позже.

Вы также, похоже, выполняете запрос независимо от установленных $ username и $ password. Вы должны сделать что-то вроде:

if( isset($_POST['username']) && isset($_POST['password'])){
     //create vars, do query
}else{
     // Nothing to process
}

Обе ошибки происходят в строке 20, которая, как я полагаю, является интерполяцией строки запроса. Проблемы здесь:

  1. несовместимая область видимости / ссылки (что в любом случае не работает в PHP)
  2. Ваши слова должны быть более упорядоченными. Эта ошибка невелика, но худшие будут кусать вас позже, если вы будете обрабатывать переменные следующим образом:)

Также: экранируйте свои переменные перед тем, как выбросить их как горячие угли в ваш SQL см. PDO (который я бы выбрал) или mysql_escape_string ()

удачи !

3 голосов
/ 26 мая 2009

Еще один счастливый класс и без ошибок:)

<?php
class test_class
{
    private $post = array();
    public function __construct ()
    {
    }
    public function doLogin ()
    {
        $this->post = $_POST;
        include ("connection.php");
        if ($this->post['username'] && $this->post['password']) {
            $username = $this->post['username'];
            $password = $this->post['password'];
            $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
            $result = mysql_fetch_array(mysql_query($query));
            if (! $result) {
                return 'assa';
            } else {
                return 'assa112121212';
            }
        }
    }
}
?>
1 голос
/ 26 мая 2009

Вы также проверяете базу данных, указаны ли имя пользователя и пароль.

Возможно, что-то вроде этого;

public function doLogin() {

    include("connection.php");
    $username = (isset($_POST['username'])) ? $_POST['username'] : NULL ;
    $password = (isset($_POST['password'])) ? $_POST['password'] : NULL ;
        if ( $username !== NULL && $password !== NULL )  {
                    $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
                    $result = mysql_fetch_array(mysql_query($query));
            /* auth code here */

        } else {
        return false; // no u/p provided    
    }

    }

Вы также должны экранировать свои входные данные, прежде чем размещать их где-нибудь рядом с базой данных, используя mysql_real_escape_string или PDO (объекты данных PHP)

1 голос
/ 26 мая 2009
<?php
class test_class {

    public function doLogin() {
        include("connection.php");

        if (isset($_POST['username']) && isset($_POST['password']) {
            $username = $_POST['username'];
            $password = $_POST['password'];

            $query = "SELECT * ".
                     "FROM users " .
                     "WHERE username = '$username' ".
                     "  AND password = '$password'";
            $result = mysql_fetch_array(mysql_query($query));
            if(!$result) {
               return 'assa';
            } else {
               return 'assa112121212';
            }
        } else {
            echo "Missing parameter 'username' and/or 'password'";
        }
    }
}

Кроме того, вы должны бежать $ username и $ пароль , чтобы избежать sql инъекций атак.

0 голосов
/ 26 мая 2009

Вы захотите использовать error_reporting (E_ALL ^ ​​E_NOTICE); со страницы, на которую ссылается Сэм. Уведомления действительно не нужны, и все равно что использовать флаги WALL и WERROR с gcc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...