Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pemecahan masalah login PHP SQL sederhana

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)) 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa menggunakan Variabel Buatan Pengguna MySql di .NET MySqlCommand?

  2. SQLSTATE[HY093]:Nomor parameter tidak valid:parameter tidak ditentukan

  3. prosedur tersimpan mysql yang menyebut dirinya secara rekursif

  4. Mengurutkan bidang varchar secara numerik di MySQL

  5. ProxySQL:Semua Sumber Daya Somenines