php - 有没有更安全的方法来使用 PDO 来避免不必要的查询?

标签 php mysql pdo innodb sql-injection

我正在使用类似于下面的代码插入 mysql 数据库(使用 PDO。) 目的是仅使用一个查询来插入数据。 不幸的是,它违背了使用 PDO 的目的,因为它没有使用 bindValue 或 param。我想编写代码,使其更安全,但仍能避免不必要的查询。 谁能推荐如何做到这一点?

注意 1:每次访问程序时,集合中的问题数量可能会发生变化(即 $totalQ 每次运行时都可能不同)。

try 
{
    for ($i=0; $i<$totalQ; $i++)
    { 
        $stqid[$i][0]=$lastInsertValue;     //instance         PDO::PARAM_INT
        $stqid[$i][1]=$jqid[$i][0];          //question number  PDO::PARAM_INT
        $stqid[$i][2]=$jqid[$i][5];          //result           PDO::PARAM_INT
        $stqid[$i][3]=$jqid[$i][3];          //question start   PDO::PARAM_STR 
        $stqid[$i][4]=$jqid[$i][4];          //question finish  PDO::PARAM_STR 
    }

    $values = array();
    foreach ($stqid as $rowValues) 
    {
        foreach ($rowValues as $key => $rowValue) 
        {
            $rowValues[$key] = $rowValues[$key];  
        }

        $values[] = "(" . implode(', ', $rowValues) . ")";
    }

    $count = $dbh->exec("INSERT INTO results(instance, qid, result, start, finish) VALUES  ".implode (', ', $values));  
    $dbh = null;
}

注意 2:开始和结束的时间格式中的逗号可能会导致 implode 语句出错。我刚刚添加了它们,这样您就可以看到我想要实现的目标。

任何帮助将不胜感激。谢谢。

编辑:虽然我选择了克里斯的回答,但我非常感谢 Alix Axel 的建议。帮了大忙,谢谢!

最佳答案

未经测试。仍然使用准备好的语句。

$numColumns = 5; //or $numColumns = count($stqid[0]);
$rowPlaceholder = join(', ', array_fill(0, $numColumns, '?'));
$rowPlaceholders = array_fill(0, $totalQ, "($rowPlaceholder)");
echo $sql = "INSERT INTO results(instance, qid, result, start, finish) VALUES " . join(", \n", $rowPlaceholders);
$flat = call_user_func_array('array_merge', $stqid);
$stmt = $dbh->prepare($sql);
$stmt->execute($flat);

关于php - 有没有更安全的方法来使用 PDO 来避免不必要的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10527579/

相关文章:

php - 从扩展类调用其对象时出现 PDO rowCount() 错误

php - 从 Sqlite 数据库使用 PHP 验证用户登录

php - 如何在 Laravel 4 中使用 rackspace php-opencloud

php - 如何在 SQL LIKE ... ESCAPE '\' 中使用 '\'

php - Yii、SQL Server 查询错误

mysql - 当其他表可以使用联接连接时,在单个表中拥有多个外键是好还是坏?

php - 如何在帖子表中显示流行的标签(#)?

database - 尝试更改列,但 iit 显示错误,指出更改选项无效

mysql - 我们是否应该在复合索引(MySQL)上包含排序列、主键

PHP 命令行持久连接