我有下一个情况。
我的问题是,当我下次尝试时:
$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个用户名?
答案 0 :(得分:1)
而不是运行两个查询,而是执行简单的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注入的攻击,因为您在查询中直接使用变量。我建议您开始使用带有占位符的预准备语句,这看起来像这样
$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 */
}
注意以上代码使用的是
get_result()
,需要安装mysqlnd
驱动程序。否则,您必须使用mysqli_stmt::bind_result()
和mysqli_stmt::fetch()
代替mysqli_stmt::get_result()
!
答案 1 :(得分:0)
你需要另一个while循环来获取' $ row' s。如果您正在查找一个查询并获取此用户的所有日志,则需要使用IF语句来检查“用户ID”。并对新用户ID做出反应。
尝试此查询:
"SELECT * FROM logs WHERE username in " .
" (SELECT vpnuserreg FROM users WHERE company='$company' ) " .
" ORDER BY username asc , radacctid DESC"