2011-11-02 132 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