簡體   English   中英

根據交叉引用表為用戶選擇所有角色。 PDO MySQL子查詢或JOIN

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM