2011-11-02 97 views
2

在編寫腳本時,我不斷地輸入$ db-> prepare()和$ stmt-> bindParam()。我正在尋找一種將所有功能整合在一起的方法。這是我迄今爲止所擁有的。嘗試爲PDO創建查詢函數

$sql = "SELECT (name, email) FROM users WHERE VALUES (:name, :email)" 
$values = array(':name' => 'my_name', ':email' => '[email protected]',); 

    function db_query($sql, $values) { 
    global $db; //Database object 

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

     foreach($values as $placeholder => $value) { 
      $stmt->bindParam($placeholder, $value); 

     } 

     $stmt->execute(); 

     $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

     return $result; 
     } 

這對大多數查詢來說足夠嗎?這是一個安全的方式來做到這一點?

我只想查詢運行並返回它返回的任何內容(NULL,值,錯誤等)。

謝謝。

+2

難道你不能用'$ stmt-> execute($ values)替換那個foreach循環;'? –

+0

它應該是足夠的,只要它工作。爲你將要做的每件事寫幾個測試用例,提取/插入/刪除/更新。我傾向於將「查詢」作爲一個實際的查詢,並且編寫一個單獨的函數來獲取IE'fetchAll'' fetchOne',但我也只是用自己的包裝器來擴展PDO類,所以我不必惹全球業務。 :)最好的方式來看看它是否足夠和工作...是測試它,看看。 –

+0

+1這裏是非常罕見的問題。 –

回答

0

您的代碼將無法按預期工作,因爲bindParam()會將佔位符名稱(第一個參數)綁定到第二個參數中存在的變量參考

使用您的示例,這將導致所有參數設置爲[email protected],因爲它是循環中的最後一個$value

正如在評論中提到的,只需使用$stmt->execute($values)。請參閱http://php.net/manual/en/pdostatement.execute.php

如果您確實想繼續循環,請改爲使用PDOStatement::bindValue()

+0

好的,謝謝。 $ result變量是「正確的」,因爲它將返回查詢發送回來的所有內容,而不管SELECT,UPDATE,DELETE等等。使用mysql函數,我這樣做了: $ result = mysql_query($ query); 感謝您的幫助。 – Brandon

+0

@Brandon鑑於我的答案中的信息,我會反對創建這個包裝函數。 – Phil

+0

好的。是否有一種「最佳實踐」的方式來刪除大量冗餘的PDO代碼?我實際上將Drupal的db_query作爲靈感。我的很多代碼都是prepare()和execute()的。謝謝。 – Brandon