-1

基本上,我使用的是我在网上找到的 mySQLi 包装器,在尝试使用它时遇到了一个我无法解决的问题,基本上,我正在执行此操作。

<?php 
    $res = $DB->Query("SELECT * FROM `table`");
    while($row = $DB->Fetch()) {
?>
<tr>
    <td><?php echo $row['id']; ?></td>
    <td><?php echo $functions->checkStatus($row['arowhere']); ?></td>
</tr>
<?php 
      }
?>

因此,当我尝试执行此操作时,它会在我的表行的$functions->checkStatus($row['arowhere']); 此函数内执行一个新查询它正在更改用于while($row = $DB->Fetch()) {

public function Query($SQL) {
        $this->SQL = $this->mysqli->real_escape_string($SQL);
        $this->Result = $this->mysqli->query($SQL);

        if ($this->Result == true) {
            return true;
        } else {
             die('Problem with Query: ' . $this->SQL);
        }
}

public function Fetch() {
    return mysqli_fetch_assoc($this->Result);
}

有没有解决方案,或者有人指出我正确的方向,所以我可以避免这种情况。

4

2 回答 2

1

我不敢相信这样的包装可以在网上找到。事实上,它完全,最终无法使用。

mysqli->real_escape_string($SQL);是完全没有意义的。它不会保护您的查询免受注入,但它会破坏任何复杂的查询。只要您尝试使用 WHERE 条件运行查询,它就会因错误而死。

而且下面这行也是错误的

die('Problem with Query: ' . $this->SQL);

因为它既没有显示错误,也没有显示文件和行号。

至少这个包装器的问题是你面临的一个问题——它使用内部变量来保存结果,而它应该只返回它。

一个真正的 mysqli 包装器是 SafeMysql,它允许您通过占位符添加任何动态数据。

使用 SafeMysql,您的代码可以工作:

<?php 
    $res = $DB->query("SELECT * FROM `table`");
    while($row = $db->fetch($res)) {
?>
<tr>
    <td><?php echo $row['id']; ?></td>
    <td><?php echo $functions->checkStatus($row['arowhere']); ?></td>
</tr>
<?php 
      }
?>
于 2013-04-17T05:58:52.090 回答
0

您可以遍历行并将它们添加到临时数组中。然后,您可以在进行其他查询后通过此数组引用这些行。如果查询返回的行太多,这可能会影响内存,所以要小心。

<?php 
$res = $DB->Query("SELECT * FROM `table`");

$rows = array();
while($row = $DB->Fetch()) {
    array_push( $rows, $row );
}

foreach( $rows as $row ){
?>
    <tr>
        <td><?php echo $row['id']; ?></td>
        <td><?php echo $functions->checkStatus($row['arowhere']); ?></td>
    </tr>
<?php 
}
unset( $rows ); // destroys the temporary array, freeing the memory it consumed
?>
于 2013-04-17T02:55:20.970 回答