【问题标题】:Looping through query results with fetch(PDO::FETCH_ASSOC)使用 fetch(PDO::FETCH_ASSOC) 循环查询结果
【发布时间】:2018-03-08 09:46:15
【问题描述】:

由于一个新项目的服务器需求,我已经离开了 mysqli_query()。但是,我在更新一些查询时遇到了问题。

连接文件

<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'nj2kfa3j_sublift');
define('DB_USER', 'nj2kfa3j_web');
define('DB_PASS', 'prum9wR4');
define('DB_CHAR', 'utf8');

class DB
{
    protected static $instance = null;

    protected function __construct() {}
    protected function __clone() {}

    public static function instance()
    {
        if (self::$instance === null)
        {
            $opt  = array(
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => FALSE,
            );
            $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
            self::$instance = new PDO($dsn, DB_USER, DB_PASS, $opt);
        }
        return self::$instance;
    }

    public static function __callStatic($method, $args)
    {
        return call_user_func_array(array(self::instance(), $method), $args);
    }

    public static function run($sql, $args = [])
    {
        if (!$args)
        {
             return self::instance()->query($sql);
        }
        $stmt = self::instance()->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}
?>

问题查询语句:

$stmt = DB::run("SELECT * FROM admin WHERE username='$manager' AND password='$password' LIMIT 1");
    $existCount = $stmt->fetchColumn();
    if ($existCount == 1){
        $id;
        $full_name;
        var_dump($stmt);
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
            $id = $row["id"];
            $full_name = $row["full_name"];
            echo 'test';
        }
}

我以或多或少相同的方式完成了其他查询,并且它们正在工作,如下所示:

$stmt = DB::run("SELECT * FROM categories");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){

这里发生了什么?在上面的查询中 var_dump() 正在返回:

object(PDOStatement)#2 (1) { ["queryString"]=> string(81) "SELECT * FROM admin WHERE username='********' AND password='********' LIMIT 1" }

但它没有进入 while 循环并命中 echo 'test';

【问题讨论】:

  • 因为fetchColumn 已经为您提取了一行。没有什么可取的了。
  • 您应该使用准备好的语句,而不是存储纯文本密码。相反,请使用password_hash()
  • 哦,好吧,这有点道理。我一直在研究一些事情,我在某处看到一些东西说 fetchColumn() 可以像 mysqli_num_rows() 一样使用来查看返回了多少行。如果我不能这样做,是否有其他方法可以确定查询是否找到了一行?
  • 请使用准备好的语句
  • @PaddyHallihan 你可以使用$existCount = $stmt-&gt;fetchall() 然后使用count() 查看返回的行数,然后丢掉while循环并使用foreach

标签: php mysql pdo


【解决方案1】:

请使用prepared statements。您的函数旨在接受准备好的语句。另外,不要将密码存储为纯文本;使用password_hash()password_verify()

您可以使用fetchall() 将结果作为数组获取,然后计算数组元素。

<?php
    $params = [$manager,$password];
    $sql = "SELECT * FROM admin WHERE username= ?  AND password= ?  LIMIT 1";
    $stmt = DB::run($sql,$params);
    $results = $stmt->fetchall(PDO::FETCH_ASSOC); // Returns an array

    if (count($results) > 0){
        $id;
        $full_name;
        foreach($results as $key=>$row){
            $id = $row["id"];
            $full_name = $row["full_name"];
            echo 'test';
        }
    }
?>

【讨论】:

    【解决方案2】:

    正如 cmets 中所讨论的,我一直在寻找 mysqli_num_rows() 的替代方法并找到了 rowCount()。

    以下内容现在对我有用:

    $stmt = DB::run("SELECT * FROM admin WHERE username='$manager' AND password='$password' LIMIT 1");
    $existCount = $stmt->rowCount();
    if ($existCount == 1){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-11
      • 2015-05-09
      • 1970-01-01
      • 2013-05-28
      • 2013-03-06
      • 2012-08-19
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多