我的网站上有一个朋友列表,我将用户名存储在数据库中,而不是他们的全名。 所以我只是在好友列表中再做一个查询...
while($r = mysqli_fetch_array($result)) {
$username = $r['username'];
// Wanna find the real name
$sql = "SELECT * FROM users WHERE username = '$username'";
$result = mysqli_query($con, $sql);
$row = mysqli_fetch_array($result);
$fullname = $row['fullname'];
echo $fullname;
}
它工作正常,但它只显示一行,而不是所有行。 当我只显示用户名时,它会显示所有行。
答案 0 :(得分:1)
这里存在很多问题,但它归结为做一个所谓的 N + 1 查询。您执行一次查询以获取 N 行,然后使 N 更多查询,每行一次,以检索其他详细信息。
您可以使用JOIN
:
SELECT x, users.username FROM y WHERE (x conditions)
LEFT JOIN users ON users.username=y.username
这样你就可以一次抓取所有数据。值得注意的是,使用username
作为这样的密钥通常会产生严重的问题,因为您需要在一大堆级联触发条件中进行分层以跟踪参照完整性,否则您将无法获得任何参照完整性所有。尝试使用数值作为数据库中的主键,并将username
之类的内容仅用作人类的标签。
这里的风险是,如果有人删除了他们的帐户而另一个人创建了一个名称完全相同的帐户,他们会“继承”前一个人的朋友。这已经出现在大型网站上,并且造成了大量麻烦,人们有效地获得了其他人放弃的内容的所有权。
答案 1 :(得分:0)
您可以重复使用原始查询中使用的$result
...
while($r = mysqli_fetch_array($result)) {
$username = $r['username'];
// Wanna find the real name
$sql = "SELECT * FROM users WHERE username = '$username'";
$result1 = mysqli_query($con, $sql);
$row = mysqli_fetch_array($result1);
$fullname = $row['fullname'];
echo $fullname;
}
我刚刚更改了内部查询以使用$result1
您还应该查看准备好的语句,而不是内联您的字段值。