【问题标题】:How to output multiple rows from an SQL query using the mysqli object如何使用 mysqli 对象从 SQL 查询中输出多行
【发布时间】:2011-03-03 09:05:53
【问题描述】:

假设 mysqli 对象已经用全局变量 $mysql 实例化(并连接),这是我正在尝试使用的代码。

class Listing {
private $mysql;
function getListingInfo($l_id = "", $category = "", $subcategory = "", $username = "", $status = "active") {
        $condition = "`status` = '$status'";
        if (!empty($l_id)) $condition .= "AND `L_ID` = '$l_id'";
        if (!empty($category)) $condition .= "AND `category` = '$category'";
        if (!empty($subcategory)) $condition .= "AND `subcategory` = '$subcategory'";
        if (!empty($username)) $condition .= "AND `username` = '$username'";
        $result = $this->mysql->query("SELECT * FROM listing WHERE $condition") or die('Error fetching values');
        $this->listing = $result->fetch_array() or die('could not create object');
        foreach ($this->listing as $key => $value) :
            $info[$key] = stripslashes(html_entity_decode($value));
        endforeach;
        return $info;
    }
}

数据库中有数百个列表,当我调用 $result->fetch_array() 时,它会将数据库的第一行放在一个数组中。 但是,当我尝试调用该对象时,似乎只能访问第一行。 例如: $listing_row = 新列表; 而 ($listing = $listing_row->getListingInfo()) { 回声 $listing[0]; }

这会在数据库中输出同一行的无限循环。为什么它不前进到下一行? 如果我移动代码:

$this->listing = $result->fetch_array() or die('could not create object');
        foreach ($this->listing as $key => $value) :
            $info[$key] = stripslashes(html_entity_decode($value));
        endforeach;

如果我将它移到类外,它会完全按照预期的方式工作,在循环 while 语句时一次输出一行。 有没有办法这样写,这样我就可以在类中保留 fetch_array() 调用并仍然循环遍历记录?

【问题讨论】:

    标签: php mysql oop loops mysqli


    【解决方案1】:

    您的对象存在根本缺陷 - 每次调用 getListingInfo() 方法时,它都会重新运行查询。同样,mysql_fetch_array() 不会获取整个结果集,它只会获取下一行,因此您的方法归结为:

    1. 运行查询
    2. 获取第一行
    3. 处理第一行
    4. 返回第一行

    对对象的每次调用都会创建一个新查询、一个新结果集,因此永远无法获取第 2 行、第 3 行等...行。

    除非您的数据集是“巨大的”(即:大于您想要/可以设置 PHP memory_limit),否则没有理由不一次性获取整个数据集并对其进行处理,如上面 Jacob 的回答所示.

    附带说明一下,stripslashes 的使用让我想知道您的 PHP 安装是否启用了 magic_quotes_gpc。此功能已被弃用很长时间,并且会在 v6.0 发布时从 PHP 中删除。如果您的代码在这样的安装上按原样运行,它可能会破坏数据中的合法转义。同样,将编码/转义的数据存储在数据库中通常不是一个好主意。数据库应包含数据的“原始”副本,然后您在需要处理版本时根据需要对其进行处理(转义、引用等)。

    【讨论】:

    • @mark :感谢您的解释。我对 OOP 很陌生。我确实有一个关于安全性的问题作为后续行动。我没有启用magic_quotes_gpc,但在将表单添加到数据库之前,我一直在对通过表单发送的所有内容使用addslashes()。有没有更好的方法来保护数据?我还应该如何过滤某人通过表单输入发送的数据,以便我可以安全地将其输入到我的数据库中?
    • 编写“安全”查询的最佳方式是将 PDO (php.net/PDO) 与预准备语句一起使用。这些将处理引用/转义数据的所有繁重工作。否则最好使用mysql_real_escape_string() 而不是addlashes()。 mysql 函数使用 mysql 自己的引用机制。 addlashes 基本上只是一个愚蠢的字符串替换函数,可能会被 unicode/非常规字符愚弄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多