jam68ty / Comment

0 stars 0 forks source link

BucketTalk/post/php-mysql-login/ #2

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

PHP-MySQL系列 登入與註冊系統 | BucketTalk

在製作登入與註冊系統前必須先理解Cookie與Session的概念簡單來說,Cookie是本地端紀錄你的登入狀況Session則是伺服器端紀錄你的登入狀況推薦一篇淺顯易懂的文章給大家:白話 Session 與 Cookie:從經營雜貨店開始

https://jam68ty.github.io/BucketTalk/post/php-mysql-login/

ItingLai commented 2 years ago

請問我照著做,為什麼在welcome頁面沒出現使用者名字? 麻煩幫我解惑

jam68ty commented 2 years ago

請問我照著做,為什麼在welcome頁面沒出現使用者名字? 麻煩幫我解惑

你可能要確認一下$_SESSION["username"]這部分的變數有沒有真的被傳入,在login.php:20的地方可以看到SESSION中儲存的username是來自資料庫中儲存的使用者,您可以:

  1. 先確認註冊後的user真實存在:註冊完成後到phpmyadmin檢查是否真的有這筆資料
  2. 檢查變數名稱是否正確:可能打錯字?
  3. 確認sql query真的有抓到資料:可以在phpmyadmin中的SQL搜尋中輸入與login.php:12相同的搜尋查看結果

如果以上都還有問題也都歡迎提問喔~

win5923 commented 2 years ago

我把login.php:20 改成 $_SESSION["username"] = $username;就可以顯示出來了 原本的也都找不到

jam68ty commented 2 years ago

我把login.php:20 改成 $_SESSION["username"] = $username;就可以顯示出來了 原本的也都找不到

因為這樣做的話:$_SESSION["username"] = $username; 只是使用表單傳入的username(就是使用者打的內容),就算打的username不正確也無法判斷出來,還是必須透過去資料庫裡尋找相對應的使用者才行

請問註冊完成後資料庫是有東西的嗎?使用login.php:12的sql query在phpmyadmin中查找也能找到對應的使用者嗎? 如:註冊時username為"user1",SELECT * FROM users WHERE username = "user1" 請確認資料庫中確實有users這個table以及註冊後確實有存入資料 資料庫的操作可以參考這篇喔~ PHP-MySQL系列 資料庫練習-連接、創建表格、插入資料

win5923 commented 2 years ago

註冊完成 資料庫也有新增成功 但是session抓不到

win5923 commented 2 years ago

mysqli_fetch_assoc($result)["username"]; 裏面沒東西 但是MySQL裡面是有資料的

win5923 commented 2 years ago

有限問題了 login.php:11行那邊執行後面都抓不到$_POST[]的東西了

win5923 commented 2 years ago

我在 if(mysqli_num_rows($result) == 1)前面先加了一個$row = mysqli_fetch_assoc($result); 分別娶他的每一個列的值就抓的到了

ItingLai commented 2 years ago

請問資料庫裡有資料了,但是在session那邊抓不到怎麼解決

jam68ty commented 2 years ago

我在 if(mysqli_num_rows($result) == 1)前面先加了一個$row = mysqli_fetch_assoc($result); 分別娶他的每一個列的值就抓的到了

關於mysqli_fetch的相關用法可以參考這篇:https://stackoverflow.com/questions/18577774/differences-in-mysqli-fetch-functions mysqli_num_rows計算了$result這個query的搜尋結果"數量",mysqli_fetch_assoc則是把搜尋結果做成一個類似map的資料結構(這邊稱為associative array)。 理論上,符合該組帳號密碼的使用者應該只能有一個,所以會需要加上if這句做檢查。

jam68ty commented 2 years ago

你可以試試看在login.php:20之後加入下面這一行試試看session裡有沒有儲存到值: function_alert("$_SESSION["username"]"); 如果沒有辦法正常顯示出剛剛登入的使用者名稱代表session沒有儲存,此時就要去檢查mysqli_fetch_assoc($result)的結果是不是預期的

pengushow commented 2 years ago

我在 if(mysqli_num_rows($result) == 1)前面先加了一個$row = mysqli_fetch_assoc($result); 分別娶他的每一個列的值就抓的到了

試了很久,只有這方法可行,好奇為甚麼這麼做就行了?

pengushow commented 2 years ago

index.php:php的部分 這段的意義是什麼,刪掉之後也可以正常運作,為什麼要加這段?

win5923 commented 2 years ago

有點忘記了,只記得當初mysqli_fetch_assoc($result)["username"]; 找不到東西,所以我才改成我下面的寫法。