Подтвердить что ты не робот

Вызов функции-члена 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);
}

Я знаю, что функция здесь не полностью написана, но это не должно быть проблемой. Я не понимаю, почему я получаю эту ошибку.

4b9b3361

Ответ 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, процесс прошел нормально.