我有一个表单,它将复选框提交给PHP 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致命错误:未捕获的异常'PDOException',消息'SQLSTATE [HY093]:参数号无效'
这会产生错误。将多个值插入具有不同值的mysql表的最佳方法是什么?
答案 0 :(得分: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();
答案 1 :(得分:0)
您无法重复使用占位符名称。您必须创建新的,或在更新部分中使用VALUES:
typedef
答案 2 :(得分:0)
除非您已启用Squasing Migrations,否则您无法重复使用占位符。
一般来说,PDO_MYSQL默认情况下应该启用仿真。原因是MySQL在准备好的语句中表现不佳。仿真工作速度明显加快。
也就是说,如果由于某种原因它没有打开,你可以使用以下方法手动设置:
$dbc->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);
事实上,如果你不确定,无论如何都要设置它。