Php 根据交叉引用表为用户选择所有角色。PDO MySQL子查询或联接
我尝试了下面的代码,它返回了一个空数组,而我真的希望它返回几行。我的表格布局在代码下面。(注意,Php 根据交叉引用表为用户选择所有角色。PDO MySQL子查询或联接,php,mysql,pdo,Php,Mysql,Pdo,我尝试了下面的代码,它返回了一个空数组,而我真的希望它返回几行。我的表格布局在代码下面。(注意,$connection->prepare()的注释版本,我尝试了两种方法。) 如果不是很明显,我要做的是找到分配给某个用户的所有角色名,如果我知道他们的用户id(sl_用户表中的id列) sl_用户_角色 +---------+---------+ | Field | Type | +---------+---------+ | user_id | int(11) | | role_id |
$connection->prepare()
的注释版本,我尝试了两种方法。)
如果不是很明显,我要做的是找到分配给某个用户的所有角色名,如果我知道他们的用户id(sl_用户表中的id列)
sl_用户_角色
+---------+---------+
| Field | Type |
+---------+---------+
| user_id | int(11) |
| role_id | int(11) |
+---------+---------+
作为一个快速测试,我这样称呼它:
var_export(getrolesnamesbyuserid($_SESSION['user_id']));
我的方向对吗?如果是,我该如何修复它。
如果没有,我如何重新编写?可能是作为一个连接,但我对它们没有太多的经验。我无法重现您的错误,为其创建数据库和php脚本,一切正常。确保您的数据和查询一切正常吗?我已尝试重新创建数据库结构并执行代码,但无法重新创建问题,这意味着错误在您的数据中。您是否检查了
sl_user_roles
中的数据链接是否正确,以及$\u SESSION['user_id']
是否已实际设置为某个值?尝试插入以下虚拟行,然后将var\u export()
行中的$\u会话['user\u id']
替换为99999:
INSERT INTO `sl_role` VALUES (99991, 'Foo');
INSERT INTO `sl_role` VALUES (99992, 'Bar');
INSERT INTO `sl_role` VALUES (99993, 'Bin');
INSERT INTO `sl_role` VALUES (99994, 'Baz');
INSERT INTO `sl_user_roles` VALUES (99999, 99991);
INSERT INTO `sl_user_roles` VALUES (99999, 99992);
INSERT INTO `sl_user_roles` VALUES (99999, 99994);
您的查询应该返回角色“Foo”、“Bar”和“Baz”。如果是这样,那么错误就出现在数据中,而不是逻辑中。可以使用以下语句删除虚拟行:
DELETE FROM `sl_role` WHERE `id` IN (99991, 99992, 99993, 99994);
DELETE FROM `sl_user_roles` WHERE `user_id` = 99999;
显然,在执行此操作之前,请检查您没有任何具有这些ID的用户或角色。:)
此外,我建议将您的查询重组如下:
SELECT `r`.`name` AS `role_name`
FROM `sl_role` AS `r`
LEFT JOIN `sl_user_roles` AS `ur`
ON `ur`.`role_id` = `r`.`id`
WHERE `ur`.`user_id` = :user_id
这将比使用子查询更有效率。虽然这本书很长,但在某些方面还是值得一读的。:) 我看你的问题没有错。它在这个SQLFiddle中工作得很好。你如何调用你的函数?
$user\u id
是有效id吗?我查错了问题。我的$\u会话['user\u id']
为空。我会解决这个问题,然后再试一次。谢谢您的测试。@Sean:已将该网站添加为书签。辉煌的资源,多年来一直在寻找这样的东西!谢谢你引起我的注意!:)感谢您提供的JOIN
语法。我将研究,甚至在未来的参考,因为我希望需要在这个和其他项目的变化。
DELETE FROM `sl_role` WHERE `id` IN (99991, 99992, 99993, 99994);
DELETE FROM `sl_user_roles` WHERE `user_id` = 99999;
SELECT `r`.`name` AS `role_name`
FROM `sl_role` AS `r`
LEFT JOIN `sl_user_roles` AS `ur`
ON `ur`.`role_id` = `r`.`id`
WHERE `ur`.`user_id` = :user_id