PHP - 高级MYSQL

时间:2017-02-13 14:27:28

标签: php mysql

我有下一个情况。

  1. 从PHP表单我只获得公司ID
  2. 我需要使用该companny ID列出所有用户名
  3. 我需要数组并导出到包含该用户名的所有日志
  4. 我的问题是,当我下次尝试时:

    $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个用户名?

2 个答案:

答案 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"