不是作業也不是工作
最近在寫php網頁
打算用來當工作日誌用
遇到一個問題如下
當我的帳戶是user2做登入時
可以看見4筆資料
當我的帳戶是user1做登入時
只看得到1、2、4筆資料
我sql該如何下??
附加條件:登入網頁會有session(自已想到是用session去判斷sql語法)
帳戶不止2個人、類別不止2種(所以不能只針對這二種寫)
select * from Table
where pname='帳號' or pp not in ('私人')
你的需求應該是:
自己才能看到自己的私人類
不是自己的,就看要挑什麼類 (你說不止兩種類)
所以 SQL 是:
<pre class="c" name="code">select * from TABLE
where pname='帳號' or pp in ('公開','其它類1','其它類2')
^^|
不行
因為sql是寫死在網頁中
但類別可以變動(除了公開與私人不能動外)
所以換句話說
當我的種類有4種
公開、私人、公司資料、其它資料時
除了公開與私人是不能修改之外
公司資料與其它資料被修改的話
sql語法無法運作
這就是我SQL語法傷腦筋的地方
感覺要用排除法.....
剛想想想
想到,硬是要用此語法也是可以
先列出全部類別
丟入列陣變數中
再與sql結合
如果真的沒其它方法的話.......
那就是改成
<pre class="c" name="code">select * from Table
where pname='帳號' or pp != '私人'
醬子,就不用怕公司資料與其它資料被修改了。
<pre class="c" name="code">
-- 我先以每個user能看到自己私人的,其餘公開等類型都能看,
-- 看不到別人私人的.不知這樣是不是你想要的.
CREATE TABLE ithelp0913 (
pid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
ptitle VARCHAR(20) NOT NULL,
pdate DATE NOT NULL,
pname VARCHAR(10) NOT NULL,
pp VARCHAR(20) NOT NULL);
INSERT INTO ithelp0913(ptitle, pdate, pname, pp) VALUES
('修電腦','2010/8/20', 'user1', '公開'),
('朋友吃飯', '2012/9/30', 'user1', '公開'),
('買車', '2012/10/10', 'user2', '私人'),
('到台北', '2012/11/11', 'user2', '公開');
-- 假設登入為 user1
SET @myname := 'user1';
SELECT *
FROM ithelp0913
WHERE pp != '私人'
UNION ALL
SELECT *
FROM ithelp0913
WHERE pp = '私人'
AND pname = @myname;
+-----+--------------+------------+-------+--------+
| pid | ptitle | pdate | pname | pp |
+-----+--------------+------------+-------+--------+
| 1 | 修電腦 | 2010-08-20 | user1 | 公開 |
| 2 | 朋友吃飯 | 2012-09-30 | user1 | 公開 |
| 4 | 到台北 | 2012-11-11 | user2 | 公開 |
+-----+--------------+------------+-------+--------+
-- 假設登入為 user2
SET @myname := 'user2';
+-----+--------------+------------+-------+--------+
| pid | ptitle | pdate | pname | pp |
+-----+--------------+------------+-------+--------+
| 1 | 修電腦 | 2010-08-20 | user1 | 公開 |
| 2 | 朋友吃飯 | 2012-09-30 | user1 | 公開 |
| 4 | 到台北 | 2012-11-11 | user2 | 公開 |
| 3 | 買車 | 2012-10-10 | user2 | 私人 |
+-----+--------------+------------+-------+--------+