Предупреждение «Доступ к ресурсу еще не разрешено» при использовании подготовленного оператора

Я пытаюсь сделать систему входа в систему, используя 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, но не найдено ни одного решения:

  1. Запрос UPDATE с подготовленными операциями
  2. http://php.net/manual/en/mysqli-stmt.param-count.php

Возможно, ваше соединение с 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.