Đầu tiên, việc xử lý các lỗi trong quá trình phát triển là rất quan trọng, vì vậy chúng tôi kiểm tra xem bài đăng của chúng tôi có xuất hiện hay không, chúng tôi kiểm tra xem chúng tôi đã kết nối với cơ sở dữ liệu chưa, chúng tôi kiểm tra xem truy vấn của chúng tôi có được thông qua không và có thể chạy hay không, chúng tôi kiểm tra các tham số chúng tôi đang cung cấp cho truy vấn và cuối cùng chúng tôi thực hiện truy vấn.
Sau đó, bạn có thể sử dụng bind_result
đặt tên cho một biến để nhận các trường từ truy vấn của bạn, giống như tôi đã làm.
Lưu ý về truy vấn của tôi mà tôi đang sử dụng như thế nào? đó là một câu lệnh được chuẩn bị sẵn mà chúng tôi xác định bằng cách sử dụng bind_param
điều này là để tránh SQL injection, trong mã hiện tại của bạn, SQL Injection vẫn có thể thực hiện được vì bạn không làm sạch các biến của mình.
Một sai lầm khác mà tôi tin rằng bạn đang làm là lưu trữ mật khẩu dưới dạng văn bản thuần túy RẤT SAI LẦM, bạn nên luôn mã hóa mật khẩu để bảo vệ người dùng và chính mình. Đó là lý do tại sao tôi không đưa mật khẩu vào truy vấn MySQL của mình, trước tiên tôi chỉ sử dụng người dùng, nếu người dùng được tìm thấy thì tôi sử dụng mật khẩu mà anh ta đã đăng để khớp với mật khẩu đã truy xuất từ cơ sở dữ liệu, trong trường hợp này tôi đang sử dụng bcrypt
để thực hiện tác vụ vốn là một thư viện mã hóa rất an toàn.
Xem tại đây cách sử dụng bcrypt
.
Chỉ sau khi tôi thấy rằng mật khẩu hợp lệ, tôi mới đặt dữ liệu vào phiên và chuyển hướng người dùng.
Ngoài tất cả các lỗi tôi đã chỉ ra ở cuối câu trả lời của mình, đây là cách tôi viết mã của bạn.
<?php
session_start();
include_once('bcrypt.php');
// Your database info
$db_host = '';
$db_user = '';
$db_pass = '';
$db_name = '';
if (!isset($_POST['Username']))
{
echo 'Fill in the username...';
exit;
}
if (!isset($_POST['Password']))
{
echo 'Fill in your password...';
exit;
}
$con = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($con->connect_error)
{
die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
}
$sql = "SELECT Username, Password FROM `Members` WHERE Username = ?";
if (!$result = $con->prepare($sql))
{
die('Query failed: (' . $con->errno . ') ' . $con->error);
}
if (!$result->bind_param('s', $_POST['Username']))
{
die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
}
if (!$result->execute())
{
die('Execute failed: (' . $result->errno . ') ' . $result->error);
}
$result->store_result();
if ($result->num_rows == 0)
{
die('No username found...');
}
$result->bind_result($db_username, $db_password);
$result->fetch();
$result->close();
$con->close();
$bcrypt = new Bcrypt(15);
if ($bcrypt->verify($password, $db_password))
{
$_SESSION['Username'] = $db_username;
header('location:login_success.php');
exit;
}
else
{
echo 'Wrong Username or Password';
}
LƯU Ý:Đoạn mã trên chỉ là một ví dụ và chưa được kiểm tra, nếu bạn nhận thấy bất kỳ lỗi nào với nó, hãy cho tôi biết.
Một số lỗi tôi đã nhận thấy trên mã bạn đã đăng:
Bạn đang thiếu ;
đóng ở đây:
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
Ngoài ra trong truy vấn của bạn, bạn có $Members
nhưng bạn không có $Members
biến được xác định ở bất kỳ đâu trong mã của bạn, có lẽ bạn muốn nói Members
thay vào đó, như trong:
$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
Điều này không nên
$count = mysql_num_rows($result);
Hãy
$count = mysqli_num_rows($result);
Và
$result=mysqli_query($sql);
Hãy
$result=mysqli_query($sql_connection, $sql);
Bạn không có truy vấn nào ở phần bên dưới của mysqli_query
if (!mysqli_query($sql_connection))