比较两个MySQL表以填充下拉列表

时间:2013-04-15 14:07:21

标签: php mysql

我正在尝试通过比较两个表来填充下拉菜单,一个包含主管和员工编号列表,另一个包含员工编号和名称。我需要为每个主管和员工记录数字,并将其转换为下拉菜单的员工姓名,所以基本上

TABLE payroll_employeelist

主管员工

1234 3456

1234 2239

1234 123

2910 338

2910 3901

TABLE payroll_users

号码名称

3456 John Smith

2239 Mary Jane

123 Joe Brown

主管由会话变量callede $ usernumber标识。 到目前为止我所得到的并返回一个结果(只有一个!)如下:

if ($loademployees == 1){
echo "<option value=\"base\">---- Employee Name ----</option>";

        $query = "SELECT payroll_employeelist.employee, payroll_users.number, payroll_users.name FROM payroll_employeelist WHERE supervisor='$usernumber' LEFT JOIN payroll_users ON payroll_employeelist.employee=payroll_users.number ";

        $result = mysql_query($query);
        while ($row = mysql_fetch_array($result)) {
            echo "<option value=\">" . $row{'name'} . "</option>";
        }
        echo "</select><br>";
        }

任何人都可以帮忙吗?我觉得我已经用JOIN做了一些有趣的事情。它应该看起来像下拉列表中的员工姓名列表。

更新

我现在拥有的是:

if ($loademployees == 1){
    echo "<option value=\"base\">---- Employee Name ----</option>";

       $query = "SELECT payroll_employeelist.supervisor, payroll_employeelist.employee, payroll_users.number, payroll_users.name 
    FROM payroll_employeelist 
    INNER JOIN payroll_users 
    ON payroll_employeelist.employee = payroll_users.number 
    WHERE supervisor = '$usernumber' ";

    $result = mysql_query($query);
    while ($row = mysql_fetch_array($result)) {
        echo "<option value=\">" . $row['name'] . "</option>";

    }
    echo "</select><br>";
    }

这成功返回测试数据集中的三个记录之一,只有一个,即中间记录。 $ usernumber是内部生成的,不能注入。

最后更新 - 已解决 问题是否相信是

echo "</select><br>"; 

它在回显while循环的结果之前回应了它,所以它认为选项列表是空的。我无法解释随机出现的单身员工的想法,但它现在正在运作。

6 个答案:

答案 0 :(得分:1)

您需要在表payroll_users上加入payroll_employeelist两次,因为有两列依赖于它。

SELECT  sup.Name SupervisorName,
        empName EmployeeName
FROM    payroll_employeelist a
        INNER JOIN payroll_users sup
            ON a.Supervisor = sup.number
        INNER JOIN payroll_users emp
            ON a.Employee = emp.Number
WHERE   sup.Supervisor = '$usernumber'

作为旁注,如果变量的值( s )来自外部,则查询易受SQL Injection攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

答案 1 :(得分:0)

这可能是因为你把连接条件放在了WHERE中,但是你可能想把它放在外面:

SELECT payroll_employeelist.employee, payroll_users.number, payroll_users.name
INNER JOIN payroll_users ON payroll_employeelist.employee=payroll_users.number
FROM payroll_employeelist 
WHERE supervisor='$usernumber' 

此外,如果您使用LEFT JOIN,您还将获得未附加到任何用户的员工。关于逃避的一些事情:

$query = "SELECT ... WHERE supervisor='$usernumber'  ... ";

如果$usernumber来自Web请求,则易受SQL注入攻击;考虑使用mysql_real_escape_string()来转义它或切换到PDO / mysqli并使用预准备语句。

    $result = mysql_query($query);
    while ($row = mysql_fetch_array($result)) {
        echo "<option value=\">" . $row{'name'} . "</option>";
    }

你也应该逃避$row['name'],你也不应该使用大括号:

        echo "<option value=\">" . 
            htmlspecialchars($row['name'], ENT_QUOTES, 'UTF-8') . 
            "</option>";

答案 2 :(得分:0)

你的 sintax 中有错误
请检查

    $query = "SELECT payroll_employeelist.employee, payroll_users.number, payroll_users.name FROM payroll_employeelist WHERE supervisor='$usernumber' LEFT JOIN payroll_users ON payroll_employeelist.employee=payroll_users.number ";

    $query = "SELECT payroll_employeelist.`employee`, payroll_users.`number`, payroll_users.`name` FROM `payroll_employeelist` LEFT JOIN `payroll_users` ON payroll_employeelist.employee` = payroll_users.`number` WHERE `supervisor` = '$usernumber' ";

关于此

WHERE `supervisor` = '$usernumber' "; 

主管在哪个桌面?您需要使用前缀payroll_employeelistpayroll_users

进行修复

文档here

我还想记住,mysql_函数已被弃用,因此我建议您切换到mysqliPDO以获取新项目。

答案 3 :(得分:0)

SELECT 

tb1.supervisor,
tb1.employee,
tb2.name

FROM

payroll_employeelist AS tb1
INNER JOIN payroll_users AS tb2

ON tb1.employee = tb2.number 

如果你想要完全匹配,没有不匹配的值,你需要INNER JOIN而不是LEFT JOIN

答案 4 :(得分:0)

使用

SELECT payroll_employeelist.employee, payroll_users.number, payroll_users.name FROM payroll_employeelist LEFT JOIN payroll_users ON payroll_employeelist.employee = payroll_users.number WHERE supervisor = '$usernumber' 

代替。

答案 5 :(得分:0)

您应该考虑使用PDO进行查询。由于您在查询中动态分配值,因此PDO会更安全一些,如果您多次运行此查询,PDO会更快。

对于您的查询,您的SQL子句排序不正确。也许这些链接会有所帮助:

PDO Tutorial from MySQL

SQL Join Tutorial