Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据交叉引用表为用户选择所有角色。PDO MySQL子查询或联接_Php_Mysql_Pdo - Fatal编程技术网

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