PHP - 进阶 MYSQL 同时

标签 php mysql

我有下一种情况。

  1. 从 PHP 表单中我只获得公司 ID
  2. 我需要使用该公司 ID 排列所有用户名
  3. 我需要数组并将具有该用户名的所有日志导出到表

我的问题是,当我尝试下一步时:

$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 the mysqlnd driver to be installed. Otherwise, you have to use mysqli_stmt::bind_result() and mysqli_stmt::fetch() instead of mysqli_stmt::get_result()!

关于PHP - 进阶 MYSQL 同时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42206437/

相关文章:

php - 通过 .htaccess 从 URL 剪切文件夹路径

php - single-product.php 打不开

php - Zend Framework 2 - 注释表单和 Doctrine2 - 可捕获的 fatal error - ObjectManager

mysql - 将 SVN 与 xamp 运行的 MySQL 数据库一起使用 - 是或否? (如何?)

mysql - 在 MySQL 中使用什么数据类型来存储图像?

mysql - 来自 mysql 的 python 中的 JSON 和额外的键值对

PHP:在多个请求中保持与 API 的 HTTPS 连接打开

php - 对数组中的数据进行分组

php - MYSQL 数据类型用于长描述、特殊字符

mysql - 截断 MySQL 查询中的日期时间列