我有一个脚本,它插入到两个独立的数据库表中:配料和方向。对于第一个,我使用$this->db->query($sql)
,对于第二个:$this->db->query($sql2)
(我使用CodeIgniter(。这是我的代码:
foreach($_POST as $key => $value) {
$value = $this->input->post($key);
$directions = $this->input->post('directions');
$ingredientQTY = $this->input->post('ingredientQTY');
$measurements = $this->input->post('measurements');
$ingredientNAME = $this->input->post('ingredientNAME');
$ingredientsROW[] = array($ingredientQTY, $measurements, $ingredientNAME);
//For inserting ingredients
for ($i = 0, $count = count($ingredientQTY); $i < $count; $i++) {
$rows[] = array(
'ingredientamount' => $ingredientQTY[$i],
'ingredientType' => $measurements[$i],
'ingredientname' => $ingredientNAME[$i],
'recipe_id' => $recipe_id,
'order' => $i + 1,
'user_id' => $user_id
);
$sql = "INSERT `ingredients` (`ingredientamount`,`ingredientType`,`ingredientname`,`recipe_id`, `listOrder`, `user_id`) VALUES ";
$coma = '';
foreach ($rows as $oneRow) {
$sql .= $coma."('".implode("','",$oneRow)."')";
$coma = ', ';
}
}
$this->db->query($sql);//Insert Query for ingredients
//For inserting directions
for ($i = 0, $count = count($directions); $i < $count; $i++) {
$rows[] = array(
'direction' => $directions[$i],
'recipe_id' => $recipe_id,
'order' => $i + 1,
'user_id' => $user_id
);
$sql2 = "INSERT `directions` (`direction`,`recipe_id`,`listOrder`,`user_id`) VALUES ";
$coma = '';
foreach ($rows as $oneRow) {
$sql2 .= $coma."('".implode("','",$oneRow)."')";
$coma = ', ';
}
}
$this->db->query($sql2); //Insert Query for directions
break;
}
我应该有两个独立的sql语句,但由于某种原因,它们被组合到了中,并生成了以下错误:
Column count doesn't match value count at row 1
INSERT `directions` (`direction`,`recipe_id`,`listOrder`,`user_id`) VALUES ('1','Bunch','Cilantro','1','1','1'), ('3','Cup','Sugar','1','2','1'), ('First, combine the cilantro and sugar','1','1','1'), ('then eat. ','1','2','1')
应该也有一个INSERT ingredients
,但是它的值被合并到INSERT directions
语句中。
为什么要将这两个SQL语句组合在一起?
代码的前半部分构建$rows
以插入所有成分,然后后半部分构建$rows
以插入所有方向,但它从不清除中间的$rows
。当你去做指示时,配料仍然在阵列中。
此外,我认为您调用SQL的频率太高了。您的for $i
循环和foreach $rows
循环不应该嵌套;它们应该是一个接着一个。试试这样的东西:
for ($i = 0, $count = count($ingredientQTY); $i < $count; $i++) {
$rows[] = array(
'ingredientamount' => $ingredientQTY[$i],
'ingredientType' => $measurements[$i],
'ingredientname' => $ingredientNAME[$i],
'recipe_id' => $recipe_id,
'order' => $i + 1,
'user_id' => $user_id
);
} // <-- FIRST FOR LOOP SHOULD END HERE
$sql = "INSERT `ingredients` (`ingredientamount`,`ingredientType`,`ingredientname`,`recipe_id`, `listOrder`, `user_id`) VALUES ";
$coma = '';
foreach ($rows as $oneRow) {
$sql .= $coma."('".implode("','",$oneRow)."')";
$coma = ', ';
}
// } <-- FIRST FOR LOOP USED TO END HERE; PROBABLY NOT RIGHT
$this->db->query($sql);//Insert Query for ingredients
$rows = array(); // <-- Clear out $rows to reuse it for directions
清除$rows
阵列后,您可以继续执行指示。和配料一样,把环一个接一个地放在一起,而不是嵌套。
$sql2 = "INSERT directions ('direction','recipe_id','listOrder','user_id') VALUES ";
第一组括号指定了4列,但您尝试插入6个值。
固定代码:
$sql2 = "INSERT INTO directions VALUES ";