2012-03-25 115 views
2

我正在使用下面的代碼。代碼工作,但我想,這樣使用它來改變它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?

回答

3

你試圖創建一個語句並綁定一個參數。

聲明很棒,因爲它可能會使任何類型的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), ..."; 

你只需要計算你的基本陣列中元素的個數。

+0

謝謝你更新你的答案。現在理解起來要容易得多:) – TryHarder 2012-03-25 06:12:52

+0

當插入值的數量每次都不相同時,有沒有辦法做到這一點? – TryHarder 2012-03-25 08:14:06

+0

是的,你只需根據你的需要生成你的查詢字符串,並綁定與你生成的查詢匹配的參​​數 – grifos 2012-03-26 18:30:25