【问题标题】:How to insert array into mysql using PDO and bindParam?如何使用 PDO 和 bindParam 将数组插入 mysql?
【发布时间】:2012-04-09 03:03:00
【问题描述】:

我正在使用以下代码。该代码有效,但我想更改它以使其使用 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?

【问题讨论】:

    标签: mysql multidimensional-array pdo


    【解决方案1】:

    您正在尝试创建一个语句并绑定一个参数。

    语句很棒,因为它可能使任何类型的 SQL 注入无效。它通过删除仅将查询视为字符串的概念来做到这一点。 SQL 查询被视为带有参数列表的字符串和作为绑定变量的关联数据。 所以查询的不仅仅是文本,而是文本+数据。

    我的意思是:

    这个简单的查询:

    SELECT * FROM A WHERE val="$param"
    

    这是不安全的,因为查询只被视为一个字符串。而如果 $param 没有被勾选,那就是一个 SQLi 漏洞。

    但是当创建一个语句时,你的查询变成:

    SELECT * FROM A WHERE val=:param
    

    然后你使用 bindparam 来指定值 a :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), ...";
    

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

    【讨论】:

    • 感谢您更新您的答案。现在更容易理解了:)
    • 每次插入的值的个数不同时,有没有办法做到这一点?
    • 是的,您只需要根据您的需要生成查询字符串并绑定与您生成的查询匹配的参​​数
    猜你喜欢
    • 2013-07-27
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2013-11-17
    • 2014-08-11
    • 2023-03-18
    相关资源
    最近更新 更多