使用PDO

时间:2017-01-23 16:29:36

标签: php mysql pdo

我有一个表单,它将复选框提交给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表的最佳方法是什么?

3 个答案:

答案 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);

事实上,如果你不确定,无论如何都要设置它。