Php 如何基于num_行使用PDO显示内容?

Php 如何基于num_行使用PDO显示内容?,php,mysqli,pdo,Php,Mysqli,Pdo,显然,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

显然,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;
}
}
?>

是的,PDO不是很好;p当您已经获得行数时,不需要计算行数

当你有一个数组时循环你的结果

更改:

for ($i = 0; $i < $count; $i++){
    echo $rows->fname;
}
声明
fetchAll(PDO::FETCH_OBJ)
返回一个数组,其中包含所有结果集行。要获取数组的大小,请使用
sizeof($count)
。这将为您提供阵列的大小。

具体回答您的问题。可以使用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'];
}
当然,在每次数据库执行之后,您应该始终检查
$conn->errorCode()
,以确保有东西在您身上横行

更新:
正如Lawrence指出的,rowCount()不适用于MS SQL Server。这种情况下的另一种选择是使用fetchAll()和count()。

OP使用的是
$count=count($rows),问题是for循环。[Duplicate]在他的示例代码中,他正在检查行数以确保弹出正确的UX消息。因此,在这种情况下,SelectsInDect不保证需要.rowCount。根据我的经验,SQL Server不会返回正确的答案。答案已更新。
foreach ($rows as $row) {
  echo $row->fname;
}
$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'];
}
while($row = $qry->fetch(PDO::FETCH_OBJ) {
    echo $row->fname;
}