我有下一种情况。
- 从 PHP 表单中我只获得公司 ID
- 我需要使用该公司 ID 排列所有用户名
- 我需要数组并将具有该用户名的所有日志导出到表
我的问题是,当我尝试下一步时:
$sql2 = "SELECT vpnuserreg FROM users WHERE company='$company'";
$result2 = $database->query($sql2);
while ($row2 = $database->fetch_array($result2)){
$username = $row2['vpnuserreg'];
$sql = "SELECT * FROM logs WHERE username='$username' ORDER BY radacctid DESC";
$result = $database->query($sql);
$row=$database->fetch_array($result);
}
问题是: 在 $sql2 查询中,我只有 3 个用户,并且我在 $sql 查询中的登录只会重复 3 次。但我有超过 3 个该用户的日志。我怎样才能进行sql查询,让我的日志导出表中只有3个用户名的所有行?
最佳答案
不要运行两个查询,而是执行一个简单的JOIN
。这意味着您可以在单个查询中完成所有操作。
$sql = "SELECT l.*
FROM users u
JOIN logs l ON u.vpnuserreg=l.username
WHERE u.company='$company'
ORDER BY l.radacctid DESC";
$result = $database->query($sql);
while ($row = $database->fetch_array($result)){
/* Do whatever here */
}
<小时/>
需要注意的是,这段代码很容易受到 SQL 注入(inject)的攻击,因为您直接在查询中使用变量。我建议您开始使用带有占位符的准备好的语句,如下所示
$sql = "SELECT l.*
FROM users u
JOIN logs l ON u.vpnuserreg=l.username
WHERE u.company=?
ORDER BY l.radacctid DESC";
$stmt = $database->prepare($sql);
$stmt->bind_param("s", $company);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
while ($row = $database->fetch_array($result)){
/* Do whatever here */
}
NOTE The above code is using
get_result()
and requires themysqlnd
driver to be installed. Otherwise, you have to usemysqli_stmt::bind_result()
andmysqli_stmt::fetch()
instead ofmysqli_stmt::get_result()
!
关于PHP - 进阶 MYSQL 同时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42206437/