显然,num_rows属性在PDO中不像mysqli一样。
通常,使用mysqli,我的代码看起来像这样:
<?php
$conn = new mysqli('127.0.0.1','root','mypassword','mydbname');
if($conn->connect_errno){
die("Sorry, could not connect.");
}
$id = 1;
$qry = "SELECT * FROM customers WHERE id = ?";
$getCustomers = $conn->prepare($qry);
$getCustomers->bind_param("i",$id);
$getCustomers->execute();
$result = $getCustomers->get_result();
$count = $result->num_rows;
if($count == 0){
echo "Sorry, there are no results";
}else{
while($row = $result->fetch_object()){
echo $row->id;
echo $row->fname;
echo $row->lname;
echo $row->entry_date;
}
}
?>
如何使用PDO创建等效项?这是我到目前为止所尝试的:
<?php
try{
$conn = new PDO('mysql:host=127.0.0.1;dbname=mydbname','root','mypassword');
}catch(PDOException $e){
echo $e;
}
$id = 1;
$qry = $conn->prepare("SELECT * FROM customers WHERE id = :id");
$qry->execute([':id'=>$id]);
$rows = $qry->fetchAll(PDO::FETCH_OBJ);
$count = count($rows);
if($count == 0){
echo "Sorry, there are no results for your criteria";
}else{
for($i = 0; $i < $count; $i++){
echo $rows->fname;
}
}
?>
答案 0 :(得分:2)
是的,PDO不是很好;当你已经拥有它们时,不需要计算行数。
在您拥有数组时循环结果。
变化:
for ($i = 0; $i < $count; $i++){
echo $rows->fname;
}
要:
for ($i = 0; $i < $count; $i++){
echo $rows[$i]->fname;
}
或者更好地使用foreach。
foreach ($rows as $row) {
echo $row->fname;
}
答案 1 :(得分:0)
声明
fetchAll(PDO::FETCH_OBJ)
返回一个包含所有结果集行的数组described here。要获得数组的大小,请使用sizeof($count)
。这应该给你数组的大小。
答案 2 :(得分:0)
专门回答你的问题。您可以使用rowCount()来检索结果中的行数:
$qry = $conn->prepare("SELECT * FROM customers WHERE id = :id");
$qry->execute([':id'=>$id]);
$count = $qry->rowCount();
$rows = $qry->fetchAll(PDO::FETCH_ASSOC); //my personal preference
for($i=0; $i < $count; $i++) {
echo $rows[$i]['fname'];
}
更密切地复制你的mysqli代码:
while($row = $qry->fetch(PDO::FETCH_OBJ) {
echo $row->fname;
}
当然,您应该始终在每次执行数据库后检查$conn->errorCode()
,以确保在您身边横向出现。
更新: 正如Lawrence指出的那样,rowCount()不适用于MS SQL Server。在这种情况下,另一种方法是使用fetchAll()和count()。