0

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

我在想这个对象可以实现一些数组接口,比如Countable, ArrayAccessIterator所以我可以foreach像普通数组一样轻松地处理行。

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

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

我以为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);

但这同样有效。

4

2 回答 2

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);
于 2013-04-11T19:54:20.243 回答
0

我发现这些功能中的任何一个对于任何现实生活场景都没有用。

mysql_list_tables() 确实可以用对 INFORMATION SCHEMA 提供更多信息和更灵活的查询来代替

如果您已经可以拥有一个常规数组,为什么还要费心实现 ArrayAccess 呢?只有2个场景:

  • 要么你需要相对少量的数据,适合网页。只需一次全部选择。

    $data = $stmt->fetchAll();
    

    您可以以任何您喜欢的方式遍历生成的数组。

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

于 2013-04-11T20:08:00.290 回答