【问题标题】:Handling results from MySQLi query after MySql to MySqli conversion在 MySql 到 MySqli 转换之后处理来自 MySQLi 查询的结果
【发布时间】:2025-11-24 17:55:02
【问题描述】:

我正在尝试更改以下代码以使用 MySqli 而不是 MySql。我已经删除了一些对我在这里要解决的问题似乎不重要的方法。

class db {
    var $hostname,
        $database,
        $username,
        $password,
        $connection,
        $last_query,
        $last_i,
        $last_resource,
        $last_error;

    function db($hostname=DB_HOSTNAME,$database=DB_DATABASE,$username=DB_USERNAME,$password=DB_PASSWORD) {
        $this->hostname = $hostname;
        $this->database = $database;
        $this->username = $username;
        $this->password = $password;

        $this->connection = mysql_connect($this->hostname,$this->username,$this->password) or $this->choke("Can't connect to database");
        if($this->database) $this->database($this->database);
        }

    function database($database) {
        $this->database = $database;
        mysql_select_db($this->database,$this->connection);
        }

    function query($query,$flag = DB_DEFAULT_FLAG) {
        $this->last_query = $query;

        $resource = mysql_query($query,$this->connection) or $this->choke();
        list($command,$other) = preg_split("|\s+|", $query, 2);

        // Load return according to query type...
        switch(strtolower($command)) {
            case("select"):
            case("describe"):
            case("desc"):
            case("show"):
                $return = array();
                while($data = $this->resource_get($resource,$flag)) $return[] = $data;
                //print_r($return);
                break;
            case("replace"):
            case("insert"):
                if($return = mysql_insert_id($this->connection))
                    $this->last_i = $return;
                break;
            default:
                $return = mysql_affected_rows($this->connection);
            }

        return $return;
        }

    function resource_get($resource = NULL,$flag = DB_DEFAULT_FLAG) {
        if(!$resource) $resource = $this->last_resource;
        return mysql_fetch_array($resource,$flag);
        }   
    }

这是我目前得到的:

class db {
    var $hostname = DB_HOSTNAME,
        $database = DB_DATABASE,
        $username = DB_USERNAME,
        $password = DB_PASSWORD,
        $connection,
        $last_query,
        $last_i,
        $last_resource,
        $last_error;

    function db($hostname, $database, $username, $password) {
        $this->hostname = $hostname;
        $this->database = $database;
        $this->username = $username;
        $this->password = $password;

        $this->connection = new mysqli($this->hostname, $this->username, $this->password, $this->database) or $this->choke("Can't connect to database");
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }


        if($this->database)
            $this->database($this->database);
    }

    function database($database) {
        $this->database = $database;
        mysqli_select_db($this->connection, $this->database );
    }

    function query($query, $flag = DB_DEFAULT_FLAG) {
        $this->last_query = $query;
//print_r($query);
        $result = mysqli_query($this->connection, $query) or $this->choke("problem connecting to DB");
while($row=mysqli_fetch_assoc($result)) {
$resource[]=$row;
}
//print($command);
//print_r($resource);print("<br>");
        list($command, $other) = preg_split("|\s+|", $query, 2);

        // Load return according to query type...
        switch(strtolower($command)) {
            case("select"):
            case("describe"):
            case("desc"):
            case("show"):
                $return = array();
                while($data = $this->resource_get($resource, $flag))
                    $return[] = $data;
                //print_r($return);
                break;
            case("replace"):
            case("insert"):
                if($return = mysqli_insert_id($this->connection))
                    $this->last_i = $return;
                break;
            default:
                $return = mysqli_affected_rows($this->connection);
            }

        return $return;
        }

    function resource_get($resource = NULL, $flag = DB_DEFAULT_FLAG) {
        if(!$resource)
            $resource = $this->last_resource;
        return mysqli_fetch_array($resource, $flag);
    }

所以问题来了:我使用 print_r() 检查了结果,并且 $resource 数组加载正确,但是使用 print_r() 检查时 $return 的值最终是“Array()”。因此,据我所知,这部分代码没有正确处理某些内容,这就是我包含 resource_get() 函数调用的原因:

            $return = array();
            while($data = $this->resource_get($resource, $flag))
                $return[] = $data;
            //print_r($return);
            break;

如果我使用 mysqli_fetch_row($resource, $flag) 而不是 mysqli_fetch_array($resource, $flag) 我仍然得到相同的结果,即 print_r($return) 只产生“Array()”。

【问题讨论】:

  • 看起来$resource已经包含您的结果数组,因为while($row=mysqli_fetch_assoc($result)) { $resource[]=$row; }。当您将$resource 传递给$this-&gt;resource_get() 时,它对mysqli_fetch_array() 的调用将获得一个数组而不是结果资源。如果您已经获取了行,请不要使用 resource_get() 方法。要亲自验证这一点,只需在 switchswitch:"show" 之前的 print_r($resource) 即可。
  • 这表明您没有打开display_errors,因为resource_get() 应该会发出警告。总是在开发代码时,error_reporting(E_ALL); ini_set('display_errors', 1);
  • 谢谢,迈克尔。那解决了它。我刚刚删除了while循环并制作了 $return = $resource 并且它有效!这不是我的代码,坦率地说,我不明白为什么我需要调用 resource_get() 而使用 MySqli 我想我不需要。
  • 我会把它转换成答案,等等……
  • 是的,这里有很多多余的东西来包装mysql_*()mysqli_() 的现有功能。我认为这是不必要的。可能是在mysql_*() 上添加了一个面向对象的层,但 MySQLi 已经支持 OO 方法。

标签: php mysql arrays mysqli


【解决方案1】:

变量$resource 在您将它传递给$this-&gt;resource_get() 时并不代表mysqli_result 资源对象。相反,它已经是一个二维结果数组,因为您之前运行了 mysqli_fetch_assoc() 循环。

要使这与您当前的代码一起工作,您可以删除早期的 fetch 循环:

$result = mysqli_query($this->connection, $query) or $this->choke("problem connecting to DB");
// Remove this
//while($row=mysqli_fetch_assoc($result)) {
//  $resource[]=$row;
//}

然后,将 $result 而不是 $resource 传递到您的 resource_get() 方法中,因为它是 $result 即资源对象。

或者,您可以完全跳过 resource_get() 调用并直接返回 $resource,因为它已经包含结果数组。

【讨论】: