Php PDO中缺少一些有用的mysql函数
我想要一个MySQL查询或表对象,比如一个以PDO对象作为输入并对表执行所有必要操作的对象 我想这个对象可以实现一些数组接口,比如Php PDO中缺少一些有用的mysql函数,php,mysql,pdo,Php,Mysql,Pdo,我想要一个MySQL查询或表对象,比如一个以PDO对象作为输入并对表执行所有必要操作的对象 我想这个对象可以实现一些数组接口,比如Countable,ArrayAccess,Iterator,这样我就可以轻松地foreach将行当作一个规则数组 在弃用的mysql\uquot函数中,有一个非常有用的函数(现在仍然是),它有助于逐行移动,因此我可以实现所有Iterator方法。我可以在开始时运行一个查询,并将行保留在某个资源私有字段中,并在需要时提供服务 我可以通过向数据库发送适当的查询并获取结果
Countable
,ArrayAccess
,Iterator
,这样我就可以轻松地foreach
将行当作一个规则数组
在弃用的mysql\uquot
函数中,有一个非常有用的函数(现在仍然是),它有助于逐行移动,因此我可以实现所有Iterator
方法。我可以在开始时运行一个查询,并将行保留在某个资源私有字段中,并在需要时提供服务
我可以通过向数据库发送适当的查询并获取结果来涵盖其他功能(大部分是信息性的,类似的),但是我如何才能移动到特定的行呢
我认为该方法的最后一个参数是游标位置,但是当我调用
$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);
但这是一样的。您使用的是
PDO::ATTR\u 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);
我不认为这些函数对任何实际场景都有用 mysql_list_tables()确实可以用信息量更大、更灵活的信息模式查询来替代 如果您已经可以拥有一个常规数组,为什么还要费心实现ArrayAccess呢? 只有两种情况:
- 要么你需要相对少量的数据,适合网页。只需一次将其全部选中
您可以以任何方式遍历生成的数组$data = $stmt->fetchAll();
- 或者您需要在某种控制台服务脚本中遍历长表。你不需要来回移动它。只需选择并循环
fetchAll
将记录集提取到数组中。然后遍历数组而不是查询。@showdev我考虑过了,但它会加载大量无用的数据到内存中。这是真的,尤其是对于大型数据集。你为什么还要选择无用的数据?@YourCommonSense我现在不知道。但我认为,当(目前)我想要一行数据时,没有必要获取所有数据。但是,我希望是这样。由于[
,出现了语法错误,但我更改了Philip说的数组(…)
,它只返回第一行。据我所知,是MySQL。如果有人有相反的信息,请告诉我们!@Voitcus:the[…]
是PHP>=5.4.0的合法数组语法。然而,MySql似乎不支持@showdev所说的可滚动游标。恐怕除了以另一种方式实现此功能外,您无能为力。我想遍历我的对象,我通过为$database
提供的是PDO对象和表名创建的对象。所有这些都很简单像SELECT
,INSERT
,DELETE
这样的gs可以通过适当的查询来处理,但是我不需要准备DELETE
查询,然后运行这个,但是我可以调用方法deleteRow($id)
,这样,我就不需要关心是否应该INSERT
或UPDATE
(模式是这样的,我不确定是否可以使用updateif not EXISTS INSERT
)等等。(我知道如何从模式中获取所有数据,这没关系。)我仍然无法理解您的问题。许多表单都很高兴地使用它们的deleteRow()方法已经存在。为什么你不能创建一些自己的或使用任何现成的方法呢?我是新手,想学习一些东西,而不是依赖其他我不了解的库。在PHP上你需要学习的主要内容是:它不是一个运行数小时的可靠应用程序。它是相当多的小脚本,每个脚本只运行一小部分时间第二,服务于特定页面。您可以随时知道您在该特定页面上需要哪些数据并选择它。不要选择任何其他数据,因为它会在片刻之后消失。因此-始终只选择您当前需要的数据,而不选择任何其他数据。仅此而已