Привет, у меня есть поле формы 70/80, которое мне нужно вставить в таблицу, вместо того, чтобы вручную создать один огромный оператор вставки. Сначала я создал таблицу в моем db из имен входов в форме, вот код, который я использовать для создания / изменения таблицы
function createTable($array, $memberMysqli) { foreach ($array as $key => $value) { //echo "<p>Key: ".$key." => Value: ".$value . "</p>"; $query = "ALTER TABLE questionnaire ADD ".$key." text"; if($stmt = $memberMysqli->prepare($query)) { $success = $stmt->execute(); } } echo "<h1>Array count: ". count($array) ."</h1>" ; } Это прекрасно работает и изменило таблицу именно так, как я ее хотел. Теперь, чтобы вставить значения формы, чтобы сделать это, я делаю базовую одну вставку поля, хранящую идентификатор строки, а затем зациклирую все пост-переменные, обновляющие эту строку. Вот мой код для этого:
 $stmt = $memberMysqli->prepare("INSERT INTO questionnaire(userid) VALUES (?)"); $stmt->bind_param('s', $_POST['userid']); $stmt->execute(); $rowid = $stmt->insert_id; $stmt->close(); $memberMysqli->autocommit(FALSE); function updateColumn($memberMysqli, $query, $uid, $value) { if ($value) { $stmt = $memberMysqli->prepare($query); //Throws bind param error here $stmt->bind_param("ss", $value, $uid); $stmt->execute(); } } function loopInputs($array, $memberMysqli, $rowid) { foreach ($array as $key => $formvalue) { var_dump($key); updateColumn($memberMysqli, "UPDATE questionnaire SET $key = ? WHERE id = ?", $rowid, $formvalue); } } loopInputs($_POST, $memberMysqli, $rowid); $memberMysqli->commit(); $memberMysqli->close(); 
Это вызывает ошибку привязки параметра, и я понятия не имею, почему. Любая помощь будет большой.
О, давайте попробуем канонический ответ.
  Call to a member function (или expects parameter 1 to be mysqli_result, boolean given для процедурного стиля) не является самой ошибкой, а просто симптомом для какой-либо другой проблемы. 
  Это сообщение об ошибке означает, что объект не был создан там, где должен. 
  Итак, возникла проблема с созданием объекта $stmt . 
  Скорее всего, это проблема с запросом.  Итак, нам нужно отслеживать эту ошибку. 
  Mysqli не скажет вам, что происходит, если не спросить явно.  Таким образом, вы всегда должны проверять результат каждой функции mysqli, взаимодействующей с сервером, и если результат FALSE – проверьте $mysqli->error . 
Также очень важно преобразовать сообщение об ошибке mysqli в PHP-ошибку, чтобы оно соответствовало настройкам отчетов об ошибках на сайте.
  Если вы используете mysqli_query () по всему программному коду, не инкапсулируя его в какой-либо вспомогательный класс, trigger_error() – хороший способ поднять PHP-ошибку, так как он скажет вам также файл и номер строки, где произошла ошибка 
  Итак, все ваши вызовы prepare() , execute () и query() должны быть написаны следующим образом: 
 $stmt = $mysqli->prepare($query) or trigger_error($mysqli->error."[$query]"); 
или в процедурном стиле
 $res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]"); 
  во всех ваших сценариях 
  и с тех пор вы будете уведомлены о причине, почему объект не был создан.  (Если вам интересно это or синтаксис, я объяснил это здесь ). Обратите внимание, что запрос также включен в сообщение об ошибке, чтобы вы могли визуально осмотреть его и протестировать в другой среде. 
Однако , если вы инкапсулируете свой запрос в какой-либо класс, файл и строка из ошибки запуска будут совершенно бесполезны, поскольку они укажут на сам вызов, а не на код приложения, который вызвал определенную проблему. Таким образом, при запуске команд mysqli инкапсулируется другой способ:
 $result = $mysqli->query($sql); if (!$result) { throw new Exception($mysqli->error." [$query]"); } 
поскольку Exception предоставит вам трассировку стека , которая приведет вас к тому месту, откуда был вызван ошибочный запрос.
Обратите внимание, что вы должны уметь видеть ошибки PHP вообще. На реальном сайте вам нужно заглянуть в журналы ошибок, поэтому настройки должны быть
 error_reporting(E_ALL); ini_set('display_errors',0); ini_set('log_errors',1); 
в то время как на локальном сервере разработки все правильно делать ошибки на экране:
 error_reporting(E_ALL); ini_set('display_errors',1); 
и, конечно, никогда не следует использовать оператор подавления ошибок (@) перед вашими утверждениями.