Php 如何使用pdo fetch对while循环中的行进行计数

Php 如何使用pdo fetch对while循环中的行进行计数,php,mysql,sql,pdo,counter,Php,Mysql,Sql,Pdo,Counter,我使用的是mysqli_fetch_数组,计数是正确的,直到我改为fetch(),它现在只返回总行数,而不是返回每行的每个数字 对于第一行,我想回显“1”,以此类推 新注意事项:while语句中的所有其他内容都返回正确的值,除了返回总行数的计数器,而我需要一个按从sql语句中选择的顺序排列的行号 根据要求。这是我的连接。 我不知道是否应该在每个查询上检查“$e->getMessage();”,因为我在所有查询中都使用了这个连接 try { $dbh = new PDO('mysql:ho

我使用的是mysqli_fetch_数组,计数是正确的,直到我改为fetch(),它现在只返回总行数,而不是返回每行的每个数字

对于第一行,我想回显“1”,以此类推

新注意事项:while语句中的所有其他内容都返回正确的值,除了返回总行数的计数器,而我需要一个按从sql语句中选择的顺序排列的行号

根据要求。这是我的连接。

我不知道是否应该在每个查询上检查“$e->getMessage();”,因为我在所有查询中都使用了这个连接

try {
    $dbh = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'usr', 'pwd',
                    array(PDO::ATTR_EMULATE_PREPARES => false, 
                          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
                  );
} catch (PDOException $e){
    echo $e->getMessage();
}
这起作用了

$query = mysqli_query($con, 'SELECT * FROM music');

$count = 0;
while($row = mysqli_fetch_array($query)){
    $count++; 
    echo $count;
}
新的不起作用。

$query = $dbh->query('SELECT * FROM music');

$count = 0;
while($row = $query->fetch()){
    $count++; 
    echo $count;
}

工作正常,使用try-catch查看PDO连接是否正常工作

try {
    $dbh = new PDO('mysql:host=localhost;dbname=db', 'root', 'root',
                       array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}  catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

$sql = 'SELECT * FROM music';
$sth = $dbh->query($sql);

$count = 0;
while($row = $sth->fetch()){
    $count++; 
    echo $count;
}

您还可以抛出PDO异常,以查看是否有任何异常发生:
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION

尝试使用
PDO::FETCH_NUM
直接获取行计数:-

$countquery = $dbh->query('SELECT COUNT(1) FROM music');
$rowCount = 0;
$rowCount = $countquery ->fetch(PDO::FETCH_NUM);
echo $rowCount;
//And then do another query for the real data if need be
*这使用查询获取行数,并节省while循环所花费的时间。

$conn->exec(“SET CHARACTER SET utf8”)

关于:

if ($pdo){  
    $query=$pdo->prepare("SELECT count(*) as cnt FROM music");
    if($query->execute()){
        $count = $query->fetch()[0];//or fetch()['cnt'] 
        echo $count;
    }
}

PDO有一点不同的行为。这是mysqli的替代品

try {
    $dbh = new PDO('mysql:host=localhost;dbname=database', 'user', 'password',array(
        PDO::ATTR_EMULATE_PREPARES => false, 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        // optional
        PDO::MYSQL_ATTR_INIT_COMMAND    => 'SET NAMES utf8',
    ));

    $count = 0;
    foreach ($dbh->query("SELECT * FROM `music`") as $row) {
        $count++; 
        echo $count;
    }
}  catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    exit();
}
试试看{
$dbh=newpdo('mysql:host=localhost;dbname=database','user','password',数组(
PDO::ATTR_EMULATE_PREPARES=>false,
PDO::ATTR_ERRMODE=>PDO::ERRMODE_异常,
//可选的
PDO::MYSQL_ATTR_INIT_命令=>'SET NAMES utf8',
));
$count=0;
foreach($dbh->query(“从“音乐”中选择*作为$row){
$count++;
echo$count;
}
}捕获(PDO$e){
打印“错误!:”$e->getMessage()。“
”; 退出(); }

我希望这会有所帮助。

你还在使用mysqli还是现在使用PDO?@iswinky,是的,我在使用PDO。你有没有研究过这个:??PDOStatement::rowCount-返回受上一个SQL语句影响的行数PDO有一点不同的行为。这是mysqli()的替代品。您能解释一下是什么原因使我所做的不起作用以及为什么会起作用吗?您没有在$query对象上调用
execute()
为什么要使用prepare,这个语句不需要准备?在我的问题中我没有使用任何外部值我的坏。您的代码看起来是正确的,您是否检查了PDO对象?请尝试使用Try-catch块,如果尚未更改,请将mysqli连接更改为PDO…并将相同的查询发送到服务器两次,从而使服务器的工作负载增加一倍。我不喜欢这种方式,除非我确定我查询的数据非常小,并且创建结果集对服务器来说非常简单。@TuncayGöncüoğlu
SELECT COUNT(1)…
是一种非常轻的查询,通常是mysql中推荐的在执行更重的查询之前获取结果集大小的选项,尤其是在使用innodb时。此外,随着行数的增加,对所有行的迭代会(非常)严重地扩展。
if ($pdo){  
    $query=$pdo->prepare("SELECT count(*) as cnt FROM music");
    if($query->execute()){
        $count = $query->fetch()[0];//or fetch()['cnt'] 
        echo $count;
    }
}
try {
    $dbh = new PDO('mysql:host=localhost;dbname=database', 'user', 'password',array(
        PDO::ATTR_EMULATE_PREPARES => false, 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        // optional
        PDO::MYSQL_ATTR_INIT_COMMAND    => 'SET NAMES utf8',
    ));

    $count = 0;
    foreach ($dbh->query("SELECT * FROM `music`") as $row) {
        $count++; 
        echo $count;
    }
}  catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    exit();
}