使用 PDO 的 fetchAll 辅助函数
Posted
技术标签:
【中文标题】使用 PDO 的 fetchAll 辅助函数【英文标题】:fetchAll helper function using PDO 【发布时间】:2011-04-13 03:46:31 【问题描述】:假设我有一个函数
function fetchAll()
$args = func_get_args();
$query = array_shift($args);
$query = str_replace("%s","'%s'",$query);
foreach ($args as $key => $val)
$args[$key] = mysql_real_escape_string($val);
$query = vsprintf($query, $args);
if (!$query) return FALSE;
$res = mysql_query($query);
if (!$res)
trigger_error("db: ".mysql_error()." in ".$query);
return FALSE;
$a = array();
while($row = mysql_fetch_assoc($res)) $a[]=$row;
return $a;
然后像这样使用它
$a=$db->fetchAll("SELECT * FROM users WHERE status=%s LIMIT %d,%d",$status,$start,$num);
如何使用 PDO 重写它? 我能找到的每个示例都只显示了如何直接绑定参数。我应该传递变量类型及其值吗?或者让这个调用总是 4 行 - 3 绑定和执行?
【问题讨论】:
【参考方案1】:编辑:正如上校所说,显然这(不再?)适用于LIMIT
子句。
如果你使用简单的查询 / 不关心类型:
function fetchAll()
$args = func_get_args();
$query = array_shift($args);//'SELECT * FROM users WHERE status=? LIMIT ?,?'
//you'll need a reference to your PDO instance $pdo somewhere....
$stmt = $pdo->prepare($query);
$stmt->execute($args);
return $stmt->fetchAll();
【讨论】:
好吧,我对类型感到困扰,至少要区分整数和字符串。但这似乎与 PDO 无关。如果我为最后 2 个占位符传递一个字符串,这没什么不好 - 对吧? 好吧,它不起作用,抛出一个错误,near ''0','2''
。看起来默认字符串类型不适用于 LIMIT 子句
嗯,你是对的。我似乎记得大约 2 年前我可以(但此后一直没有放弃该类型),但此时,LIMIT
确实使用“默认”字符串出错。跨度>
正如stereofrog 刚刚在我的另一个问题中指出的那样,它的prepared statements 仿真选项对这种行为负责。通过添加$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
可以消除此错误。【参考方案2】:
我能找到的每个例子都只显示 如何直接绑定参数。 我应该传递变量类型以及 它的价值?或者总是打这个电话 4 行 - 3 绑定并执行?
您不必一次触发绑定一行;你可以像这样绑定一个数组:
# the data we want to insert
$data = array('Cathy', '9 Dark and Twisty Road', 'Cardiff');
$STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?)");
$STH->execute($data);
【讨论】:
我担心 LIMIT 条款。在这种情况下似乎不可能省略类型设置...以上是关于使用 PDO 的 fetchAll 辅助函数的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin:子构造函数如何使用其父构造函数的辅助构造函数?
致命错误:在非对象上调用成员函数 fetchALL() - 在 Microsoft Access 数据库上使用 PDO