PHP MySQL-запросы и PHP-переменные

0

Я пытаюсь создать систему входа OO для проекта, над которым я работаю, и возникают проблемы с вставкой переменных в строки запроса. В приведенном ниже коде, если я заменил "$ TBL_NAME" на фактическое имя таблицы, он будет работать. Почему нет $TBL_NAME, переводящего значение $TBL_NAME?

class UserDB {

  private $TBL_NAME = "users";

  public static function CheckLogin($username, $password) {

    Database::Connect();

    $username = stripslashes($username);
    $password = stripslashes($password);
    $username = mysql_real_escape_string($username);
    $password = mysql_real_escape_string($password);

    $sql="SELECT uid FROM $TBL_NAME WHERE username='$username' AND password='$password' ";
    $result =mysql_query($sql);
    $count=mysql_num_rows($result);
    if ($count==1)
      return true;
    else
      return false;
  }

Запрос возвращает false.

  • 0
    Вы всегда можете сделать "echo $ sql;" чтобы увидеть, что вы строите. :) Но ты знал это.
  • 0
    даже не думал об этом, спасибо, я чувствую себя идиотом :)
Показать ещё 1 комментарий
Теги:
variables

2 ответа

-1
Лучший ответ

Объявить $TBL_NAME как private static, а не только private и использовать self::$TBL_NAME. Не уверен в синтаксисе внутри строки - Id использует вместо этого оператор конкатенации (т.е. "SELECT uid FROM " . self::$TBL_NAME . " WHERE …"

  • 0
    Кроме того, вы должны использовать stripslashes только в stripslashes случае, если get_magic_quotes_gpc() имеет значение true , а значение get_magic_quotes_gpc() из $_GET , $_POST , $_COOKIE или $_REQUEST - выполнение этого в вашем классе базы данных - ужасная дырявая абстракция.
  • 0
    Также обратите внимание, что mysql_num_rows() выдаст предупреждение, если $result не является допустимым ресурсом результатов. Кроме того, вы никогда не должны хранить пароли в открытом виде! Получите строку и используйте сохраненный пароль в качестве соли при хешировании предоставленного (сравните результат этой операции хеширования с сохраненным паролем и верните true если они совпадают - см. crypt() )
2

Немного больше о том, почему ваш код не работал: синтаксис Php OO требует использования квалификатора для переменных экземпляра и класса. Другими словами, вы не можете оставить 'this' как на других языках.

Если ваш метод CheckLogin не был статическим, переменная $TBL_NAME по-прежнему не будет установлена ​​внутри функции. Чтобы получить переменную экземпляра, вам нужно будет использовать $this->TBL_NAME.

Поскольку ваш метод статический, он имеет доступ к статическим переменным, но не переменным экземпляра, поэтому вам нужно сделать переменную static. Как только вы это сделаете, вы можете получить к нему доступ с помощью self::, как в ответе Mo.

  • 0
    круто, я ценю дополнительную информацию. Похоже, у меня есть кое-что еще на других занятиях. Если я опущу $ this-> для переменных экземпляра, будет ли он просто создавать новые переменные в текущей области видимости?
  • 0
    Да .. внутренние переменные функции

Ещё вопросы

Сообщество Overcoder
Наверх
Меню