所以我很困惑这个问题。我正在使用PHP
向此AJAX
文件发送帖子,它将获取我的数组,对其进行反转,对其进行分块,然后使用它来绑定值。每个块都有一行值来更新,因此for循环的每次迭代都会更新一行。
我第一次尝试这个时使用了以下代码。
if(isset($_POST['saveEdits'])) {
$i = 0;
$j = 1;
$update = array();
$update = $_POST['saveEdits'];
$chunk_count = count($update)/7;
$backwards = array_reverse($update);
$chunks = array_chunk($backwards, 7);
try {
for($i; $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());
}
} else {
echo 'could not update projects table';
}
我每次都会收到以下错误
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\core\functions\update_projects.php on line 31
所以有人建议我改变
$i = 0;
到
$i = 1;
这种方式有效。这允许我插入一次数据,但不插入所有数据。这个在所有中起作用的事实令我感到困惑。 $ i是我的循环索引和块索引的持有者。它需要从0开始 - 无论如何。我不明白从1开始有助于以任何方式。 $ j是param binder的持有者,应该从1开始。
一些额外的信息。如果我var_dump(chunks [0])和var_dump(chunks [1])我看到以下
array(7) { [0]=> string(13) "more comments" [1]=> string(9) "jimmy doe" [2]=> string(6) "1-1-14" [3]=> string(7) "12-1-13" [4]=> string(9) "janey doe" [5]=> string(9) "jonny doe" [6]=> string(2) "17" }
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" }
所以回顾一下。 $i = 0
我将错误提到最前面,$i = 1
我插入一行就结束了。有人可以告诉我这里发生了什么吗?任何帮助表示赞赏
答案 0 :(得分:2)
您的代码存在多个问题。但主要问题是您尝试将阵列拆分为块的方式。假设你的代码中有10个项目,给定你的代码$chunk_count = count($update)/7;
,这将给我们一个块数1.4285 ...,大于1但小于2.然后在你的循环中,我会期待它如果$i = 1;
只运行一次,因为第一次通过循环,1&lt; 1.x,但第二次2> 1.x的。
你打算通过分解这个数组来实现什么?直接处理它。请记住尽可能保持简单。
答案 1 :(得分:1)
保持简单。这对我有用。这仍然让我对原始问题感到疑惑,但是很好。
$backwards = array_reverse($update);
$chunks = array_chunk($backwards, 7);
$n = 0;
try {
$update_project = $db->prepare('
UPDATE projects
SET comments = ?,
contact = ?,
est_end = ?,
est_start = ?,
apm = ?,
pm = ?
WHERE id = ?
');
foreach ($chunks as $chunk) {
$update_project->execute($chunk);
$n += $update_project->rowCount();
}
echo 'Projects Updated, affected ' . $n . ' rows';
} catch(PDOException $e) {
die($e->getMessage());
}
这个答案归功于Bill Karwin here