Intereting Posts
доступ к статическим методам с использованием имени класса переменной (PHP) WooCommerce: добавьте пользовательскую ссылку Metabox на страницу администрирования Вход, выход и продолжительность времени в php и mysql? Цикл Foreach с использованием строки для вывода XML Присоединиться к трем таблицам Обеспечить читаемое человеком представление идентификатора? Как объявить глобальную переменную в PHP, которую я могу использовать во всех шаблонах? Как реализовать переход к <a name = … в форме сообщения Лучший способ записи массивов в файл? PHP RegExp для вложенных тегов Div Как проверить, имеет ли изображение прозрачность с помощью GD? Файлы PHP загружаются браузером вместо обработки локальным dev-сервером (MAMP) Как установить местозаполнитель в drupal 7 в форме входа в систему как защитить папку uploads с .htaccess, чтобы разрешать только изображения на сайте wordpress Специальные символы в PHP / MySQL

PHP – Неустранимая ошибка: вызов функции-члена bind_param ()

Я тянул свои волосы в этом запросе MySQL.

Предположим, у меня это:

$add = "INSERT INTO books (title) VALUES(?)"; if ($stmt = $mysqli->prepare($add)) { $arr = array($title); foreach ($arr as $value) { echo var_dump($value); } $stmt->bind_param("s", $title); 

С этим foreach -> var_dump :

 string 'Medieval Times (History)' (length=24) int 1422843281 int 1420844341 string '127.0.0.1' (length=9) string 'MY_EMAIL@gmail.com' (length=22) string '' (length=0) int 1420844805 int 6 int 3 int 1 int 0 int 0 int 1 int 1 int 1 int 1 

Ну, он останавливается, когда попадает в эту строку, и я получаю эту ошибку:

Fatal error: Call to a member function bind_param() on a non-object in C:\wamp\www\books\dashboard.php on line 386

С строкой 386: $stmt->bind_param ...

Итак, я знаю, что импортирую 16 переменных … Я получаю эту ошибку. Argh.

TL \ DR

Ваш запрос не prepare() . Вам нужно выяснить, где, как и почему. Посмотрите на последний блок кода этого ответа и сообщите нам, что такое ошибка.


Я начну с запроса. Вы пытаетесь получить доступ к зарезервированному слову MySQL MySQL (см. # 684) . Вам нужно обернуть их в backticks следующим образом:

 $add = "INSERT INTO books (title, edited, created, ip,". " email_to, twitter, last_taken, questions_total, responses, ". "show_progress, need_correct, go_back, state, send_stats, ". "show_number, imported) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ". "?, ?, ?, ?, ?, ?, ?)"; 

Теперь вы создаете переменную $stmt в блоке if но затем пытаетесь связать ее за пределами этого блока. Вам нужно будет изменить это:

 if ($stmt = $mysqli->prepare($add)) { .... } $stmt->bind_param(....); 

К этому:

 if ($stmt = $mysqli->prepare($add)) { .... $stmt->bind_param(....); } 

Кроме того, убедитесь, что ваш запрос действительно правильно подготовлен:

 if ($stmt = $mysqli->prepare($add)) { $stmt->bind_param("siisssiiiiiiiiii", $title, $edited, $created, $ip, $email_to, $twitter, $last_taken, $questions_total, $responses, $show_progress, $need_correct, $go_back, $state, $send_stats, $show_number, $importedVal); // execute it and all... } else { die("Errormessage: ". $mysqli->error); } 

Тогда дайте нам знать, что получится.

Попробуйте следующее

 $stmt->bind_param(array("siisssiiiiiiiiii", $title, $edited, $created, $ip, $email_to, $twitter, $last_taken, $questions_total, $responses, $show_progress, $need_correct, $go_back, $state, $send_stats, $show_number, $importedVal)); 

Отредактировано: попробуйте это

 if ($stmt = $mysqli->prepare($add)) { $stmt->bind_param($arr); } else { printf("Errormessage: %s\n", $mysqli->error); } 

http://php.net/manual/en/mysqli-stmt.bind-param.php

У вас возникла проблема с вашим подготовленным оператором из-за ошибки в вашем SQL. Поскольку у вас есть подчеркивания в именах ваших полей, я почти гарантирую, что проблема заключается в том, что prepare бросает шаткое впечатление на вас, не обертывая их в «отметки» (я забываю фактическое имя мельчайшего апострофа ). Поэтому вам нужно;

 $add = "INSERT INTO books (title, edited, created, ip,". " `email_to`, `twitter`, `last_taken`, `questions_total`, `responses`, ". "`show_progress`, `need_correct`, `go_back`, `state`, `send_stats`, ". "`show_number`, `imported`) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ". "?, ?, ?, ?, ?, ?, ?)"; 

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

Надеюсь это поможет.

Возможно, две вещи.

  1. Является ли $mysqli недоступным? Другими словами, вы используете $mysqli в функции, но не переданы этой функции, или она не объявлена ​​глобальной в этой функции?
  2. В вашей таблице есть любой из столбцов INT не INT ? может ли любой из них быть smallint , mediumint или mediumint ? Тогда ваши значения слишком велики.