Thứ Năm, 28 tháng 5, 2026

PHP Login đúng password nhưng vẫn fail "Khi bạn chắc chắn nhập đúng… nhưng website không tin bạn"

Ăn phở, bún, mì...đều cần có hành! Đó là...chân lý! Nhưng "ăn hành" nằm trong dấu nháy ("") thì không ai muốn!

Bạn tạo form login.

Bạn nhập:

  • username đúng 😎
  • password đúng 😎
  • database đúng 😎

Bấm Login…

👉 Và website trả về:

Sai tài khoản hoặc mật khẩu

🤡

Bạn thử lại.

Vẫn sai.

Bạn copy password từ database.

Vẫn sai 😭

Bạn bắt đầu:

"Chuyện gì thế này! Hay mình bị điên thật rồi?"

👉 Không.
👉 Đây là một trong những lỗi PHP cho người mới "ăn hành" nhiều nhất 😅


PHP login đúng password nhưng vẫn fail là gì?


Lỗi login đúng password nhưng vẫn thất bại trong PHP thường do:

  • session lỗi
  • trim()/whitespace
  • password hash không đúng
  • sai tên field
  • query database sai
  • hosting cache/session issue
  • khác encoding

Đặc biệt rất hay gặp khi dùng:

  • InfinityFree
  • hosting miễn phí
  • localhost → upload host

Keyword SEO:

  • php login not working
  • php password correct but login fail
  • php session problem
  • php password_verify fail
  • infinityfree login issue

Ví dụ "trớt quớt" 😭

Bạn có:

Username: admin
Password: 123456

Database cũng lưu:

123456

Bạn login.

👉 FAIL 🤡


Ví dụ đời thường 🍜

Bạn tới khách sạn.

Đưa CCCD.

Nhân viên nói:

"Dạ, tui em không tìm thấy anh trong hệ thống."

Trong khi:

👉 bạn đang đứng ngay trước mặt họ 😭

PHP login lỗi cũng tạo cảm giác y chang. Trong bụng nghĩ gì trong những tình huống như vậy...bạn tự biết rồi đó!


9 nguyên nhân phổ biến nhất 😵


❌ 1. Có khoảng trắng thừa (whitespace)

Cực kỳ phổ biến 😭

Ví dụ database lưu:

123456

Nhưng user nhập:

123456 

(có dấu cách cuối)

👉 PHP thấy KHÁC 😅 Lỗi này là "chuyện thường ngày ở huyện", xảy ra như cơm bữa!


Cách fix 😎

<?php

$password = trim($_POST['password']);

?>

👉 trim() sẽ xóa:

  • khoảng trắng đầu
  • khoảng trắng cuối
  • Enter vô tình copy vào

Ví dụ "vô Lý Thường Kiệt..." 🤡

User copy password từ Messenger.

Messenger copy luôn:

\n

👉 Nhìn giống nhau.
👉 Nhưng PHP thấy khác 😅


❌ 2. Sai tên field form

HTML:

<input type="password" name="pass">

PHP:

$_POST['password']

👉 🤡

passpassword


❌ 3. Chưa hash password nhưng lại dùng password_verify()

Ví dụ:

Database lưu:

123456

Nhưng bạn check:

password_verify($password, $hash)

👉 FAIL 😅

Vì:

123456

không phải password hash.


Password hash là gì? 😎

Thay vì lưu:

123456

Bạn lưu dạng:

$2y$10$kjasdhaskjdh...

👉 Nếu database bị hack:
password thật khó lộ hơn 😎


Cách đúng 😎

Khi đăng ký:

<?php

$hash = password_hash($password, PASSWORD_DEFAULT);

?>

Khi login:

<?php

password_verify($password, $hash);

?>

❌ 4. So sánh hash bằng == 😭

Sai:

if($password == $hash)

👉 Không bao giờ đúng 😅

Hash luôn khác password gốc.


❌ 5. Session không hoạt động

Login thành công.

Nhưng refresh:

👉 bị đá ra ngoài 😭

Cực phổ biến trên InfinityFree 😅


Nguyên nhân 😵

Bạn quên:

session_start();

Cách đúng 😎

<?php

session_start();

$_SESSION['user'] = $username;

?>

👉 File nào dùng session cũng phải có:

