Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用mysqli对象从SQL查询输出多行_Php_Mysql_Oop_Loops_Mysqli - Fatal编程技术网

Php 如何使用mysqli对象从SQL查询输出多行

Php 如何使用mysqli对象从SQL查询输出多行,php,mysql,oop,loops,mysqli,Php,Mysql,Oop,Loops,Mysqli,假设mysqli对象已经用全局变量$mysql实例化(并连接),下面是我尝试使用的代码 class Listing { private $mysql; function getListingInfo($l_id = "", $category = "", $subcategory = "", $username = "", $status = "active") { $condition = "`status` = '$status'"; if (!empty($

假设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;
    }
}
db中有几百个列表,当我调用$result->fetch_array()时,它会将db中的第一行放在数组中。 然而,当我试图调用该对象时,我似乎只能访问第一行。 例如: $listing_row=新上市; 而($listing=$listing\u row->getListingInfo()){ echo$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()调用,并且仍然循环记录?

您的对象从根本上说是有缺陷的-每次调用getListingInfo()方法时,它都在运行查询。另外,
mysql\u fetch\u array()
不会获取整个结果集,它只获取下一行,因此您的方法归结为:

  • 运行查询
  • 取第一行
  • 处理第一行
  • 返回第一行
  • 对对象的每次调用都会创建一个新查询、一个新结果集,因此将永远无法获取第二个、第三个等。。。排

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


    作为补充说明,stripslashes的使用让我想知道您的PHP安装是否启用了magic_quotes_gpc。这个功能早就被弃用了,每当v6.0发布时,它就会从PHP中删除。如果您的代码在这样的安装中按原样运行,则可能会在数据中丢弃合法转义。同样,在数据库中存储编码/转义数据通常是一个糟糕的主意。数据库应包含数据的“原始”副本,然后在需要处理版本时根据需要对其进行处理(转义、引用等)。

    @mark:谢谢您的解释。我对OOP很陌生。我确实有一个关于安全的问题作为后续。我没有启用magic_quotes_gpc,但在将表单添加到数据库之前,我一直在对通过表单发送的所有内容使用addslashes()。有没有更好的方法来保护数据?我还应该如何过滤某人通过表单输入发送的数据,以便安全地将其输入数据库?编写“安全”查询的最佳方法是使用PDO()和准备好的语句。这些将处理引用/转义数据的所有繁重工作。否则,最好使用mysql\u real\u escape\u string()而不是addslashes()。mysql函数使用mysql自己的引用机制。addslashes基本上只是一个哑字符串替换函数,可能被unicode/非常规字符愚弄。