我已经试了一个小时了,但还是没能解决问题。我制作了一个php文件,用于获取表中的所有项,并将其作为JSON进行检索。但由于某种原因,在我插入第二个mysql查询后,它停止了获取第一个项。我的代码如下:
...
case "LoadEntryList":
$result2 = performquery("SELECT * FROM Entries WHERE Category = '" . $_POST["Category"] .
"' LIMIT " . $_POST["Offset"] . ", " . $_POST["Quantity"] . "");
$row2 = $result2->fetch_assoc();
while($row = $result2->fetch_assoc()) {
$result3 = performquery("SELECT Username FROM Users WHERE ID = '" . $row2["UserID"] . "'");
$row3 = $result3->fetch_assoc();
echo substr(json_encode($row),0,
strlen(json_encode($row))-1) . ",'"Username'":'"" . $row3["Username"] . "'"}";
}
...
非常感谢您的帮助。
编辑:感谢所有这些超快速的回复。
首先获取一行:
$row2 = $result2->fetch_assoc();
然后从下一行开始循环:
while($row = $result2->fetch_assoc()) {
如果你想在所有的行上循环,不要跳过第一行。只需在所有行上循环:
$result2 = // your very SQL-injectable query
while($row2 = $result2->fetch_assoc()) {
$result3 = // your other very SQL-injectable query
$row3 = $result3->fetch_assoc();
// etc.
}
请注意,如果使用有意义的变量名,类似这样的错误会更加明显。当抽象级别重叠时,"row2"、"result3"等会非常令人困惑。
重要信息:您的代码对SQL注入攻击是完全开放的。您基本上允许用户在数据库中执行他们想要的任何代码。请考虑使用准备好的语句,并将用户输入视为值,而不是可执行代码。这是一个开始阅读的好地方,就像这里一样。
无需$row2 = $result2->fetch_assoc();
<?
case "LoadEntryList":
$result2 = performquery("SELECT * FROM Entries WHERE Category = '" . $_POST["Category"] .
"' LIMIT " . $_POST["Offset"] . ", " . $_POST["Quantity"] . "");
while($row = $result2->fetch_assoc())
{
$result3 = performquery("SELECT Username FROM Users WHERE ID = '" . $row["UserID"] . "'");
$row3 = $result3->fetch_assoc();
echo substr(json_encode($row),0,strlen(json_encode($row))-1) . ",'"Username'":'"" . $row3["Username"] . "'"}";
}
?>
或者,
<?
...
case "LoadEntryList":
$Category=$_POST["Category"];
$Offset=$_POST["Offset"];
$Quantity=$_POST["Quantity"];
$result3 = performquery("SELECT Entries.*, Users.Username FROM Entries, Users WHERE Entries.Category=$Category AND Entries.UserID=Users.ID LIMIT $Offset, $Quantity");
$row3 = $result3->fetch_assoc();
echo substr(json_encode($row),0,strlen(json_encode($row))-1) . ",'"Username'":'"" . $row3["Username"] . "'"}";
}
...
?>
我有一个添加到David的答案(还不能对此发表评论)
这行代码:
$result3 = performquery("SELECT Username FROM Users WHERE ID = '" . $row2["UserID"] . "'");
将始终返回相同的结果。如果要将$row2[...
更改为$row[...
,则代码将采用由while
循环更新的行。
我对接受的结果不满意。可以修复/替换该代码段,还必须替换坏代码。更不用说的是,我不知道是否有人在输出中发现了一个真正的大错误。这是解决办法,我会解释原因。
$JSON = array();
$result2 = performquery( '
SELECT
e.*, u.Username
FROM Entries AS e
LEFT JOIN Users AS u ON u.ID = e.UserID
WHERE
e.Category = ' . $_POST['Category'] . '
LIMIT ' . $_POST['Offset'] . ', ' . $_POST['Quantity'] . '
' );
while( $row2 = $result2->fetch_assoc() ){
$JSON[] = $row2;
}
echo json_encode( $JSON );
显然,主要问题是查询,所以我用LEFT JOIN
修复了它,现在第二部分是输出。首先是你包含用户名的方式,其次是如果你有多个结果怎么办?你的输出将是:
{"ID":1,"Username":"John"}{"ID":2,"Username":"Doe"}
你如何解析它?所以$JSON
部分就到位了。您将其添加到数组中,并对该数组进行编码。现在的结果是:
{["ID":1,"Username":"John"],["ID":2,"Username":"Doe"]}
LE:我遗漏了sql注入部分,正如OP所说,它将在之后完成?我不知道为什么不在写的时候做它,因为你可能会忘记以后你需要对它进行消毒。