【问题标题】:fetchAll helper function using PDO使用 PDO 的 fetchAll 辅助函数
【发布时间】: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 绑定和执行?

【问题讨论】:

    标签: php mysql pdo


    【解决方案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 条款。在这种情况下似乎不可能省略类型设置...
    猜你喜欢
    • 2011-04-15
    • 2013-08-20
    • 1970-01-01
    • 2022-01-08
    • 2017-08-16
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多