0

不要误会我的意思 PDO 很棒,但我不喜欢它的是如何将变量放置在远离它们在 SQL 语句中的位置的地方。意思是我有一个类似的查询:

$stmt = $dbh->prepare("SELECT * FROM users WHERE email = ? AND pass = ?");

替换 的变量?总是远离以下几行:

$stmt->bindParam(1, $email);
$stmt->bindParam(2, $pass);

如果你有很多参数,这可能会变得非常难看。使用:email而不是?不会让它变得更好。有时您会在相同的方法中将参数视为数组,例如:

$db->query("SELECT * FROM users WHERE email = ? AND pass = ?",
   array($email, $pass));

稍微好一点,但有 10 个变量,它仍然很难看。您实际上创建了一个?只使用一次的变量。此伪变量也不支持代码突出显示。

我认为这样会更好

$db->prepare("SELECT * FROM user WHERE email = ", $email, " AND pass = ", $pass);

你甚至可以包括这样的参数binParam()

$db->prepare_new(
   "SELECT * FROM user WHERE email = ", array($email, PDO::PARAM_STR),
   " AND pass = ", $pass);

如果有一个支持这种风格的库,我会很高兴。你认识一个吗?

4

3 回答 3

1

?拥有的很多意义:email在于您可以多次重用查询。例如:

$stmt = $pdo->prepare("SELECT true FROM user WHERE email = :email");
$stmt->execute(array($email1));
$stmt->execute(array($email2));
// etc.

在查询中包含特定变量会完全删除此功能。

如果您愿意,您可以随时扩展或包含 PDO,不过:

class DB {
   private $pdo;

   public function executeQuery($query, $args) {
      $stmt = $this->pdo->prepare($query);
      $stmt->execute($args);
   }
}
$db->executeQuery("SELECT true FROM user WHERE email = :email", array($email1));

这隐藏了您不喜欢的 PDO 的功能。

更新:

这是一种不寻常的做事方式,但它似乎是你所追求的:

$pdo->query("SELECT true FROM user WHERE email = " . $pdo->quote($email));

http://us2.php.net/manual/en/pdo.quote.php

于 2012-10-02T08:08:11.177 回答
1

如果总是每个偶数参数都是参数,你可以这样做:

class MyPDO extends PDO {
    public function prepareQuery() {
        $query_str = "";
        $params = array();
        foreach(func_get_args() as $key => $param) {
            if( $key % 2 == 0 ) {
                $query_str .= $param;
            }
            else {
                $params[] = $param;
                $query_str .= ' ? ';
            }
        }

        $prepared = $this->prepare($query_str);
        foreach( $params as $key => $param ) {
            $prepared->bindParam( $key+1, $param );
        }
        return $prepared;
    }
}

然后你可以随心所欲地使用它:

$db = new MyPDO( .. );
$db->prepareQuery("SELECT * FROM user WHERE email = ", $email, " AND pass = ", $pass);

PS:未经测试 - 只是一个概念

于 2012-10-02T08:31:36.277 回答
0

您可以将与此类似的内容放入函数中:

$stmt = $dbh->prepare("SELECT * FROM users WHERE email = :email AND pass = :pass");

$arr = array(
    'email' => 'test@test.com',
    'pass' => 'secret'
);

foreach($arr as $key => $val){
    $stmt->bindParam(':'.$key, $val);

}

例子:

function myBindParams($stmt, $bindings){
     foreach($bindings as $key => $val){
        $stmt->bindParam(':'.$key, $val);
     }
     return $stmt;
}


$stmt = $dbh->prepare("SELECT * FROM users WHERE email = :email AND pass = :pass");

$arr = array(
    'email' => 'test@test.com',
    'pass' => 'secret'
);

$stmt = myBindParams($stmt, $arr);
于 2012-10-02T08:09:56.840 回答