session_start();

ở trên cùng 😎


InfinityFree case 😅

Trên InfinityFree:

👉 Session đôi khi "khó ở" hơn localhost (Miễn phí, đừng "théc méc").

Nếu:

  • output trước session_start()
  • có khoảng trắng trước <?php
  • BOM UTF-8 lỗi

👉 session có thể fail 🤡


❌ 6. Header already sent 😭

Ví dụ:

echo "Hello";

session_start();

👉 💀

Session dùng header.

Mà bạn đã output trước.


Kết quả 😭

Warning:
Cannot modify header information

Hoặc session không lưu 😅


❌ 7. Query database sai

Ví dụ:

SELECT * FROM users WHERE username='$username'

Nhưng:

admin

trong database thật ra là:

Admin

👉 Có server phân biệt hoa thường 😅


❌ 8. Database lưu password bị cắt 😭

Ví dụ cột password:

VARCHAR(20)

Nhưng hash dài hơn 😅

👉 Hash bị cắt.
👉 password_verify fail.


Cách đúng 😎

VARCHAR(255)

❌ 9. Upload thiếu file config 😭

Localhost chạy ngon.

Upload InfinityFree:

💀 login fail.

Sau 2 tiếng debug…

👉 Quên upload:

config.php

🤡


Một lỗi cực "cạn lời" 😵

Localhost:

😎 login được

InfinityFree:

💀 fail

Nguyên nhân thật:

$username = trim($_POST['username']);

Localhost trước đó test bằng tay nên không sao.

Nhưng trên điện thoại:

👉 auto space 😭


Code login mẫu đúng 😎

login.php

<?php

session_start();

$conn = mysqli_connect("localhost", "root", "", "test");

$username = trim($_POST['username'] ?? '');
$password = trim($_POST['password'] ?? '');

$sql = "SELECT * FROM users WHERE username='$username'";

$result = mysqli_query($conn, $sql);

$user = mysqli_fetch_assoc($result);

if($user && password_verify($password, $user['password'])){

$_SESSION['user'] = $username;

echo "Login thành công 😎";

}else{

echo "Sai tài khoản hoặc mật khẩu 😭";

}

?>

Luôn nhớ thay localhost, root...phù hợp với hosting thực tế.

Debug login kiểu dev thật 😎

✅ 1. var_dump dữ liệu

var_dump($_POST);

👉 Xem PHP thật sự nhận gì.


✅ 2. var_dump password_verify

var_dump(password_verify($password, $hash));

👉 true hay false?


✅ 3. Echo session

var_dump($_SESSION);

✅ 4. Xem dữ liệu database thật

Rất nhiều người tưởng database lưu:

123456

Nhưng thật ra:

123456 

có khoảng trắng🤡


Một kỹ năng rất quan trọng 😎

Người mới thường:

👉 "Login fail chắc PHP lỗi."

Thực tế:

👉 80% là:

  • whitespace
  • session
  • hash
  • field name
  • database 😅

Checklist "chuẩn không cần chỉnh" 😎

Khi login đúng password nhưng vẫn fail:

  1. trim() input.
  2. Kiểm tra field name.
  3. Kiểm tra session_start().
  4. Kiểm tra password hash.
  5. Dùng password_verify().
  6. Kiểm tra database thật.
  7. Kiểm tra VARCHAR password đủ dài.
  8. Kiểm tra upload host đủ file.
  9. var_dump EVERYTHING 😎

Tổng kết

PHP login fail dù password đúng là lỗi cực phổ biến.

Đặc biệt với:

  • người mới
  • hosting miễn phí
  • InfinityFree
  • session
  • password hash

👉 Đừng đoán mò.

Debug từng bước 😎


❓ FAQ nhanh

Vì sao localhost login được mà InfinityFree fail?

→ Thường do:

  • session
  • cache
  • upload thiếu file
  • header already sent
  • whitespace 😅

Có nên lưu password dạng text thường không?

→ Không 😭

Nên dùng:

password_hash()

password_verify() có bắt buộc không?

→ Nếu dùng hash:
Có 😎


session_start() đặt ở đâu?

→ Đầu file 😅

Trước mọi:

  • echo
  • HTML
  • khoảng trắng

👉 Bạn có thể cũng đang gặp: