Вызов функции-члена bind_param() для не-объекта
Я пытаюсь связать переменную в этом подготовленном операторе, но я продолжаю получать ошибку:
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);
}
Я знаю, что функция здесь не полностью написана, но это не должно быть проблемой. Я не понимаю, почему я получаю эту ошибку.
Ответы
Ответ 1
как говорится в сообщении об ошибке, $qSelect
кажется не объектом. попробуйте отладить это, используя var_dump($qSelect);
сразу после вашего вызова. также проверьте, возвращает ли getDBH()
то, что вам нужно.
звучит так, как вызов метода подготовки не работает (не знаю почему), и поэтому он возвращает false
- false
не объект, поэтому вы не можете вызвать bind_param()
.
EDIT: вы не указали информацию, но похоже, что вы используете PHP PDO. В этом случае посмотрите документацию.
Если сервер базы данных успешно готовит выражение, PDO:: prepare() возвращает объект PDOStatement. Если сервер базы данных не может успешно подготовить выражение, PDO:: prepare() возвращает FALSE или испускает PDOException (в зависимости от обработки ошибок).
Вы должны настроить ваш сервер для возврата тех исключений PDO, которые расскажут вам, почему вызов подготовки не выполняется.
Ответ 2
Ну, одна из причин неудачи prepare() -
if the sql statement sent to it is not valid in the current DB.
prepare() вернет false.
Например - если имя таблицы неверно или одно или несколько полей в запросе не существует.
Ответ 3
Я также использую подход 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;
Ответ 4
Похоже, что подготовка довольно глупая. Он не полагается на запрос полностью на сторону MySQL, я имею в виду, если в вашем запросе у вас есть таблица, которая имеет одно и то же имя ключевого слова, например "пользователь", "порядок",..., он просто не распознает его как таблицу, а скорее как то, что действительно выполняют команды ключевых слов, поэтому запрос оказывается беспорядочным, и подготовка просто терпит неудачу.
Чтобы исправить это просто, вы должны ввести его в "правильный" способ добавления "`) в обе стороны имени таблицы. Пример:
`user`, `order`, `...`
Это правильно, но я нахожу глупым, чтобы подготовиться к этому поведению.
Ответ 5
Проверьте разрешения пользователя в базе данных. Пользователь без разрешения "вставить" вызывает "При попытке вставить." Также вызывает вызов функции-члена bind_param() при ошибке "не-объект".
Ответ 6
Только для того, чтобы помочь людям без опыта работы на PHP, как я.
В моем случае эта ошибка возникла из-за ошибки SQL sintax. Трассировка стека консоли не показывает эту проблему.
Когда я исправил SQL, процесс прошел нормально.