Ă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']
👉 🤡
pass ≠ password
❌ 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:
- trim() input.
- Kiểm tra field name.
- Kiểm tra session_start().
- Kiểm tra password hash.
- Dùng password_verify().
- Kiểm tra database thật.
- Kiểm tra VARCHAR password đủ dài.
- Kiểm tra upload host đủ file.
- 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: