【问题标题】:Why does a while loop produce unlimited result when mysql is accessed from php class为什么从php类访问mysql时while循环会产生无限的结果
【发布时间】:2019-04-30 02:14:09
【问题描述】:

下面定义了一个类

class table {

    public $mysqli;
    public $display;

    public function mysqli() {
         $mysqli = new mysqli('hostname', 'username', 'password', 'database');
         return $mysqli;
    }

    public function __construct() {
         $this->mysqli = $this->mysqli();
    }

    public function display() {

         $sql = "SELECT * FROM table";
         if($data = $this->mysqli->query($sql)) {
               $this->display = $data->fetch_assoc();
         };
    }
}

$table = new table();
$table->display();
while($table->display) {
    $this->display['name']. " " . $this->display['country'];
};

公共函数$this->display 被分配了一个值$data->fetch_assoc()。间接地,while($table->display = $data->fetch_assoc()) 等价于while($data->fetch_assoc()。但结果不会遍历列表。相反,它只会一遍又一遍地显示第一行,直到系统崩溃。

是否有我不知道的指导 php 类的规则,或者我错过了我的命令?

【问题讨论】:

  • “公共函数$this->display - 这是一个属性,而不是一个方法 “被分配了一个值” - 确切地说, - 过去时。之后您将不再在任何地方更新此内容。
  • while 循环实际上并没有做任何事情。在任何情况下,在遍历数组时使用foreach 而不是while 更习惯用法。
  • @misorude。如果忽略使用上面示例中的类,而不是将查询编写为while($row = $display->fetch_assoc()) { // do this }。做这样的事情会不会错。 $row = $display->fetch_assoc(); while($row) { //do this }。因为第二种是我正在使用的那种尝试。
  • 是的,这当然是错误的,因为在您最初分配第一行的内容之后,$row 的值永远不会改变。如果 $row 永远不会改变,那么while($row) 也没有理由终止
  • 感谢您的回答 misorude。我想这就是问题所在

标签: php class mysqli


【解决方案1】:

你不应该让你的循环像:

while($row = $table->display) {
    $row['name']. " " . $row['country'];
};

【讨论】:

    【解决方案2】:

    试试:

    class table {
    
        public $mysqli;
        public $display;
    
        public function mysqli() {
             $mysqli = new mysqli('hostname', 'username', 'password', 'database');
             return $mysqli;
        }
    
        public function __construct() {
             $this->mysqli = $this->mysqli();
        }
    
        public function display() {
    
             $sql = "SELECT * FROM table";
             $this->display = $this->mysqli->query($sql);
        }
    }
    
    $table = new table();
    $table->display();
    while($row = $table->display->fetch_assoc()) {
         echo $row['name']. " " . $row['country'];
    };
    

    【讨论】:

      猜你喜欢
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多