[mysql]从使用事务的多个表中提取数据

标签: MySQL PHP
发布时间: 2017/4/9 22:40:21
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 2 MySQL 表︰

  • 候选人︰ uniqid,年龄、 性别等。
  • 工作︰ candidate_uniqid,application_date,contacted_by 等。

我想要建立一个配置文件为每个候选人显示来自两个候选人和工作表的信息。每个候选人可以有多个工作条目。

这里是我在做什么︰

<?php
    if (isset($_GET['uniqid'])) {
        $uniqid = $_GET['uniqid'];
    }
        $queryCandidate = "SELECT * FROM candidate WHERE uniqid = '{$uniqid}'";
        $queryJob = "SELECT * FROM job WHERE candidate_uniqid = '{$uniqid}'";

        mysqli_begin_transaction($conn, MYSQLI_TRANS_START_READ_ONLY);
        $resultCandidate = mysqli_query($conn, $queryCandidate);
        $resultJob = mysqli_query($conn, $queryJob);
        mysqli_commit($conn);

        $rowCandidate = mysqli_fetch_assoc($resultCandidate);

        while($rowJob = mysqli_fetch_assoc($resultJob)){
            // echo $rowJob['some_value'] . '<br>';
            // display data from job table until there is nothing left to fetch
        }

        // display data from candidate table
        //echo $rowCandidate['candidate_name'] . '<br>';
        //echo $rowCandidate['phone'] . '<br>';    
?>

我的问题是︰

  1. 我没有使用 MySQL 事务正常吗?
  2. 我去拿数据基于我从那里得到一个变量 $_GET['uniqid'] 。什么样的安全措施应我牢记当这样做?

谢谢!

解决方法 1:

你应该用 SQL INNER JOIN:

SELECT c.* , j.* FROM candidate AS c
INNER JOIN job AS j ON c.uniqid = j.candidate_uniqid
WHERE uniqid = @u

INNER JOIN 是卷宗的基于每个表中具有相同的值的一个 (或多个) 列的 concats 2 表的关键字显示所有可能。

下面是使用 INNER JOIN 的可能结果︰

example of an table got with the inner join

你可能注意到了,我还添加了 @u 而不是 $uniqid 。这个我用的那种保护,就像在 SQL 中,才得以集于一体的前主查询查询变量。完整的代码看起来像︰

if (isset($_GET['uniqid'])) {

    //if the uniqid is a number, use these two lines
    $uniqid = intval($_GET['uniqid']);
    mysqli_query($conn,"set @u = $uniqid"); 

    //else, if the uniqid is a string, use these two lines
    $uniqid = mysqli_real_escape_string($conn,$_GET['uniqid']);
    mysqli_query($conn,"set @u = '$uniqid'"); 

    $query = "SELECT c.* , j.* FROM candidate AS c
        INNER JOIN job AS j ON c.uniqid = j.candidate_uniqid
        WHERE uniqid = @u";
    $result = mysqli_query($conn, $query);

    while($row = mysqli_fetch_assoc($result)){


    }

}   

如果你 (或其他任何人) 需要更进一步的解释,只是问问 !

官方微信
官方QQ群
31647020