iT邦幫忙

0

如何把欄位變數存入session變數裡

  • 分享至 

  • xImage

最近想做個管理者權限網頁 根據欄位名稱id顯示不同連PHP黨的按鍵 應該說只有id為1的管理員才看的到新增管理員跟刪除管理員按鍵在同個網頁,其他管理員都看不到新增跟刪除的按鍵,只能瀏覽網頁
看之前問答文章有人說放在輸入帳密後面,欄位變數存入session變數裡,但是我剛學,請教要怎麼修改
資料表worker資料為
欄位為 id,username,password
1,admin,admin
2,test1,test1
3,test2,test2
db.pdo.conn.php是連資料庫程式
login.php是登入輸入帳密頁面
checkpwd.php是帳密驗證

checkpwd.php

<?php require_once('db.pdo.conn.php'); ?>
<?php
if(isset($_POST['username'])&&isset($_POST['password'])){
	//有收到表單變數username 及 password 接著查詢是否與資料庫match
	$stmt = $connection->prepare("select * from worker where `username`='".$_POST['username']."' and `password`='".$_POST['password']."'"); 
	$stmt->execute(); 
	$row = $stmt->fetch();
	if($row['username']!=''){
		session_start();
		$_SESSION['username']=$row['id'].'_'.$row['username'];
		header('Location: main.php');
	}else{
		header('Location: login.php?errmsg=login_fail');
		die();
	}

}else{
	header('Location: login.php');
	die();
}
?>
看更多先前的討論...收起先前的討論...
ccutmis iT邦高手 2 級 ‧ 2019-05-30 09:28:01 檢舉
欲速则不達。 - Haste makes waste.
在另一篇文裡有建議您去找好一點的PHP書來看,這不是開玩笑。

你提到的應該是在管理區依照不同登入帳號給予不同權限,
以目前worker資料表來說是沒辦法,最少要再加一個欄位,例如
id,username,password,permission
1, admin, adminpwd, A
2, user1, user1pwd, B
3, user2, user2pwd, C
假設permission A是最高權限 可以看到新刪改管理員的功能
permission B或C就是一般的管理員 只能瀏覽
有這樣的設定你才有辦法繼續後面的部份

資料表設定OK,再來就是PHP部份,這個最簡單的就是從驗證登入那邊下手
原本的checkpwd.php 只有把 id_usernme 存入$_SESSION['username']:
$_SESSION['username']=$row['id'].'_'.$row['username'];
在這一行的後面加上
$_SESSION['permission']=$row['permission'];
//用SESSION變數來記錄當前登入帳號權限

然後在你的後台管理頁要取得權限的方法也很簡單
例如:

<?php //檢查session['username']是否存在
session_start();
if(!$_SESSION['username']){
header('Location: login.php');
}else{
$current_user= explode('_',$_SESSION['username']);
$permission = $_SESSION['permission'];
}
?>

這樣就把$_SESSION['permission']變數內容傳給php變數 $permission了
最後是修改原本 新增管理者按鈕 的地方
例如原本是

<p><a href="addWorker.php">新增管理員</a></p>
改成

<?php if($permission=='A'){?>
<p><a href="addWorker.php">新增管理員</a></p>
<?php }?>
另外嚴謹一點的話,要到新增管理員 刪除管理員的頁面最上方驗證是否已登入那邊加上判斷權限是否為'A'
若不為'A'表示是有一般權限的管理者登入main.php後直接在網址輸入addWorker.php或 deleteWorker.php試圖繞過權限管控,這裡判斷出session變數permission不為'A'的就強制重導向到其它頁面
諸如此類的細節很多,直接找書來看吧,推薦O'REILLY出的書
我在addWorker.php加上這些
<?php //檢查session['username']是否存在
session_start();
if(!$_SESSION['username']){
header('Location: login.php');
}elseif ($_SESSION['permission'] != 'A'){
  header('Location: main.php');
}else{
$current_user= explode('_',$_SESSION['username']);
}
?>
我在網址測輸入addWorker.php測
結果
錯誤
Parse error: syntax error, unexpected 'header' (T_STRING) in
addWorker.php on line 6
是哪裡錯了 可以指點一下嗎
ccutmis iT邦高手 2 級 ‧ 2019-05-30 16:37:15 檢舉
我剛漏看了東西 你這裡的邏輯有問題
"我在addWorker.php加上這些
...略...
}elseif ($permission = 'A'){
  header('Location:addWorker.php');
如果權限是A就導向到addWorker.php
先不管$permission要不要換成$_SESSION['permission']
你這樣寫的邏輯不就變成
有權限A的進到這一頁會一直無限重導向到addWorker.php嗎
我改$_SESSION['permission'] 還是顯示第六行 錯誤
剛剛想到改了只是現在不知哪裡問題
ccutmis iT邦高手 2 級 ‧ 2019-05-30 17:08:48 檢舉
改成這樣
<?php //檢查session['username']是否存在
session_start();
if(!$_SESSION['username']){
header('Location: login.php');
}else{
if($_SESSION['permission']!='A'){ header('Location: main.php');}
$current_user= explode('_',$_SESSION['username']);
}
?>
ccutmis iT邦高手 2 級 ‧ 2019-05-30 17:14:12 檢舉
如果 SESSION變數username不存在
  就導向到login.php
否則 (註: 表示SESSION變數username存在)
  假如 SESSION變數permission不為'A' 就導向到main.php
  (註: 到這邊如果沒被導向就表示為正常登入且有'A'權限)
  把SESSION變數username值傳給PHP變數$current_user

以上是整段程式的虛擬碼 先不談php語法 至少邏輯要有
ccutmis iT邦高手 2 級 ‧ 2019-05-30 17:20:26 檢舉
這個不錯 可以參考看看https://ithelp.ithome.com.tw/users/20107394/ironman/1332
謝謝你 本篇算解決了
只是沒辦法給你最佳解答哈哈
ccutmis iT邦高手 2 級 ‧ 2019-05-31 07:44:31 檢舉
沒關西 希望你能有所收獲...^^
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
小魚
iT邦大師 1 級 ‧ 2019-05-30 07:56:59

不懂,
所以...遇到的問題是什麼?

0
WQ
iT邦新手 2 級 ‧ 2019-05-30 08:01:44

1.在PHP程式開始的第一行加入"sessionstart();"
2.$SESSION['username']=$row['id'].''.$row['username'];您這行即是附與SESSION變數。
3.在另一頁去讀取$SESSION['username']的值...

至於怎麼改....您就試試看....
另外建議,SELECT 不要寫SELECT * FROM....,要寫出欄位名稱(這是壞習慣,要改)。

我要發表回答

立即登入回答