在PDO中缺少mysql_ *的一些有用功能

时间:2013-04-11 19:47:38

标签: php mysql pdo

我希望有一个MySQL查询或表对象,比如一个将PDO对象作为输入并使用该表执行所有必要操作的对象。

我在想这个对象可以实现一些数组接口,比如CountableArrayAccessIterator所以我很容易foreach这些行就像是一个常规数组

在已弃用的mysql_*函数中,有(仍然是)非常有用的函数mysql_data_seek(),这有助于逐行移动,因此我可以实现所有Iterator方法。我可以在开头运行一个查询,并将行保存在某个资源私有字段中,并在需要时提供。

其他函数(主要是信息性的,如mysql_list_tables()和类似的)我可以通过向db发送适当的查询并获取结果来覆盖,但是如何移动到特定的行?

我认为fetch()方法的最后一个参数是光标位置,但是当我调用时

$p = $database->query('SELECT * FROM tobjects');
$row = $p->fetch(PDO::FETCH_ASSOC, PDO::ATTR_CURSOR,$i);

它始终为$i的任何值产生相同的行。

修改

实际上,它不是同一行,而是第一次调用fetch()的第一行,第二行等等,就像没有光标信息一样。正如答案所示,我做了这个

$p = $database->prepare('SELECT * FROM tobjects',
                    array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$p->execute();
$row = $p->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $i);

但这也是一样的。

2 个答案:

答案 0 :(得分:1)

您使用PDO::ATTR_CURSOR错误。您需要做的是首先使用PDO::prepare请求可滚动游标,然后您可以移动到结果集中所需的任何记录:

$s = $database->prepare('SELECT * FROM tobjects',
                        [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$s->execute();
$row = $s->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $i);

答案 1 :(得分:0)

我发现这些功能不适用于现实生活场景。

mysql_list_tables()确实可以用WAY代替更多信息灵活的查询到信息模式

如果您已经拥有常规数组,为什么还要为实现ArrayAccess而烦恼呢? 只有两种情况:

  • 您需要相对少量的数据,适合网页。只需一次选择即可。

    $data = $stmt->fetchAll();
    

    您可以随心所欲地遍历生成的数组。

  • 或者您需要在某种控制台服务脚本中遍历长表。你不需要来回遍历它。只需选择并循环。