Đoạn mã sau chỉ khai báo một biến chuỗi có chứa truy vấn MySQL:
$sql = "INSERT INTO users (username, password, email)
VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";
Nó không thực hiện truy vấn. Để làm được điều đó, bạn cần sử dụng một số chức năng nhưng trước tiên hãy để tôi giải thích một số chức năng khác.
KHÔNG BAO GIỜ TIN TƯỞNG ĐẦU VÀO CỦA NGƯỜI DÙNG :Bạn không bao giờ nên thêm đầu vào của người dùng (chẳng hạn như đầu vào biểu mẫu từ $_GET
hoặc $_POST
) trực tiếp cho truy vấn của bạn. Ai đó có thể cẩn thận thao túng dữ liệu đầu vào theo cách như vậy có thể gây ra thiệt hại lớn cho cơ sở dữ liệu của bạn. Đó được gọi là SQL Injection. Bạn có thể đọc thêm về nó tại đây
Để bảo vệ tập lệnh của bạn khỏi cuộc tấn công như vậy, bạn phải sử dụng Báo cáo chuẩn bị. Thông tin thêm về các tuyên bố đã chuẩn bị tại đây
Bao gồm các câu lệnh đã chuẩn bị vào mã của bạn như sau:
$sql = "INSERT INTO users (username, password, email)
VALUES (?,?,?)";
Lưu ý cách ?
được sử dụng làm trình giữ chỗ cho các giá trị. Tiếp theo, bạn nên chuẩn bị câu lệnh bằng cách sử dụng mysqli_prepare
:
$stmt = $mysqli->prepare($sql);
Sau đó, bắt đầu liên kết các biến đầu vào với câu lệnh đã chuẩn bị:
$stmt->bind_param("sss", $_POST['username'], $_POST['email'], $_POST['password']);
Và cuối cùng là thực hiện các câu lệnh đã chuẩn bị sẵn. (Đây là nơi diễn ra quá trình chèn thực tế)
$stmt->execute();
LƯU Ý Mặc dù không phải là một phần của câu hỏi, nhưng tôi thực sự khuyên bạn không bao giờ lưu trữ mật khẩu dưới dạng văn bản rõ ràng. Thay vào đó, bạn nên sử dụng password_hash
để lưu trữ một hàm băm của mật khẩu