循环中的PHP - 没有停止

时间:2014-03-02 22:59:09

标签: php while-loop

我正在使用php while循环来读取结果,但它只是在第一条记录上循环,并且永远不会移动到第二条记录而且永远不会停止。我的代码:

class MySqlDatabase {   

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

    //Vars for Function Open_Connection
    private $_Connection;
    //Function Open_Connection - Connects to DB
    public function Open_Connection(){
        $this->_Connection = mysqli_connect('localhost','xxx','xxx','xxx');
        if(!$this->_Connection){
            die("Connection Failed: ". mysqli_error($this->_Connection));
        } else {
            echo "Success";
        }
    }

    //Vars for Function Query
    public $Results_Row;
    //Function Query - Runs Query and returns results 
    public function Query($Sql){
        $Results = mysqli_query($this->_Connection, $Sql);
        if(!$Results){
            die("Query Failed: ". mysqli_error($Results). "<br/>".$Sql);
        }
        $this->Results_Row = mysqli_fetch_row($Results);

        return $Results;
    }

}

$Db = new MySqlDatabase;

$Db->Query("SELECT * FROM Users");

while ($R = $Db->Results_Row){
    var_dump($R);
    echo "<hr/>";
}

这创建了永不停止的第一条记录的无限循环。我的数据库中只有两条记录,因此它应该在循环结束两个结果后停止。它再次只是保持无限循环第一条记录,永远不会移动到第二条记录然后停止。请帮助,谢谢。

2 个答案:

答案 0 :(得分:6)

你从未真正获取新行。您运行查询,然后访问第一行,然后只是一遍又一遍地引用该行。您需要在类中添加一个方法来获取行。

你需要这样的东西(未经测试的代码,基于你上面的内容):

class MySqlDatabase {   

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

    //Vars for Function Open_Connection
    private $_Connection;
    //Function Open_Connection - Connects to DB
    public function Open_Connection(){
        $this->_Connection = mysqli_connect('localhost','xxx','xxx','xxx');
        if(!$this->_Connection){
            die("Connection Failed: ". mysqli_error($this->_Connection));
        } else {
            echo "Success";
        }
    }

    public function FetchRow() { // I added this
        $this->Results_Row = mysqli_fetch_row($Results);
    }

    //Vars for Function Query
    public $Results_Row;
    //Function Query - Runs Query and returns results 
    public function Query($Sql){
        $Results = mysqli_query($this->_Connection, $Sql);
        if(!$Results){
            die("Query Failed: ". mysqli_error($Results). "<br/>".$Sql);
        }
        // I removed the mysqli_fetch_row() here to method FetchRow()

        return $Results;
    }

}

$Db = new MySqlDatabase;

$Db->Query("SELECT * FROM Users");

while ($R = $Db->FetchRow()){ // I changed this
    var_dump($R);
    echo "<hr/>";
}

答案 1 :(得分:1)

来自mysql_fetch_row $DB->Results_Row(我的重点):

  

返回与获取的行对应的数值数组,并将内部数据指针向前移动

您当前的代码所做的只是将第一行保存到$R,而在while循环中保持将该行分配到mysql_fetch_row

预期用法是重复调用FALSE,对返回值执行某些操作,并在返回$Results时退出循环。你能做的是

  1. mysql_fetch_row保存为实例变量,创建另一个方法,在该变量上调用$Results并从while条件表达式调用该方法;或
  2. 只需从Query方法返回mysql_fetch_row,然后在while条件表达式中调用{{1}}。