PDO - 迭代绑定变量

时间:2014-03-12 20:49:44

标签: php mysql pdo

我正在尝试创建一个迭代绑定变量的函数。这就是我到目前为止所做的:

function prepareQuery($db, $query, $args) {
    // Returns a prepared statement
    $stmt = $db->prepare($query);
    foreach ($args as $arg => $value) {
        $stmt->bindParam($arg, $value);
        }
    return $stmt;
    }

这就是我使用它的方式:

$stmt = prepareQuery($db, "SELECT * FROM `Licenses` WHERE `verCode`=:verCode", Array(":verCode" => $verCode));
$verCode = "some_string";
$stmt->execute();
while ($info = $stmt->fetch()) {
    print_r($info);
    }

虽然它没有打印任何东西。我知道数据库条目存在,并且相同的查询可以在PHPMyAdmin中运行。所以,我认为这只是我的函数如何尝试创建绑定的问题。我怎样才能解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 不要创建迭代绑定变量的函数。 PDO已经可以做到了

    function prepareQuery($db, $query, $args) {
        $stmt = $db->prepare($query);
        $stmt->execute($args);
        return $stmt;
    }
    
  2. 如果它没有打印任何东西,那么它没有找到任何东西。就这么简单。

  3. 您实际上甚至不需要这个准备查询功能。只需像这样修改PDO

    class myPDOStatement extends PDOStatement
    {
        function execute($data = array())
        {
            parent::execute($data);
            return $this;
        }
    }
    
    $user = 'root';
    $pass = '';
    $dsn  = 'mysql:charset=utf8;dbname=test;host=localhost';
    $opt  = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => TRUE,
        PDO::ATTR_STATEMENT_CLASS    => array('myPDOStatement'),
    );
    $pdo = new PDO($dsn, $user, $pass, $opt);
    
  4. 你能够写出如此整洁的链条:

    $sql  = "SELECT * FROM `Licenses` WHERE `verCode`=:verCode";
    $code = "some_string";
    $data = $pdo->prepare($sql)->execute([$code])->fetchAll();
    foreach ($data as $info) {
        print_r($info);
    }