iT邦幫忙

0

php 會員註冊

  • 分享至 

  • xImage

就是我已經可以新增會員,在mysql那邊也有成功同步到,但是我要登入的時候還是說我帳號密碼錯誤,不知道是登入哪部分錯誤,再麻煩各位解惑。

login.php

https://ithelp.ithome.com.tw/upload/images/20230422/201563781uM9crNJ4p.png

wiseguy iT邦超人 1 級 ‧ 2023-04-22 17:39:02 檢舉
1. 還是把 username 外來變數直接插進 SQL 字串裡耶!
2. password 直接比對,看來是把 password 明碼直接存進 DB ...
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
Felix
iT邦研究生 2 級 ‧ 2023-04-22 06:36:19
最佳解答

沒有資料庫的架構,不好判斷是否為程式碼的問題。

可能的原因有很多,舉例來說(已排除資料庫連線的問題):

資料表沒有超鍵

使用 mysqli_num_rows 函式,如果查詢條件不具唯一性,那麼 1 就不會是 mysqli_num_rows 的回傳值。

只是確認查詢是否成功(資料表是否存有資料),將 mysqli_num_rows($result) === 1 改為 $result 即可。

資料表欄位名稱有誤

從程式碼能看出,資料表有 帳號 欄位,但是使用 mysqli_fetch_assoc 函式取得查詢結果時,卻是指定 password 欄位。

一般而言,欄位名稱會全部使用英文,不會一下中文一下英文,因此請檢查欄位名稱是否有誤。


儘管只有提問密碼錯誤的問題,但是這裡還是列出未來程式碼可能遇到的問題:

  1. 調用 mysqli_query 會有 SQL 注入的風險:如果 Client 的請求包含值為 ‘ OR '1username 參數,就能達成注入的效果。
  2. 調用 mysqli_fetch_assoc 會自查詢結果取得下一行的資料:程式碼調用 2 次,將會導致第 2 次回傳 null 或其他資料。
  3. 直接取得陣列資料會因為鍵值不存在而丟出錯誤:如果 Client 的請求缺少 usernamepassword 參數,直接取得 $_POST 變數就會丟出錯誤。

題外話,其實 3~5 行的程式碼沒有作用。

看更多先前的回應...收起先前的回應...

不好意思還是沒有成功,我附上資料庫的結構!https://ithelp.ithome.com.tw/upload/images/20230422/20156378H9ZXf5XvJi.png

目前登入的code
https://ithelp.ithome.com.tw/upload/images/20230422/20156378yeNfZgaTZq.png

你的欄位是 id、accountname、 pass
但你程式是用 username password 等KEY值來取值。
當然拿不到值啊!!!

我一開始就是用我設的 accountname、pass 來取值結果不管帳號對不對都可以登入,然後新增帳號跟密碼傳到資料庫都是空的

Felix iT邦研究生 2 級 ‧ 2023-04-22 17:01:09 檢舉

neil410912021

不應該在 $_SESSION 儲存密碼,只要儲存唯一識別碼就好了。此外,記得 mysqli_fetch_assoc 不要調用 2 次嗎?怎麼現在變成 3 次了…

調用 mysqli_fetch_assoc($result) 時,一直指定 ['password'] 當然會有問題,因為資料表沒有 password 欄位,程式碼一開始就沒有取得 pass 的值。


先改成這樣再說:

/* 替換第 2 行 */
- $conn = require_once 'mysql.inc.php';
+ require_once 'mysql.inc.php;

/* 刪除第 4 行 */
- include 'mysql.inc.php';
$row = mysqli_fetch_assoc($result);

if ($result && $password === $row['pass']) {
    session_start();

    $_SESSION['username'] = $row['accountname'];
}

感謝您,懂您的意思了也成功改好了!
我會再去磨練一下資料庫的基本概念跟應用!!

0
海綿寶寶
iT邦大神 1 級 ‧ 2023-04-22 09:34:46

另一個除錯法
在13-15列之間寫

/* fetch associative array */
while ($row = mysqli_fetch_assoc($result)) {
    printf("%s (%s)\n", $row["帳號"], $row["password"]);
}

看看資料庫有沒有成功撈出來你預期的帳號密碼
參考資料來源

id,accountname(不是「帳號」),pass(不是「password」)
才三個欄位你就寫錯兩個
以後有的苦頭吃了...

了解了感謝您!

1

認真來說,從各位大大們給你的答案。跟你的回答來看。
我發現你完全沒理解大大們跟你說的事。

如果你是初學資料庫操作的話。我會建議你重新再來一次。
並且學習使用PDO的方式來操作。

並去了解一下資料庫的應用為何。
不要東抄西抄的。然後還抄個四不像出來。

認真來說,在PHP8已經預設不使用 mysqli 的相關函式了。
(當然還是可以再掛模組進來使用就是了,只是預設不在是預設需要掛入的模組了)

所以學習mysqli的函數已不太適合了。建議你還是直接學習PDO的應用。

感謝您的指教

我要發表回答

立即登入回答