php - 在查询中进行另一个查询时仅显示一行
问题描述
我的网站上有一个好友列表,我将用户名存储在数据库中,而不是他们的全名。所以我只是在朋友列表中进行另一个查询......
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;
}
它工作正常,但它只显示一行,而不是所有行。当我只显示用户名时,它会显示所有行。
解决方案
这里有很多问题,但归结为进行所谓的N+1查询。您执行一个查询以获取N行,然后再执行N个查询,每行一个,以检索其他详细信息。
您可以使用以下命令一次性完成所有操作JOIN
:
SELECT x, users.username FROM y WHERE (x conditions)
LEFT JOIN users ON users.username=y.username
这样您就可以一次获取所有数据。值得注意的是,username
像这样使用作为密钥通常会出现严重问题,因为您要么需要在一大堆级联触发条件中分层以跟踪引用完整性,要么根本没有任何引用完整性。尝试将数值用作数据库中的主键,并username
仅将其用作人类的标签。
这里的风险是,如果有人删除了他们的帐户,而另一个人创建了一个名称完全相同的帐户,他们就会从前一个人那里“继承”这些朋友。这已经出现在大型网站上,并造成了大量麻烦,人们有效地获得了其他人放弃的内容的所有权。
推荐阅读
- go - 使用 go-sqlmock 创建一个 gorm 数据库(运行时错误)
- sd-card - SPI SD 卡 32GB 从不通过 CMD55、ACMD41 初始化步骤
- python - Surprise API - 如何将特征加载到 Surprise 数据集中?
- markdown - 如何在 svelte kit 中导入 markdown 文件?
- ios - 如何检查文本字段在 Swift 中是否有多个字母?
- reactjs - getInitialProps 在我的实时站点上导致 ERR_TOO_MANY_REDIRECTS 错误,但在我的本地版本上没有
- generative-adversarial-network - 判别器的真假损失是一样的,不变的
- asp.net-core - 避免在 ASP.NET Core 属性路由中使用魔法字符串
- android - 使用cordova-plugin-firebasex时如何连接到firebase本地模拟器
- c++ - 如何在 c++17 或 20 中使用 std::invoke_result_t 而不是 c++14 中的 std::result_of_t?