我正在尝试通过比较两个表来填充下拉菜单,一个包含主管和员工编号列表,另一个包含员工编号和名称。我需要为每个主管和员工记录数字,并将其转换为下拉菜单的员工姓名,所以基本上
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循环的结果之前回应了它,所以它认为选项列表是空的。我无法解释随机出现的单身员工的想法,但它现在正在运作。
答案 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_employeelist
或payroll_users
文档here
答案 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子句排序不正确。也许这些链接会有所帮助: