Я тянул свои волосы в этом запросе 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.
Ваш запрос не 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); }
У вас возникла проблема с вашим подготовленным оператором из-за ошибки в вашем 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(?, ?, ?, ?, ?, ?, ?, ?, ?, ". "?, ?, ?, ?, ?, ?, ?)";
Я обернул все поля метками, поскольку это лучшая практика, но на самом деле это особый характер, который вызывает проблему в моем опыте.
Надеюсь это поможет.
Возможно, две вещи.
$mysqli
недоступным? Другими словами, вы используете $mysqli
в функции, но не переданы этой функции, или она не объявлена глобальной в этой функции? INT
не INT
? может ли любой из них быть smallint
, mediumint
или mediumint
? Тогда ваши значения слишком велики.