如何使用PDO和bindParam将数组插入到mysql中?
问题描述:
我正在使用下面的代码。代码工作,但我想,这样使用它来改变它bindparam如何使用PDO和bindParam将数组插入到mysql中?
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指定值:PARAM。这意味着该值不会附加到查询字符串,但查询已被解析并提供数据。
在你的情况,你绑定到param:数组一个内爆阵列(我假设“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), ...";
你只需要计算你的基本阵列中元素的个数。
谢谢你更新你的答案。现在理解起来要容易得多:) – TryHarder 2012-03-25 06:12:52
当插入值的数量每次都不相同时,有没有办法做到这一点? – TryHarder 2012-03-25 08:14:06
是的,你只需根据你的需要生成你的查询字符串,并绑定与你生成的查询匹配的参数 – grifos 2012-03-26 18:30:25