PHP PDO选择查询结果

时间:2014-06-26 15:06:25

标签: php pdo

这似乎应该是一项非常简单的任务,但我不确定是不是。

我想用PDO做一个SELECT查询,然后立即找出是否有任何结果(行),如果有,有多少。

我想把结果作为一个对象而不是数组来获取,因为我喜欢$ obj-> col_name语法,只是为了找到上面的内容而返回一个数组感觉有点不对。

$qryh = $conn->query("SELECT ...");

然后使用$qryh首先查明是否有任何行,如果有,有多少行。

这可以在不退回使用数组的情况下完成吗?

更新

我知道rowCount(),但我认为它只适用于UPDATE,INSERT和DELETE - 我的问题与SELECT有关。

更新2:

我正在使用SQL Server和MS Access,而不是MySQL,而rocount()不起作用。

解决方案

接受的答案导致了解决方案。这是我发现的:

我在创建PDO对象(PDO::ATTR_CURSOR)时将PDO::CURSOR_SCROLL选项设置为new PDO(...,该对象在-1上返回rowCount()。但是,如果我使用数组(->prepare(...)将光标设置在array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)内,则它会起作用并返回行数。

http://technet.microsoft.com/en-us/library/ff628154(v=sql.105).aspx

因此,上面链接的示例有效,在创建PDO对象时设置光标不起作用。另请注意,在上述链接的“备注”部分中,它提到的PDO::CURSOR_SCROLLABLE不适合我(我得到Undefined class constant 'CURSOR_SCROLLABLE')。

5 个答案:

答案 0 :(得分:1)

$stmt = $conn->query('SELECT ...');
// number of rows:
$rows = $stmt->rowCount();

// get an array with objects:
$objects = $stmt->fetchAll();

// another way to count the results:
$rows = count($objects);

答案 1 :(得分:1)

尝试这种方式:

$query = "select * from ...";
$stmt = $conn->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
print $stmt->rowCount()

应该工作

答案 2 :(得分:0)

这是我在数据库类中所做的:

$stmt = $conn->prepare('SELECT ...');
$stmt->execute();

$arrayOfObjects = $stmt->fetchALL(PDO::FETCH_OBJ);
$numberOfRows = count($arrayOfObjects);
print $numberOfRows;

通过传递PDO::FETCH_OBJ每个对象都是stdClass,这意味着您可以使用->语法。

我相信这正是您所寻找的,它只使用PHP count()函数而不是mySQL rowCount()

如果你想要更多的上下文,这里是我在所有项目中使用的数据库类:https://gist.github.com/pxlsqre/9f6471220ef187343f54

答案 3 :(得分:0)

你是对的,PDO::rowCount无法正常使用SELECT

一种解决方法是将计数添加到您的查询

$qryh = $conn->query("SELECT COUNT(*) as numRows FROM Table");
$result = $qryh->(PDO::FETCH_OBJ);;
$count = $result->numRows;

答案 4 :(得分:-1)

$qryh->fetchColumn()

返回通过SELECT查询选择的行数