使用 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

PDO::fetchAll 与 PDO::fetch 循环

Kotlin二级构造函数

MySQL PDO fetchAll 作为具有整数索引的数组

PDO 循环并打印 fetchAll