[英]Select all the roles for a user based on a cross reference table. PDO MySQL sub-query or JOIN
我嘗試了以下代碼,當我真的希望它返回幾行時,它返回了一個空數組。 我的表格布局在代碼下方。 (注意,我嘗試過兩種方式的$connection->prepare()
的注釋版本。)
如果不太明顯,我想做的就是在知道用戶名的情況下,找到分配給該用戶的所有角色名。 (sl_user表中的id列)。
function getrolesnamesbyuserid($user_id){ //returns role names
$connection = new PDO('mysql:host=127.0.0.1;dbname='.DBNAME, DBUSER, DBPASS);
if(!$connection){echo '<!-- DB CONNECTION ERROR -->';}else{/* echo '<!-- DB CONNECTION CONFIRMED -->'; */}
$prep_get_roles=$connection->prepare('SELECT sl_role.name AS role_name FROM sl_role WHERE sl_role.id IN (SELECT sl_user_roles.role_id from sl_user_roles WHERE sl_user_roles.user_id = :user_id)');
// $prep_get_roles=$connection->prepare('SELECT r.name AS role_name FROM sl_role r WHERE r.id IN (SELECT ur.role_id from sl_user_roles ur WHERE ur.user_id = :user_id)');
$prep_get_roles->bindParam(':user_id',$user_id);
$prep_get_roles->execute();
return $prep_get_roles->fetchAll(PDO::FETCH_ASSOC);
}
sl_role
+-------+-------------+
| Field | Type |
+-------+-------------+
| id | int(11) |
| name | varchar(50) |
+-------+-------------+
sl_user_roles
+---------+---------+
| Field | Type |
+---------+---------+
| user_id | int(11) |
| role_id | int(11) |
+---------+---------+
為了快速測試,我這樣稱呼它:
var_export(getrolesnamesbyuserid($_SESSION['user_id']));
我在朝正確的方向前進嗎? 如果是這樣,我該如何解決。 如果沒有,我該如何重寫? 也許是參加,但是我對他們並沒有太多經驗。
我嘗試重新創建數據庫結構並執行代碼,但是無法重新創建問題,這意味着錯誤出在您的數據中。 您是否檢查過sl_user_roles
中的數據正確鏈接,並且$_SESSION['user_id']
實際上設置為某些值? 嘗試插入以下虛擬行,然后將var_export()
行中的$_SESSION['user_id']
替換$_SESSION['user_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
這將比使用子查詢更為有效。 雖然冗長,在MySQL的JOIN
語法文檔是非常值得在某些時候讀取。 :)
我無法重現您的錯誤,無法為其創建數據庫和PHP腳本,但一切正常。 確定您的數據和查詢一切正常嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.