Thứ Tư, 13 tháng 5, 2026

MySQL INSERT không chạy (không báo lỗi) – cảm giác bất lực rất "khó tả"

Form vẫn luôn là đề tài được "ưu ái" mỗi khi chúng ta "tới công chuyện" với SQL! Bạn viết xong form đăng ký, hân hoan vui sướng với kỳ vọng to lớn sẽ nhận được nhiều "đơn xin làm đồng bọn".


Tuy nhiên, đời không như là mơ.


Người dùng nhập:

  • Họ tên
  • Email
  • Mật khẩu


Bấm nút Đăng ký.


Trang web hiện thông báo rất phấn khởi:

"Đăng ký thành công!"


Bạn vui mừng mở phpMyAdmin ra kiểm tra.

…

Không có dòng dữ liệu nào mới? 


Bạn ngơ ngác, ngỡ ngàng...

"Ủa? Thành công kiểu gì mà database trống trơn vậy???"


Chúc mừng, bạn vừa gặp một trong những lỗi thuộc hàng "ức chế" nhất khi học PHP + MySQL:



INSERT không chạy, mà cũng chẳng báo lỗi gì. 


Màn hình thông báo "Thành công" nhưng tìm đỏ mắt cũng không thấy "Thành quả" đâu!?


MySQL INSERT không chạy nhưng không báo lỗi thường do:

  • câu SQL sai
  • dữ liệu từ form bị rỗng
  • tên cột không đúng
  • chưa submit form
  • không kiểm tra lỗi bằng mysqli_error()



Ví dụ thực tế


Hãy tưởng tượng bạn viết một lá thư, bỏ vào phong bì và gửi bưu điện.


Một tuần sau người nhận gọi điện:

"Tôi không nhận được gì cả."


Bạn kiểm tra lại thì phát hiện:

  • quên ghi địa chỉ
  • quên dán tem
  • hoặc… quên bỏ thư vào phong bì 


SQL INSERT cũng tương tự.

Nó "không đến nơi" vì đâu đó có vấn đề tương tự.



Ví dụ code cơ bản


$sql = "INSERT INTO users (username, email)

        VALUES ('$username', '$email')";



mysqli_query($conn, $sql);

echo "Đăng ký thành công!";


Bạn hãy nhìn kỹ lại code trên. Nhìn rất hợp lý.


Nhưng nếu query thất bại, bạn vẫn dùng lệnh echo để in:

"Đăng ký thành công!" 



Sai lầm "nhẵn mặt" với nhiều người


Không kiểm tra kết quả của mysqli_query()

mysqli_query($conn, $sql);

echo "Đăng ký thành công!";


Đây là kiểu:


"Không cần biết có thành công hay không, cứ ăn mừng trước đã."  


Vì rõ ràng câu "Đăng ký thành công!" được in ra màn hình mà không hề có "bà con" gì với kết quả của mysqli_query().


Cách viết đúng


if (mysqli_query($conn, $sql)) {



    echo "Đăng ký thành công";



} else {



    echo "Lỗi: " . mysqli_error($conn);



}


Đây là dòng code mà "chiên da" mới học PHP nên thuộc nằm lòng.



7 nguyên nhân phổ biến nhất


1. Dữ liệu từ form bị rỗng

$username = $_POST['username'];

$email    = $_POST['email'];


Nếu form không gửi dữ liệu đúng:

$username = ""

$email = ""


INSERT có thể không chạy như bạn mong muốn.

Debug nhanh

var_dump($_POST);


2. Tên cột sai

INSERT INTO users (user_name, email)

Trong database thực tế có thể là:

  • username
  • email

Chỉ khác một dấu gạch dưới là đủ gây lỗi 


3. Tên bảng sai

INSERT INTO user (...)

Trong database lại là: users


4. Dữ liệu chứa dấu nháy đơn

Ví dụ username:

O'Brien

Câu SQL sẽ bị hỏng nếu không escape đúng cách.


5. Chưa kết nối database thành công

$conn = mysqli_connect(...);

Nếu kết nối thất bại mà không kiểm tra, query chắc chắn không chạy.


6. Chưa submit form

Bạn mở file PHP trực tiếp.

$_POST hoàn toàn rỗng.


7. Vi phạm ràng buộc dữ liệu

Ví dụ:

  • email bị trùng (UNIQUE)
  • cột không cho phép NULL
  • dữ liệu vượt quá độ dài cho phép



Ví dụ thực tế với hosting miễn phí


Thuở ban đầu thì cái gì miễn phí đều là...chân ái. Nếu bạn đang học PHP trên hosting miễn phí như InfinityFree, quy trình thường là:

  • Tạo database.
  • Tạo bảng users.
  • Kết nối bằng thông tin database được cung cấp.
  • Chạy query INSERT.


Nếu không thấy dữ liệu, việc đầu tiên cần làm là:

echo mysqli_error($conn);

 

Code mẫu chuẩn


<?php



require "config.php";



$username = $_POST['username'];

$email = $_POST['email'];



$sql = "INSERT INTO users (username, email)

        VALUES ('$username', '$email')";





if (mysqli_query($conn, $sql)) {

    echo "Thêm dữ liệu thành công ";



} else {

    echo "Lỗi: " . mysqli_error($conn);



}



?>



Cách debug kiểu dev "xịn sò"


Bước 1: In dữ liệu nhận được

var_dump($_POST);


Bước 2: In câu SQL

echo $sql;


Bước 3: Chạy thử câu SQL trong phpMyAdmin

Copy câu SQL và chạy trực tiếp.

Nếu lỗi, phpMyAdmin sẽ báo rất rõ.


Bước 4: In lỗi MySQL

echo mysqli_error($conn);

 


Ví dụ "phũ phàng"


$username = $_POST['username'];

$email = $_POST['email'];



$sql = "INSERT INTO users (username, email)

        VALUES ('$username', '$email')";


Sau 2 tiếng debug, bạn phát hiện:

$_POST['username'] = ""


Người dùng quên nhập (bạn không bắt buộc người dùng nhập).


Hoặc…


Trong form bạn đặt:

<input name="user_name">


Nhưng PHP lại đọc:

$_POST['username']


Chỉ khác một dấu gạch dưới. 



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


Khi INSERT không chạy:

  • var_dump($_POST);
  • echo $sql;
  • echo mysqli_error($conn);
  • Chạy SQL trong phpMyAdmin.
  • Kiểm tra tên bảng.
  • Kiểm tra tên cột.
  • Kiểm tra UNIQUE constraints.



Một sự thật hơi "đau cái lòng"


Khi mới học PHP, rất nhiều người "tự tin" viết:

mysqli_query($conn, $sql);

echo "Thành công";


Kết quả:

  • query thất bại
  • dữ liệu không có
  • nhưng màn hình vẫn báo thành công 



Tổng kết


MySQL INSERT không chạy nhưng không báo lỗi thường do:


  • bạn chưa kiểm tra kết quả của mysqli_query()
  • dữ liệu đầu vào sai
  • câu SQL sai



Câu thần chú:

echo mysqli_error($conn);


Nhiều khi chỉ một dòng này giúp bạn tiết kiệm hàng giờ debug 



FAQ nhanh


Vì sao không báo lỗi?

Vì bạn không in lỗi ra.


Có nên dùng mysqli_error() không?

Có, đặc biệt khi học.


Cách debug nhanh nhất?

var_dump($_POST) + echo $sql + mysqli_error($conn).



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

Query chạy nhưng không có dữ liệu

Duplicate entry

SQL syntax error

MySQL không connect được