这似乎应该是一项非常简单的任务,但我不确定是不是。
我想用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'
)。
答案 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查询选择的行数