我正在使用以下代码。代码可以工作,但我想更改它,使其使用bindparam

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$stqid=array();

    for ($i=0; $i<$array_count; $i++){
    $stqid[$i][0]=$lastInsertValue;
    $stqid[$i][1]=$qid[$i][0];
    $stqid[$i][2]=$qid[$i][1];
    }

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

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

$count = $dbh->exec("INSERT INTO qresults(instance, qid, result) VALUES  ".implode (', ', $values));
$dbh = null;
}
catch(PDOException $e){
    echo $e->getMessage();
}

我换了下面的
$count = $dbh->exec("INSERT INTO qresults(instance, qid, result) VALUES  ".implode (', ', $values));

具有
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:an_array)";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':an_array', implode(',', $values),PDO::PARAM_STR);
$stmt->execute();

但是插入不再工作(我没有收到任何错误消息)。
问:我做错什么了?如何重写代码以使用bindParam?

最佳答案

您试图创建一个语句并绑定一个参数。
语句很好,因为它可能会使任何类型的SQL注入无效。它通过删除查询只被视为字符串的概念来实现。SQL查询被视为一个字符串,带有一个参数列表和一个作为绑定变量的关联数据。
所以查询不仅仅是文本,而是文本+数据。
我是说:
这个简单的查询:

SELECT * FROM A WHERE val="$param"

它不安全,因为查询只被视为字符串。如果$param未选中,则它是一个SQLi孔。
但是,当创建语句时,查询变为:
SELECT * FROM A WHERE val=:param

然后使用bindparam指定值a:param。这意味着该值没有附加到查询字符串,但查询已经被解析并提供了数据。
在您的例子中,您绑定到param:array一个内爆数组(我假设是“data1”、“data2”等)。其中只有一个参数的值是字符串(“data1,data2,data3…”),因此它只会导致一次插入,而不是多次插入。
通过生成具有足够参数的查询来处理数组,可以更改语句生成
$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";

然后在数组上循环并为每个参数调用bindparam方法。
$count = 0;
foreach($values as $val)
{
   $stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
   $count++;

}

这会奏效的。
编辑:这个解决方案展示了它如何在一维数组中工作,但是可以通过调整语句查询生成和修改bindparam循环来轻松地扩展到您的问题。
你的陈述应该是:
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";

只需计算基数组中元素的数量。

关于mysql - 如何使用PDO和bindParam将数组插入mysql?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9858073/

10-11 13:37