Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO中缺少一些有用的mysql函数_Php_Mysql_Pdo - Fatal编程技术网

Php PDO中缺少一些有用的mysql函数

Php PDO中缺少一些有用的mysql函数,php,mysql,pdo,Php,Mysql,Pdo,我想要一个MySQL查询或表对象,比如一个以PDO对象作为输入并对表执行所有必要操作的对象 我想这个对象可以实现一些数组接口,比如Countable,ArrayAccess,Iterator,这样我就可以轻松地foreach将行当作一个规则数组 在弃用的mysql\uquot函数中,有一个非常有用的函数(现在仍然是),它有助于逐行移动,因此我可以实现所有Iterator方法。我可以在开始时运行一个查询,并将行保留在某个资源私有字段中,并在需要时提供服务 我可以通过向数据库发送适当的查询并获取结果

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

我想这个对象可以实现一些数组接口,比如
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();
    
    您可以以任何方式遍历生成的数组

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


我在这方面也遇到了麻烦。(显然是MySQL。)我找到的最好的解决方案(对于小记录集)是使用
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上你需要学习的主要内容是:它不是一个运行数小时的可靠应用程序。它是相当多的小脚本,每个脚本只运行一小部分时间第二,服务于特定页面。您可以随时知道您在该特定页面上需要哪些数据并选择它。不要选择任何其他数据,因为它会在片刻之后消失。因此-始终只选择您当前需要的数据,而不选择任何其他数据。仅此而已