2012-08-26 61 views
-2

在我的開發過程中,我正在做一個簡單的INSERT,但我要回去並加入SQL保護並準備好語句。我收到的錯誤是:多個MySQL行INSERT失敗

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

這是我從別人的幫助中使用的代碼。

// foreach to set up variables 
foreach ($json as $text) { 
    $uoid = mysql_real_escape_string($uoid); 
    $filename = mysql_real_escape_string($uoid.".jpg"); 
    $filedate = mysql_real_escape_string($datetime); 
    $imagedesc = mysql_real_escape_string($desc); 

    // array of values 
    $insert[] = array($uoid,$filename,$filedate,$imagedesc); 
} 

function placeholders($text, $count=0, $separator=","){ 
    $result = array(); 
    if($count > 0){ 
     for($x=0; $x<$count; $x++){ 
      $result[] = $text; 
     } 
    } 
    return implode($separator, $result); 
} 

foreach($insert as $d){ 
    $question_marks[] = '(' . placeholders('?', sizeof($d)) . ')'; 
}   

$pdo = new PDO('mysql:dbname=photo_gallery;host=127.0.0.1', 'myuser', 'mypass'); 
$pdo->beginTransaction(); 
$sql = "INSERT INTO wp_gallery (" . implode(',', array_values($insert)) . ") 
     VALUES " . implode(',', $question_marks); 
// reading output 
echo $sql; 

$stmt = $pdo->prepare($sql); 

try { 
    $stmt->execute($insert[0]); 
} catch (PDOException $e){ 
    echo $e->getMessage(); 
} 

$pdo->commit(); 

當我看SQL輸出:

INSERT INTO wp_gallery (10219776,10219776.jpg,my image description,2012-08-01 15:36:29) 
VALUES (?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?) 

一切都只是它的外觀相匹配,但我仍然感到困惑,如何解決這個問題。有人能指出我做錯了什麼嗎?

+4

你看不到錯誤? –

+0

您需要列名稱。您將價值觀放在那裏,而不是替換問號。 – Ryan

+0

在提供給社區之前,請檢查您的問題。 –

回答

0

你傳遞值作爲列名,你也不會傳遞到執行正確的參數;

這樣的事情會更正確;

// Replace the $insert buildup. Array of values, you don't want an array of arrays here. 
$insert = array_merge($insert, array($uoid,$filename,$filedate,$imagedesc)); 

... 

$column_names = array("column1", "column2", "column3", "column4"); 

$sql = "INSERT INTO wp_gallery (" . implode(',', $column_names) . ") 
    VALUES " . implode(',', $question_marks); 

$stmt->execute($insert); 
+0

嗨,約阿希姆,感謝您的意見。我想我明白你在說什麼Joachim,但我最初的foreach循環($ json)迭代5次,因此它變成了一個包含$ insert []中的值的數組數組。我有正確的輸出列,但我仍然堅持'?'在VALUES中。 – hybrid9

+0

@ hybrid9在「值」中應該有問號。您使用的是PDO,因此查詢中的每個問號都會被您傳遞到執行中的數組中的值替換。一個問號應該與'$ insert'數組中的一個值相對應。你有沒有嘗試上面的代碼?它將'$ insert'數組更改爲一個值數組,每個問號一個值,並將數組傳遞給execute。 –

+0

我仍然得到一個錯誤:VALUES(?,?,?,?,?,?,?,?,?,?)「}注意:Array to string conversion ....警告:PDOStatement :: execute( ):SQLSTATE [HY093]:無效的參數號:綁定變量的數量與令牌的數量不匹配 – hybrid9

0

INSERT語句如下:

INSERT INTO name_of_the_table (name_of_column_1, name_of_column_2,...) VALUES 
(value_of_column_1, value_of_column_2), (value_of_column_1, value_of_column_2); 

如果設置了它們被定義的順序所有列的值,則可以省略列的名稱。

然而,你把值的列名應該是問號,值應該去。