Я пытаюсь создать систему входа 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.
Объявить $TBL_NAME
как private static
, а не только private
и использовать self::$TBL_NAME
. Не уверен в синтаксисе внутри строки - Id использует вместо этого оператор конкатенации (т.е. "SELECT uid FROM " . self::$TBL_NAME . " WHERE …"
stripslashes
только в stripslashes
случае, если get_magic_quotes_gpc()
имеет значение true
, а значение get_magic_quotes_gpc()
из $_GET
, $_POST
, $_COOKIE
или $_REQUEST
- выполнение этого в вашем классе базы данных - ужасная дырявая абстракция.
mysql_num_rows()
выдаст предупреждение, если $result
не является допустимым ресурсом результатов. Кроме того, вы никогда не должны хранить пароли в открытом виде! Получите строку и используйте сохраненный пароль в качестве соли при хешировании предоставленного (сравните результат этой операции хеширования с сохраненным паролем и верните true
если они совпадают - см. crypt()
)
Немного больше о том, почему ваш код не работал: синтаксис Php OO требует использования квалификатора для переменных экземпляра и класса. Другими словами, вы не можете оставить 'this' как на других языках.
Если ваш метод CheckLogin не был статическим, переменная $TBL_NAME
по-прежнему не будет установлена внутри функции. Чтобы получить переменную экземпляра, вам нужно будет использовать $this->TBL_NAME
.
Поскольку ваш метод статический, он имеет доступ к статическим переменным, но не переменным экземпляра, поэтому вам нужно сделать переменную static. Как только вы это сделаете, вы можете получить к нему доступ с помощью self::
, как в ответе Mo.