2010-06-27 88 views
1

我正在编写我自己的PDO包装,以使我的生活更轻松,更安全。更改PHP的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 
) 
+0

你之所以不想使用PHp foreach循环来处理它的任何原因? – Lukman 2010-06-27 00:50:02

+0

基本上,只是尽量避免额外的循环,尽可能 – Jayrox 2010-06-27 01:22:58

回答

1

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

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

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

+0

这可以工作,只是试图避免额外的循环,如果有内置的方式来做到这一点。 – Jayrox 2010-06-27 01:23:24

1

答案很可能会是两种:

  1. 创建你exec方法具有不同的返回行为,或
  2. exec简单地进行执行和存储语句句柄的多个版本,则必须取数据是一个单独的方法。

我发现下面的便捷方法得心应手,除了当前的哈希值的数组:

  • 查询“一”:第一行中的第一列标(对于像SELECT COUNT(*))
  • 查询“list”:将所有行的第一列作为索引数组(对于像SELECT id FROM ...))
  • 查询“对”:所有行的前两列作为散列(针对您当前的问题)
  • 查询“insert id”:最后生成的行标识为标量(MySQL中的自动增量,sequence in Postgres等)

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