在活动行数组中执行查询

时间:2013-04-17 00:01:53

标签: php mysqli

基本上我使用的是我在网上找到的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);
}

是否有解决方案或有人指出我正确的方向,所以我可以避免这个。

2 个答案:

答案 0 :(得分:1)

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

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

以下行也是错误的

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

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

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

A real mysqli wrapper is 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 
      }
?>

答案 1 :(得分: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
?>