在PHP的PDO Select上更改返回格式

时间:2010-06-27 00:29:29

标签: php mysql pdo

我正在编写自己的PDO包装器,以使我的生活更轻松,更安全。

标准查询如下所示:

$user = $db->select('users')
           ->eq('twitter_id', $twitter_id)
           ->limit(1)
           ->prepare()
        ->exec();

生成此查询:

SELECT * FROM users WHERE twitter_id = :twitter_id LIMIT 1

这完全正常,因为我目前想要它。我遇到问题的地方是我有一个返回多行的查询。

我的应用程序存储了一些动态设置,我想在一次通过中抓取并使用它,我可以通过运行如下查询来实现:

$share_datas = $db->select('settings', 'setting, value')
                  ->prepare()
               ->exec();

生成:

SELECT setting, value FROM settings

返回:

Array
(
    [0] => Array
        (
            [setting] => since_id
            [value] => 17124357332
        )

    [1] => Array
        (
            [setting] => last_dm
            [value] => 1271237111
        )
)

函数prepare()将各个部分放在一起进行查询,函数exec()绑定参数并返回数组。

    function exec()
    {
//      echo 'vars: <pre>'.print_r($this->sql_vars, true).'</pre>';
        $stmt = $this->dbh->prepare($this->sql_last_query); 
        foreach($this->sql_vars as $key => $val)
        {
            if('date_time' === $key) continue;
            $bind = $stmt->bindValue($key, $val);
        }
        $stmt->execute();
        $this->sql_vars = array();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

现在问的问题是:有没有办法可以更改exec()或查询本身,以便它可以返回一个返回如下所示的数组并避免任何其他循环?

Array
(
     [since_id] => 17124357332
     [last_dm]  => 1271237111
)

2 个答案:

答案 0 :(得分:1)

一些简单的数组函数没问题。

$in = $db->exec();
$out = array();
foreach( $in as $row )
    $out[ $row['setting'] ] = $row['value'];

如果您需要更通用的功能,则必须更清楚地描述转换。

答案 1 :(得分:1)

答案很可能是:

  1. 使用不同的返回行为创建多个版本的exec方法,或
  2. exec只执行执行并存储语句句柄,然后获取数据是一个单独的方法。
  3. 除了当前的哈希数组之外,我还发现了以下便捷方法:

    • 查询“one”:第一行中的第一列作为标量(对于像SELECT COUNT(*)这样的东西)
    • 查询“list”:所有行的第一列作为索引数组(用于SELECT id FROM ...)
    • 查询“对”:所有行的前两列作为哈希(对于您当前的问题)
    • 查询“插入ID”:最后生成的行ID为标量(MySQL中的自动增量,Postgres中的序列等)

    这些都是偶尔方便的事情,PDO(和大多数其他数据库适配器)根本没有内置标志来处理。