Я хотел бы обновить таблицу SQL
используя PHP
с PDO
. Однако я продолжаю получать следующую ошибку
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\core\functions\update_projects.php on line 31
Я просто не могу понять, где я ошибаюсь.
$j = 1; $chunk_count = count($update)/7; $backwards = array_reverse($update); $chunks = array_chunk($backwards, 7); var_dump($chunks[1]); try { for($i = 0; $i < $chunk_count; $i++ ) { $update_project = $db->prepare(' UPDATE projects SET comments = ?, contact = ?, est_end = ?, est_start = ?, apm = ?, pm = ? WHERE id = ? '); foreach ($chunks[$i] as $field => $val) { $update_project->bindValue($j++, $val, PDO::PARAM_STR); } $update_project->execute(); } echo 'Projects Updated'; } catch(PDOException $e) { die($e->getMessage()); }
Если я var_dump($chunks[1])
я вижу следующие значения
array(7) { [0]=> string(13) "some comments" [1]=> string(7) "jim doe" [2]=> string(6) "1-1-14" [3]=> string(7) "12-1-13" [4]=> string(8) "jane doe" [5]=> string(7) "jon doe" [6]=> string(2) "16" }
Итак, где проблема в моем коде? Любая помощь приветствуется
Это правда, SQL-параметры начинают нумерацию с 1 (я не знаю, почему владелец этого ответа удалил его).
Нумерация параметров определена в стандарте SQL / CLI, который относится к 1980-м годам, до того как был изобретен номер нуль. 😉
Что касается того, почему ваш код не обновляется, я хотел бы убедиться, что значения id расположены там, где вы их ожидаете. После реверсирования и разбиения массива, если значение id не заканчивается в нужном месте, оно может попытаться обновить строки, но не будет соответствовать ни одному.
Вот альтернативный способ кодирования этой процедуры:
$backwards = array_reverse($update); $chunks = array_chunk($backwards, 7); var_dump($chunks[1]); try { $update_project = $db->prepare(' UPDATE projects SET comments = ?, contact = ?, est_end = ?, est_start = ?, apm = ?, pm = ? WHERE id = ? '); $n = 0; foreach ($chunks as $chunk) { $update_project->execute($chunk); $n += $update_project->rowCount(); } echo 'Projects Updated, affected $n rows'; } catch(PDOException $e) { die($e->getMessage()); }