基本上我使用的是我在网上找到的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);
}
是否有解决方案或有人指出我正确的方向,所以我可以避免这个。
答案 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
?>