我试图通过比较两个表来填充下拉菜单,其中一个表有主管和员工编号列表,另一个表则有员工编号和姓名。我需要取每个主管和员工的号码,并将其转换为下拉菜单中的员工姓名,所以基本上是
表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_employeelist
或payroll_users
的
此处的文档
我还想记住,mysql_
函数已弃用,因此我建议您在新项目中切换到mysqli
或PDO
。