2012-09-10 25 views
20

是否有一種簡單的方法在PDO中綁定多個值而不需要重新設置?看看下面的代碼:在pdo中綁定多個值

$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)"); 

$result_set->bindValue(':username', '~user'); 
$result_set->bindValue(':password', '~pass'); 
$result_set->bindValue(':first_name', '~John'); 
$result_set->bindValue(':last_name', '~Doe'); 

$result_set->execute(); 

在這裏,我綁定的值以重複的方式,這是4倍。那麼在PDO中綁定多個值有一個簡單的方法嗎?

回答

29

你總是可以的​​參數內,只要你很好的價值觀被視爲PDO::PARAM_STR(字符串)綁定值。

$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)"); 
$result_set->execute(array(
    ':username' => '~user', 
    ':password' => '~pass', 
    ':first_name' => '~John', 
    ':last_name' => '~Doe' 
)); 

可以使用數組傳遞就像任何數組:

$user = "Nile"; 
$pdo->execute(array(":user" => $user)); 
+0

這是如何有效? 'execute'方法不帶任何參數? – Brett

+1

@Brett你檢查過規格嗎?它確實將參數傳遞給查詢,您可以使用[PDOStatement :: bindParam()或通過'execute()方法]將參數作爲參數傳遞(http://php.net/manual/en/) pdostatement.execute.php)。 – jeremy

+0

我的不好,我以爲你在說[這個](http://php.net/manual/en/mysqli-stmt.execute.php)。 – Brett

5

如果你想基於類型(string,int等)進行綁定,那麼不需要。如果你是罰款結合一切作爲一個字符串:

$stmt = $db->prepare("..."); 
$stmt->execute(array(
    'foo' => 'bar', 
    'something' => 'else', 
    'third' => 'thing', 
)); 
+1

請問有變量這項工作,如果我改變了'bar'到'$ bar'在哪個字符串中分配了一個「bar」? –

+1

是的,它會... – jeremy

2

要真正從未鍵入任何兩次,你可以使用數組來提供數據,以及同一陣列中使用函數輸出MySQL查詢的綁定部分。例如:

function bindFields($fields){ 
    end($fields); $lastField = key($fields); 
    $bindString = ' '; 
    foreach($fields as $field => $data){ 
     $bindString .= $field . '=:' . $field; 
     $bindString .= ($field === $lastField ? ' ' : ','); 
    } 
    return $bindString; 
} 

的數據名和列名來自單個關聯數組($data)。然後,使用bindFields($data)產生的column = :column對字符串來連接到MySQL查詢:

$data = array(
    'a_column_name' => 'column data string', 
    'another_column_name' => 'another column data string' 
); 

$query = "INSERT INTO tablename SET" . bindFields($data); 

$result = $PDO->prepare($query); 
$result->execute($data); 

bindFields($data)輸出:

a_column_name=:a_column_name,another_column_name=:another_column_name 
+0

我最初發布這個作爲一個單獨的問題/答案([這裏](http://stackoverflow.com/questions/23282160/is-there-a-shortcut-for-binding-named-pdo-params-for-mysql -inserts/23282161))在查找此問題之前,現在已將其標記爲重複。 – equazcion