台灣最大程式設計社群網站
線上人數
715
 
會員總數:245484
討論主題:189238
歡迎您免費加入會員
討論區列表 >> PHP >> 關於程式執行順序(會員登入)
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
關於程式執行順序(會員登入)
價值 : 50 QP  點閱數:872 回應數:5

樓主

Po Hong Shih
門外漢
0 1
22 1
發送站內信

https://drive.google.com/folderview?id=0B7yk47jrP-78NzF1bDJsMWZWY28&usp=sharing

上面的google網址,是我練習製作一個簡單會員登入系統,並且加上會員今日的登入次數。
但在做的過程當中,遇到一個讓我很想不通的事情,還請各位先進幫忙為小弟解惑。

在login的檔案當中,分別有兩個主要部分:

一、判斷使用者登入次數,並防止刷新洗次數,程式碼如下(或見google雲端):
if(isset($_SESSION["login"]) && $_SESSION["login"]=="ok") {
if(!isset($_SESSION["same"])){
if(isset($_COOKIE[$_GET["user"]]))
{
setcookie($_GET["user"],++$_COOKIE[$_GET["user"]],strtotime(date("Y-m-d 23:59:59")));
}
else
{

setcookie($_GET["user"],"1",strtotime(date("Y-m-d 23:59:59")));
header("Location: login.php?user=".$_GET["user"]);
}
$_SESSION["same"]="1";
}
}

二、判斷是否按下登入,並且記錄是否處理登入狀態
if(isset($_POST["operate"]))
{
if($_POST["operate"]=="update")
{
echo "<script>alert('密碼錯誤');</script>";
}
if($_POST["operate"]=="logout")
{
session_unset();
header("Location: login.php");
}
if($_POST["operate"]=="register"){
header("Location: Register.php");}
if($_POST["operate"]=="login"){
mysqli_query($connect,"SET NAMES utf8");
$sql = "SELECT * FROM `member` WHERE `account`='".$_POST["account"]."'";
$result = mysqli_query($connect,$sql);
$num = mysqli_num_rows($result);
$row = mysqli_fetch_assoc($result);
if($num==1)
{
if($row["password"]==$_POST["password"])
{
$_SESSION["login"]="ok";
header("Location: login.php?user=".$_POST["account"]);
}
else
echo "<script>alert('密碼錯誤');</script>";
}
else
echo "<script>alert('無此帳號');</script>";
}
}


上述的兩段程式碼的順序,我覺得調換位置並沒有關係
但實際上,我在測試的時候,若將"判斷使用者登入次數"置於"判斷是否按下登入"的程式碼之後,

1. 不知道為何會因此抓取不到$_GET的參數(網址列完全沒有user的值)。
2. 之後有發現將 header("Location: login.php?user=".$_GET["user"]); 刪除後,問題1可解除。但是很奇怪的是$_SESSION["same"]還未進入條件句,竟然就有值,導致cookie的值一直無法累加。

以上兩個問題,很請各位先進不吝給予指教,謝謝你們!!


搜尋相關Tags的文章: [ cookie ] , [ session ] , [ 會員登入 ] ,
本篇文章發表於2016-01-15 02:37
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

皮皮快跑
檢舉此回應
幾個問題:
第一個:請善用程式碼標籤………

第二個:你把太多需要分開來處理的功能全放在同一個頁面來做……這就造成了編寫及維護上的一些困難。

第三個:不要把資料處理的語法和html混在一起……把他們分開來寫比較好(這是看你雲端的內容)

第四個:就算你是個新手,我還是具體建議先學體好function也就是函式封裝。把你的每一件事情單純化,不然你這樣程式碼整段copy來copy去你會覺得煩,看得人也會。

本篇文章回覆於2016-01-15 10:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

迷路
捐贈 VP 給 迷路 檢舉此回應
第一,請愛用「程式碼區塊」!!!!!!這種沒有編排過的程式碼很難看懂!!
第二,你的問題關鍵點在於用header跳轉頁面時並不會中止網頁的繼續編譯,這中間有個很短暫的時間差
按照原本的順序,先判斷登入次數,在未登入時是不會進入判斷流程的
等到登入後,重新導入頁面,傳入值從POST變成GET,這時就不會再次觸發登入判斷
因此兩個流程基本上不會碰到同時觸發的情況

可是當你將順序對掉後,判斷登入後給出SESSION值,滿足了登入次數判斷的條件進入判斷流程
到最後跳轉的其實是這行header("Location: login.php?user=".$_GET["user"]);
但你現在的傳入值是POST沒有GET,所以就會抓不到參數

最簡單的解決方式就是在header跳轉後加上一行
exit;
中止PHP繼續向下編譯

本篇文章回覆於2016-01-15 10:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
你們兩個都說完了。
我沒得說了~~~~
本篇文章回覆於2016-01-15 10:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

Po Hong Shih
檢舉此回應
謝謝各位先進的幫忙
因為很少用藍色小舖,所以不知道可以用「程式碼區塊」,造成困擾真是抱歉。
另外不用function的原因,是因為希望手打多次把程式碼的語法精熟進來,造成閱讀上的困擾亦是深感抱歉。

總之,謝謝各位先進給予的意見以及問題的解決。謝謝大家。
本篇文章回覆於2016-01-15 16:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
大至上跟你說一下觀念

「另外不用function的原因,是因為希望手打多次把程式碼的語法精熟進來」
這樣的觀念並不好的。

function也是一種學習的重點。且不影響你的熟練度。
(不過到是不錯的bug除錯練習就是了)

寫功能庫也是學習的一環。因為這樣你才能學到何謂結合的重點。
而不是寫死程式。
本篇文章回覆於2016-01-15 17:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.