我正在编写自己的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 :(得分:1)
一些简单的数组函数没问题。
$in = $db->exec();
$out = array();
foreach( $in as $row )
$out[ $row['setting'] ] = $row['value'];
如果您需要更通用的功能,则必须更清楚地描述转换。
答案 1 :(得分:1)
答案很可能是:
exec
方法,或exec
只执行执行并存储语句句柄,然后获取数据是一个单独的方法。除了当前的哈希数组之外,我还发现了以下便捷方法:
这些都是偶尔方便的事情,PDO(和大多数其他数据库适配器)根本没有内置标志来处理。