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


Comparing two MySQL tables to populate a dropdown

我试图通过比较两个表来填充下拉菜单,其中一个表有主管和员工编号列表,另一个表则有员工编号和姓名。我需要取每个主管和员工的号码,并将其转换为下拉菜单中的员工姓名,所以基本上是

表payroll_eemployelist-

主管员工

1234 3456

1234 2239

1234 123

2910 338

2910 3901

表payroll_users

号码名称

3456 John Smith

2239 Mary Jane

123乔·布朗

etc

主管由一个名为$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循环的结果之前就回显了,所以它认为选项列表是空的。请注意,我无法解释随机出现的单身员工,但它现在正在发挥作用。

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

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,您可以摆脱在值周围使用单引号的情况。

  • 如何防止PHP中的SQL注入

这可能是因为您将联接条件放在了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并使用prepared语句。

    $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>";
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

使用

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' 

相反。

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

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

MySQL PDO教程

SQL Join教程

您的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

此处的文档

我还想记住,mysql_函数已弃用,因此我建议您在新项目中切换到mysqliPDO