我希望有一个MySQL查询或表对象,比如一个将PDO对象作为输入并使用该表执行所有必要操作的对象。
我在想这个对象可以实现一些数组接口,比如Countable
,ArrayAccess
,Iterator
所以我很容易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);
但这也是一样的。
答案 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();
您可以随心所欲地遍历生成的数组。
或者您需要在某种控制台服务脚本中遍历长表。你不需要来回遍历它。只需选择并循环。