Tout d'abord, la gestion des erreurs pendant le développement est très importante, nous vérifions donc si nos messages sont présents, nous vérifions si nous nous sommes connectés à la base de données, nous vérifions si notre requête a réussi et peut être exécutée, nous vérifions les paramètres que nous donnons au requête et nous exécutons enfin la requête.
Après cela, vous pouvez utiliser bind_result
pour nommer une variable pour recevoir les champs de votre requête, comme je l'ai fait.
Remarquez comment sur ma requête j'utilise ? c'est une instruction préparée que nous définissons en utilisant le bind_param
c'est pour éviter l'injection SQL, dans votre code actuel, l'injection SQL est toujours possible puisque vous ne nettoyez pas vos variables.
Une autre erreur que je crois que vous faites est de stocker les mots de passe sous forme de texte brut qui est TRÈS TRÈS FAUX, vous devez toujours chiffrer le mot de passe pour protéger vos utilisateurs et vous-même. C'est pourquoi je n'inclus pas le mot de passe dans ma requête MySQL, j'utilise d'abord uniquement l'utilisateur, si l'utilisateur est trouvé j'utilise ensuite le mot de passe qu'il a posté pour correspondre au mot de passe récupéré de la base de données, dans ce cas j'utilise bcrypt
pour effectuer la tâche qui est une bibliothèque de chiffrement très sécurisée.
Voir ici comment utiliser bcrypt
.
Ce n'est qu'après avoir vu que le mot de passe est valide que je place les données dans la session et que je redirige l'utilisateur.
Outre toutes les erreurs que j'ai signalées au bas de ma réponse, voici comment j'écrirais votre code.
<?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';
}
REMARQUE :Le code ci-dessus n'est qu'un exemple et n'a pas été testé. Si vous remarquez une erreur, faites-le moi savoir.
Certaines des erreurs que j'ai remarquées sur le code que vous avez posté :
Il vous manque le ;
de fermeture par ici :
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
Aussi sur votre requête vous avez $Members
mais vous n'avez pas de $Members
variable définie n'importe où dans votre code, vouliez-vous peut-être dire Members
à la place, comme dans :
$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
Cela ne devrait-il pas
$count = mysql_num_rows($result);
Soyez
$count = mysqli_num_rows($result);
Et
$result=mysqli_query($sql);
Soyez
$result=mysqli_query($sql_connection, $sql);
Vous n'avez aucune requête sur la partie ci-dessous du mysqli_query
if (!mysqli_query($sql_connection))