Pertama, menangani kesalahan selama pengembangan sangat penting jadi kami memeriksa apakah posting kami ada, kami memeriksa apakah kami terhubung ke database, kami memeriksa apakah kueri kami lulus dan OK untuk dijalankan, kami memeriksa parameter yang kami berikan ke query dan akhirnya kita mengeksekusi query tersebut.
Setelah itu Anda dapat menggunakan bind_result
untuk memberi nama variabel untuk menerima bidang dari kueri Anda, seperti yang telah saya lakukan.
Perhatikan bagaimana pada kueri saya yang saya gunakan? itu adalah pernyataan siap yang kami definisikan menggunakan bind_param
ini untuk menghindari injeksi SQL, dalam kode Anda saat ini, Injeksi SQL masih dimungkinkan karena Anda tidak membersihkan variabel Anda.
Kesalahan lain yang saya yakin Anda lakukan adalah menyimpan kata sandi sebagai teks biasa yang SANGAT SANGAT SALAH, Anda harus selalu mengenkripsi kata sandi untuk melindungi pengguna dan diri Anda sendiri. Itu sebabnya saya tidak memasukkan kata sandi pada permintaan MySQL saya, pertama saya hanya menggunakan pengguna, jika pengguna ditemukan saya kemudian menggunakan kata sandi yang dia posting untuk mencocokkan kata sandi yang diambil dari database, dalam hal ini saya menggunakan bcrypt
untuk melakukan tugas yang merupakan perpustakaan enkripsi yang sangat aman.
Lihat di sini cara menggunakan bcrypt
.
Hanya setelah saya melihat bahwa kata sandi itu valid, saya kemudian menempatkan data ke dalam sesi dan mengarahkan ulang pengguna.
Selain semua kesalahan yang telah saya tunjukkan di bagian bawah jawaban saya, inilah cara saya menulis kode Anda.
<?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';
}
CATATAN:Kode di atas hanyalah contoh dan belum diuji, jika Anda menemukan kesalahan apa pun, beri tahu saya.
Beberapa kesalahan yang saya perhatikan pada kode yang Anda posting:
Anda melewatkan ;
. penutup di sini:
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
Juga pada permintaan Anda, Anda memiliki $Members
tetapi Anda tidak memiliki $Members
variabel yang didefinisikan di mana saja dalam kode Anda, apakah Anda mungkin bermaksud mengatakan Members
sebagai gantinya, seperti dalam:
$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
Bukankah ini
$count = mysql_num_rows($result);
Jadilah
$count = mysqli_num_rows($result);
Dan
$result=mysqli_query($sql);
Jadilah
$result=mysqli_query($sql_connection, $sql);
Anda tidak memiliki kueri di bagian mysqli_query
di bawah ini
if (!mysqli_query($sql_connection))