Po pierwsze obsługa błędów podczas tworzenia jest bardzo ważna dlatego sprawdzamy, czy nasz post jest obecny, sprawdzamy, czy połączyliśmy się z bazą danych, sprawdzamy, czy nasze zapytanie przeszło i czy jest OK do uruchomienia, sprawdzamy parametry, które podajemy do zapytanie i w końcu je wykonujemy.
Następnie możesz użyć bind_result
nazwać zmienną, aby otrzymać pola z zapytania, tak jak ja to zrobiłem.
Zwróć uwagę, jak na moje zapytanie używam? to jest przygotowana instrukcja, którą definiujemy za pomocą bind_param
ma to na celu uniknięcie wstrzyknięcia SQL, w obecnym kodzie, wstrzyknięcie SQL jest nadal możliwe, ponieważ nie oczyszczasz swoich zmiennych.
Innym błędem, który według mnie popełniasz, jest przechowywanie haseł w postaci zwykłego tekstu, co jest BARDZO BARDZO BŁĘDNE. Zawsze powinieneś zaszyfrować hasło, aby chronić swoich użytkowników i siebie. Dlatego nie umieszczam hasła w moim zapytaniu MySQL, najpierw używam tylko użytkownika, jeśli użytkownik zostanie znaleziony, używam hasła, które zamieścił, aby pasowało do hasła pobranego z bazy danych, w tym przypadku używam bcrypt
do wykonania zadania, które jest bardzo bezpieczną biblioteką szyfrowania.
Zobacz tutaj jak używać bcrypt
.
Dopiero gdy widzę, że hasło jest prawidłowe, wprowadzam dane do sesji i przekierowuję użytkownika.
Poza wszystkimi błędami, które wskazałem na dole mojej odpowiedzi, oto jak napiszę Twój kod.
<?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';
}
UWAGA:powyższy kod jest tylko przykładem i nie był testowany, jeśli zauważysz w nim jakiś błąd, daj mi znać.
Niektóre z błędów, które zauważyłem w opublikowanym przez Ciebie kodzie:
Brakuje zamykającego ;
tutaj:
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
Również w swoim zapytaniu masz $Members
ale nie masz $Members
zmienna zdefiniowana w dowolnym miejscu w kodzie, może chciałeś powiedzieć Members
? zamiast tego, jak w:
$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
Czy nie powinno to
$count = mysql_num_rows($result);
Bądź
$count = mysqli_num_rows($result);
I
$result=mysqli_query($sql);
Bądź
$result=mysqli_query($sql_connection, $sql);
Nie masz zapytania w poniższej części mysqli_query
if (!mysqli_query($sql_connection))