Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.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和select Stations的局限性是什么_Php_Pdo_Named Parameters - Fatal编程技术网

Php PDO和select Stations的局限性是什么

Php PDO和select Stations的局限性是什么,php,pdo,named-parameters,Php,Pdo,Named Parameters,使用SELECT语句时,PDO能否返回数据库中的行数?php甚至支持命名参数吗?下面的示例显示了如何获取在PDO中选择或影响的行: <?php $selectsql = $database->prepare('SELECT * FROM table'); $selectsql->execute(); $count = $selectsql->rowCount(); ?> 或 关于命名参数 命名参数是一个多年来被多次提出的主题。各种

使用SELECT语句时,PDO能否返回数据库中的行数?php甚至支持命名参数吗?

下面的示例显示了如何获取在PDO中选择或影响的行:

<?php
    $selectsql = $database->prepare('SELECT * FROM table');
    $selectsql->execute();
    $count = $selectsql->rowCount();
?>


关于命名参数

命名参数是一个多年来被多次提出的主题。各种各样的电子邮件和电子邮件中都记录了利弊 (显然)该功能尚未获得支持,也未实现。 由于主题不断被重新提出,现在PHP有了一个RFC 过程中,应将讨论记录在RFC中(注意,这尚未完成 这样就不必重新审视同样的论点

然而,我确实找到了一些模拟的方法:

使用SELECT语句时,PDO能否返回数据库中的行数

从数据库中选择任何数据都没有限制。

PDO可以返回表中的行数以及您可能希望从数据库中选择的任何其他信息。只要选择它。你会得到它没有任何问题。仅此而已。

当使用MySQL驱动程序时,这些代码片段是等效的

// using rowcount
$stmt = $pdo->prepare('SELECT * from `foo` WHERE `bar` = :bar');
$stmt->execute(array('bar' => 'bar'));
$count = $stmt->rowCount();

// using a COUNT query
$stmt = $pdo->prepare('SELECT COUNT(1) from `foo` WHERE `bar` = :bar');
$bar = 'bar';
$stmt->bindParam('bar', $bar);
$stmt->execute();
$count = $stmt->fetchColumn();
我还演示了在查询中使用命名占位符(这是完全可能的)

第一段代码很可能不会与另一个DBMS一起工作,而第二段代码则会

使用SELECT语句时,PDO能否返回数据库中的行数

我想,手册中的这句话可能会引起混淆:


如果关联的PDO语句执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为

数据库支持或不支持此功能。当您发出
SELECT*FROM foo…
语句时,您告诉数据库您希望获得
foo
表中的所有数据[根据某些条件]。这里的重点是数据。数据库将评估该表中的所有数据,以将您要求的内容返回给您。某些索引可能会也可能不会有帮助,这可能会也可能不会异步发生,数据库可能会也可能不知道它能够提供多少结果。这一切都取决于数据库的内部结构。在某些形式的存储中,在实际获取所有结果之前,数据库可能根本不知道会有多少结果

因此,调用
PDOStatement::rowCount
时,结果可能准确,也可能不准确,具体取决于数据库。PDOAPI只公开数据库提供的任何内容,而且由于PDO可用于与许多不同的数据库进行通信,因此其功能取决于您正在与哪个数据库进行通信

php甚至支持命名参数吗


PHP?!是的,PHP有许多数据库API,它们支持带有命名参数的参数化查询。PDO就是其中之一。

对这两个问题都是肯定的。虽然您通常可以使用MySQL和
SELECT
语句,但它是不可移植的。建议您使用相同的谓词发出一个
selectcount(*)
查询,以检索准确的行计数。但这些并不是完全证明。net甚至说行计数只在部分时间有效。使用mysqli\而不是pdo难道不是一个好例子吗?@user2651294你完全失去了我。使用不同的DBMS有很多原因(这里讨论的太多了)。正如我已经说过的,
PDOStatement::rowCount()
在您使用MySQL驱动程序时起作用。存储从
COUNT
查询返回的值也很简单。最后,当使用MySQL时,PDO或MySQLi的选择将是个人偏好之一。就个人而言,我发现MySQLi参数和结果绑定API过于复杂,而PDO要简单得多。此外,作为一名web开发人员,我个人在PHP环境中使用过MySQL、SQLite、PostgreSQL、SQL Server、Oracle和MongoDB。我想OP指的是查询中的命名占位符,即
SELECT。。。其中foo=:foo
。如果关联的PDO语句执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数,这可能是错误的。然而,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为。-我是。行计数并不总是有效的。替代方案是什么?如果我使用COUNT(),我如何使用存储在其中的行数创建一个变量,比如mysqli?我要问的是,使用pdo和select语句对行进行计数,并存储计数
$query=$db->query('selectcount(*)fromtable')$matches=$query->fetchColumn()谢谢这帮了大忙。我相信,PDO在青少年时期对mysql也没有行数。你可以在这里找到一些关于08年的遗留问题来证明这一点。尽管这项功能毫无用处。公平地说,这显然是一个存在于5.1.6和5.2.2之间的bug,并且已经存在,因此不再是什么问题了。:)
// using rowcount
$stmt = $pdo->prepare('SELECT * from `foo` WHERE `bar` = :bar');
$stmt->execute(array('bar' => 'bar'));
$count = $stmt->rowCount();

// using a COUNT query
$stmt = $pdo->prepare('SELECT COUNT(1) from `foo` WHERE `bar` = :bar');
$bar = 'bar';
$stmt->bindParam('bar', $bar);
$stmt->execute();
$count = $stmt->fetchColumn();