Я пытаюсь связать переменную в этом подготовленном заявлении, но я продолжаю получать ошибку:
Call to a member function bind_param() on a non-object
Вызывается функция, и переменные передаются ей. Когда я изменяю функцию, чтобы просто откликнуться на переменную, переменная печатает на странице в порядке, но если я попытаюсь связать ее здесь, я получаю сообщение об ошибке. может ли кто-нибудь помочь?
//CALL FROM PAGE ONE check($username); //FUNCTION ON PAGE 2 function check($username){ $DBH = getDBH(); $qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?"); $qSelect->bind_param("s", $username); }
Я знаю, что функция здесь не полностью написана, но это не должно быть проблемой. Я не понимаю, почему я получаю эту ошибку.
как говорится в сообщении об ошибке, $qSelect
кажется не объектом. попробуйте отладить это, используя var_dump($qSelect);
сразу после вашего вызова. также проверьте, возвращает ли getDBH()
то, что вам нужно.
звучит так, как вызов bind_param()
подготовки не удается (не знаю почему), и поэтому он возвращает false
– false
не является объектом, поэтому вы не можете вызвать bind_param()
.
EDIT: вы не указали информацию, но похоже, что вы используете PDO PHP. В этом случае ознакомьтесь с документацией .
Если сервер базы данных успешно подготовит оператор, PDO :: prepare () возвращает объект PDOStatement. Если сервер базы данных не может успешно подготовить оператор, PDO :: prepare () возвращает FALSE или испускает PDOException (в зависимости от обработки ошибок).
Вы должны настроить сервер для возврата тех исключений PDO, которые расскажут вам, почему вызов подготовки не выполняется.
Ну, одна причина подготовки () может потерпеть неудачу –
if the sql statement sent to it is not valid in the current DB.
prepare () затем вернет false.
Например, если имя таблицы неверно или одно или несколько полей в запросе не существует .
Я также использую подход mysqli и получил ту же ошибку, когда я создал другой экземпляр mysqli перед закрытием первого экземпляра. Поэтому важно использовать close()
прежде чем запускать один и тот же код. Например:
$DBH = getDBH(); $qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?"); $qSelect->bind_param("s", $username); $qSelect->close(); // <--- use close before calling the same function( wich contains $DBH code) again;
Похоже, что подготовка довольно глупая. Он не полагается на запрос полностью на сторону MySQL, я имею в виду, если в вашем запросе у вас есть таблица, которая имеет одно и то же имя ключевого слова, например «пользователь», «порядок», … , он просто не распознает его как таблицу, а скорее как то, что действительно делают команды ключевых слов, поэтому запрос оказывается беспорядочным, и подготовка просто терпит неудачу.
Исправить это просто, вы должны ввести его «правильным» способом, добавив «` »в обе стороны имени таблицы. Пример:
`user`, `order`, `...`
Это правильно, но я нахожу глупым, чтобы подготовиться к такому поведению.
Проверьте разрешения пользователя в базе данных. Пользователь без разрешения «вставить» вызывает «Вызов функции-члена bind_param () при ошибке« не-объект »при попытке вставить.
Только для того, чтобы помочь людям без опыта работы на PHP, как я.
В моем случае эта ошибка возникла из-за ошибки SQL sintax. Трассировка стека консоли не показывает эту проблему.
Когда я исправил SQL, процесс прошел нормально.