2017-01-23 88 views
0

我有一个表单将复选框提交给PHP PDO脚本。我有代码,如下将值存储到一个MySQL表使用PDO在mysql表中插入多个值

$stmt = $dbPDO->prepare("INSERT INTO group_members(g_id, em_id) 
         VALUES(:g_id,:em_id) 
         ON DUPLICATE KEY UPDATE g_id = :g_id, em_id = :em_id"); 
foreach ($_POST['id'] as $email) { 
    $stmt->bindParam(':g_id', $gid , PDO::PARAM_INT); 
    $stmt->bindParam(':em_id', $email , PDO::PARAM_STR); 
    $stmt->execute(); 
} 

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number'

这将产生错误。将多个值插入到具有不同值的mysql表中的最佳方法是什么?

+1

最好的方法是阅读手册'当您调用PDOStatement :: execute()时,您必须为每个希望传入语句的值包含一个唯一的参数标记。除非启用了仿真模式,否则不能在准备好的语句中多次使用同名的命名参数标记。 ' –

回答

1

每个指定的占位符都必须是唯一的!

$stmt = $dbPDO->prepare("INSERT INTO group_members(g_id, em_id) VALUES(:g_id,:em_id) ON DUPLICATE KEY UPDATE g_id = :g_id2, em_id = :em_id2"); 

$email=null; 
//just bind once, that the logic behind 'bind()' 
$stmt->bindParam(':g_id', $gid , PDO::PARAM_INT); 
$stmt->bindParam(':em_id', $email , PDO::PARAM_STR); 
$stmt->bindParam(':g_id2', $gid , PDO::PARAM_INT); 
$stmt->bindParam(':em_id2', $email , PDO::PARAM_STR); 

foreach ($_POST['id'] as $email) { 
    $stmt->execute();//write your rows 
} 
$stmt->close(); 
+0

'//只绑定一次,bind()后面的逻辑就是这个问题的关键。希望这可以帮助某人。我没有很好的信息来做这个评估。尽管@面值现在看起来很明显。该语句使用循环设置的绑定参数的当前值执行。因此,由循环设置的$ email的当前值是语句使用'没有在循环内部绑定参数的明确定义。'如果没有'仿真模式'是另一个,则无法重用它们。 – nrm

0

您不能重复使用占位符名称。您必须创建新的或在更新部分中使用VALUES:

$stmt = $dbPDO->prepare("INSERT INTO group_members(g_id, em_id) VALUES(:g_id,:em_id) ON DUPLICATE KEY UPDATE g_id = VALUES(g_id), em_id = VALUES(em_id)"); 
+0

这大多是正确的。如果你有仿真模式,那么你可以重新使用placholders – amflare

0

除非您打开了emulation mode,否则无法重复使用占位符。

一般来说,默认情况下PDO_MYSQL应该具有仿真功能。原因是MySQL对准备好的语句表现不佳。仿真工作速度明显加快。

也就是说,如果它不是出于某种原因,你可以使用手动设置:

$dbc->setAttribute(PDO::ATTR_EMULATE_PREPARES,true); 

事实上,如果你不知道,只是设置也无妨。

+0

从u_mulder的评论中注意到。 – JustOnUnderMillions

+0

@JustOnUnderMillions - 评论被认为是短暂的,所以我将它作为答案。 – amflare

+0

我想我可以在这里找到告诉你的人,你的回答可以是评论。 ;)快速评论。但是,一个好的答案也会告诉如果_emulation模式关闭,该怎么办_ :)但是nervermind。 OB似乎根本不回答。 ;) – JustOnUnderMillions