在查询中进行另一个查询时仅显示一行

50pmv0ei  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(356)

我的网站上有一个好友列表,我把用户名存储在数据库中,而不是他们的全名。所以我在朋友名单里再问一个问题。。。

  1. while($r = mysqli_fetch_array($result)) {
  2. $username = $r['username'];
  3. // Wanna find the real name
  4. $sql = "SELECT * FROM users WHERE username = '$username'";
  5. $result = mysqli_query($con, $sql);
  6. $row = mysqli_fetch_array($result);
  7. $fullname = $row['fullname'];
  8. echo $fullname;
  9. }

它工作正常,但只显示一行,而不是所有行。当我只显示用户名时,它会显示所有的行。

cuxqih21

cuxqih211#

这里有很多问题,但归根结底是执行所谓的n+1查询。您执行一个查询来获取n行,然后再执行n个查询,每行一个,以获取其他详细信息。
你可以一枪就搞定 JOIN :

  1. SELECT x, users.username FROM y WHERE (x conditions)
  2. LEFT JOIN users ON users.username=y.username

这样你就可以一次获取所有的数据。值得注意的是 username 像这样的键通常会有严重的问题,因为您要么需要在一大堆级联触发条件中分层以跟踪引用完整性,要么根本就没有任何引用完整性。尝试在数据库中使用数字值作为主键,并使用 username 只作为人类的标签。
这里的风险是,如果有人删除了他们的帐户,而另一个人创建了一个完全相同的名字的帐户,他们就“继承”了前一个人的那些朋友。这已经出现在大型网站上,给人们带来了很多麻烦,人们实际上获得了别人放弃的内容的所有权。

puruo6ea

puruo6ea2#

你可以重复使用 $result 从原始查询中使用。。。

  1. while($r = mysqli_fetch_array($result)) {
  2. $username = $r['username'];
  3. // Wanna find the real name
  4. $sql = "SELECT * FROM users WHERE username = '$username'";
  5. $result1 = mysqli_query($con, $sql);
  6. $row = mysqli_fetch_array($result1);
  7. $fullname = $row['fullname'];
  8. echo $fullname;
  9. }

我刚刚将内部查询改为 $result1 您还应该查看准备好的语句,而不是内联字段值。

相关问题