Php 使用内爆或准备好的语句插入?

Php 使用内爆或准备好的语句插入?,php,mysql,arrays,insert,prepared-statement,Php,Mysql,Arrays,Insert,Prepared Statement,我有一个数组$authors,其中包含一些我想插入到表中的数字 我可以准备一条语句,对数组中的每个元素执行多次: $stmt = $pdo->prepare('INSERT INTO authors (article_id, user_id) VALUES(?, ?)'); $stmt->bindParam(1, $article_id); $stmt->bindParam($author); foreach($authors as $author) { $stmt-&

我有一个数组$authors,其中包含一些我想插入到表中的数字

我可以准备一条语句,对数组中的每个元素执行多次:

$stmt = $pdo->prepare('INSERT INTO authors (article_id, user_id) VALUES(?, ?)');
$stmt->bindParam(1, $article_id);
$stmt->bindParam($author);
foreach($authors as $author) {
    $stmt->execute();
}
但是,我可以使用
内爆()
执行一次语句:

// here probably $authors = array_map('intval', $authors);
$stmt = $pdo->prepare(
    'INSERT INTO authors (article_id, user_id)
     VALUES ('.implode(', :article_id), (', $authors).', :article_id)');

$stmt->execute([':article_id' => $article_id]);
  • 第一种解决方案更传统,看起来更安全
  • 第二个(我认为)更快,因为对数据库只有一个查询。(并且更短-除了在
    内爆
    中,没有循环)
    • 我在这里没有看到任何安全问题,但在查询中没有字符串连接时(对我来说)看起来更安全
  • 在这种情况下,哪种方法是正确的

    编辑:第二个查询的
    echo
    给出:

    INSERT INTO authors (article_id, student_id)
         VALUES (121, :article_id), (50, :article_id)
    

    并且执行时没有错误。

    根据PDO的文档,“除非启用仿真模式,否则在准备好的语句中不能多次使用同名的命名参数标记。”。因此,单凭这一点,你的“内爆”解决方案就很糟糕

    话虽如此,我将回答这个理论。准备语句的目的是只编译查询一次,因此重复执行会更快。因此,准备好的语句应该像第一个示例中那样使用:一个简单的“模板”查询,重复多次

    在第二个示例中,您创建了一个几乎不会重复的自定义查询(因为它基于$authors数组的内容)。因此,在这种情况下,prepared语句是完全无用的,您有PREPARE的开销,而没有重复执行的好处这不是应该使用的方式。


    Extended insert是一个非常有效的解决方案,并且是一个很好的解决方案,但是将它用于普通查询(即
    exec()
    ),并且确保使用
    quote()
    来防止SQL注入

    呃。这两种代码你都运行过吗?第二个不行。占位符必须是唯一的!我所能想到的就是如果它没有坏,就不要修理它,也不要在这个时候把它弄坏case@Rizier123当我测试它时,我没有使用占位符,而是在这里重写了它。@Rizier123多次使用同一个placehoder没有问题,现在就测试吧!仿真模式打开了吗?