【问题标题】:PHP While Loop - No StoppingPHP While 循环 - 没有停止
【发布时间】:2014-03-02 22:59:08
【问题描述】:

我正在使用 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/>";
}

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

【问题讨论】:

  • 为什么在 while 循环中使用 = 而不是 ==

标签: php while-loop


【解决方案1】:

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

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

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/>";
}

【讨论】:

  • 您介意给我一个例子或添加到我的代码中吗?我非常新,理解你在说什么,但不知道如何实施。谢谢。
  • @user982853 我在上面添加了一个粗略的示例。类似的东西应该适合你。
【解决方案2】:

来自php.net mysql_fetch_row(我的重点):

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

您当前的代码所做的只是将第一行保存到$DB-&gt;Results_Row,并在while 循环中继续将该行分配给$R

预期用途是重复调用mysql_fetch_row,对返回值做一些事情,并在返回FALSE时退出循环。你能做的是

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多