Я пытаюсь сделать систему входа в систему, используя AES_ENCRYPT()
для кодирования моего пароля. Но у меня есть предупреждение от xdebug при попытке реализовать эти коды:
... $key = 'd0gis=SUPER-cute'; $sql = "SELECT * FROM `users2` WHERE username = ? AND pwd = AES_ENCRYPT(?, ?)"; $stmt = $conn->stmt_init(); $stmt->prepare($sql); $stmt->bind_param('sss', $username, $password, $key); $stmt->execute(); $stmt->store_result(); ...
Когда отладчик соответствует строке 8 или $stmt->prepare($sql);
, 6 одинаковых таблиц предупреждений от xdebug говорят:
(!) Внимание: main (): доступ к свойствам еще не разрешен в D: \ xampp \ htdocs \ learnphp \ includes \ authenticate_mysqli.inc.php в строке 8
Свойство error в $stmt
пустое, и у меня нет реальной проблемы, но я просто хочу знать, для чего это сообщение появляется.
Это сообщение было отправлено в Google, но не найдено ни одного решения:
Возможно, ваше соединение с mysql не установлено. После mysqli::__construct()
вы должны проверить mysqli::$connect_error
, который был взломан для некоторых версий PHP:
Свойство mysqli-> connect_error работает корректно только с PHP версий 5.2.9 и 5.3.0. Используйте функцию mysqli_connect_error (), если требуется совместимость с более ранними версиями PHP.
См. Табличку подключения котла из документации mysqli::__construct()
:
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); /* * This is the "official" OO way to do it, * BUT $connect_error was broken until PHP 5.2.9 and 5.3.0. */ if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); } /* * Use this instead of $connect_error if you need to ensure * compatibility with PHP versions prior to 5.2.9 and 5.3.0. */ if (mysqli_connect_error()) { die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); }
EDIT: Я считаю, что проблема, которую я описываю ниже, является причиной проблемы, описанной в OP, однако, поскольку проблема, которую я описываю в моем ответе, не дает точного сообщения об ошибке, я больше не уверен, что это лучший ответ.
Кроме того, я заметил это из раздела комментариев к документам PHP:
Этот параметр (и, предположительно, любой другой параметр в mysqli_stmt) вызовет ошибку с сообщением «Доступ к ресурсу еще не разрешен», если инструкция не была подготовлена должным образом или вообще не подготовлена.
Чтобы этого избежать, всегда убедитесь, что возвращаемое значение оператора «подготовить» истинно до доступа к этим свойствам.
Исходный ответ: Это предупреждение возникает, когда вы пытаетесь оценить некоторые объекты (экземпляр класса) в виде строки.
Ваш отладчик / IDE пытается оценить одну из ваших переменных ($ stmt), может быть, в списке часов или стека вызовов и не может быть оценен как строка.
Если вы используете print_r
для переменной, вы получите ту же ошибку, потому что PHP не может превратить ее в строку.
В вашем случае это $ stmt, что PHP не может превратиться в строку.
Поместите этот код в строку 7, и вы увидите там ошибку:
print_r($stmt);
Несколько примечание: у меня никогда не было этой проблемы до недавнего времени. В последнее время я получаю много. Почему php просто не пропускает недоступные свойства и печатает остальные? Я считаю, что это связано с областью свойств или использованием геттеров / сеттеров, но я пока не совсем уверен. Я уточню, когда выберем эту часть.
из официальной документации PHP: ( http://php.net/manual/en/language.oop5.magic.php#object.tostring )
Метод __toString () позволяет классу решать, как он будет реагировать, когда он обрабатывается как строка. Например, какое echo $ obj; будет печатать. Этот метод должен возвращать строку, так как в противном случае испускается ошибка уровня E_RECOVERABLE_ERROR …
… Стоит отметить, что до PHP 5.2.0 метод __toString () вызывался только тогда, когда он был непосредственно объединен с эхом или печатью. Начиная с PHP 5.2.0, он вызывается в любом контексте строки (например, в printf () с модификатором% s), но не в контексте других типов (например, с модификатором% d). Поскольку PHP 5.2.0, преобразование объектов без метода __toString () в строку приведет к E_RECOVERABLE_ERROR.