0

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

表 payroll_employeelist

主管员工

1234 3456

1234 2239

1234 123

2910 338

2910 3901

表 payroll_users

号码名称

第3456章

第2239章 玛丽珍

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 循环的结果之前回显了这一点,因此它认为选项列表为空。我无法解释随机出现的单身员工提醒你,但它现在正在工作。

4

6 回答 6

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'

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

于 2013-04-15T14:09:19.073 回答
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>";
于 2013-04-15T14:09:49.917 回答
0

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

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

MySQL 的 PDO 教程

SQL 连接教程

于 2013-04-15T14:16:01.897 回答
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

文档在这里

我还想提醒您,mysql_功能已被弃用,因此我建议您切换到新项目mysqliPDO进行新项目。

于 2013-04-15T14:10:26.453 回答
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

于 2013-04-15T14:10:52.843 回答
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' 

反而。

于 2013-04-15T14:11:36.333 回答