Modifier : Ok, vous avez donc fait une faute de frappe dans les champs du formulaire. Vous mélangez toujours les API MySQL, voir ci-dessous à propos de la fonction de mélange utilisant mysql_real_escape_string()
.
Regardez name="myusername"
et votre affectation POST, ainsi que celle de votre mot de passe.
Ils ne correspondent pas.
Modifier name="myusername"
à name="username"
et name="mypassword"
à name="password"
selon
$myusername=$_POST["username"];
$mypassword=$_POST["password"];
Avoir utilisé rapport d'erreurs , aurait signalé un index indéfini et un avertissement d'en-têtes déjà envoyés ; voir ci-dessous.
Vous avez également des espaces avant <?php
ce qui provoquerait une sortie avant l'en-tête. Supprimez-les.
De plus, vous mélangez les API MySQL avec mysql_error()
. mysql_error()
devrait se lire comme mysqli_error($con)
et ceci ci-dessous :
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
qui devrait se lire comme
$myusername = mysqli_real_escape_string($con,$myusername);
$mypassword = mysqli_real_escape_string($con,$mypassword);
ou
$myusername = mysqli_real_escape_string($con,$_POST['username']);
$mypassword = mysqli_real_escape_string($con,$_POST['password']);
mysqli_
etmysql_
les fonctions ne se mélangent pas.
Concernant la sécurité
J'ai remarqué que vous stockiez peut-être des mots de passe en texte brut. Si tel est le cas, cela est fortement déconseillé.
Je vous recommande d'utiliser CRYPT_BLOWFISH
ou password_hash()
de PHP 5.5
fonction. Pour PHP < 5.5, utilisez le password_hash() compatibility pack
.
De plus, en ce qui concerne l'injection SQL, utilisez mysqli
avec des relevés préparés
, ou PDO avec instructions préparées
, ils sont beaucoup plus sûrs .
Notes de bas de page
Il est préférable d'ajouter exit;
après chaque en-tête.
header("location:login_success.php");
exit;
et pour tous les en-têtes.
Modifier :
Supprimer
$myusername=$_POST["username"];
$mypassword=$_POST["password"];
echo $myusername . "<br>";
echo $mypassword . "<br>";
puis remplacez-le par :
$myusername = stripslashes($_POST["username"]);
$mypassword = stripslashes($_POST["password"]);
$myusername = mysqli_real_escape_string($con,$_POST['username']);
$mypassword = mysqli_real_escape_string($con,$_POST['password']);
Modifier #2 :
C'est avec cela que j'ai testé votre code et j'ai réussi, donc je ne sais pas ce qui ne va pas avec votre code actuel.
FORMULAIRE HTML
<form action="main_login.php" method="post" style="text-align:right;">
Username:
<input type="text" name="username" value="" size=20 style="display:inline-block;margin-left:10px"required>
<br>
Password:
<input type="text" name="password" value="" size=20 style="margin-left:12px"required>
<br>
<input type="submit" value="Log In" style="margin-left:75px"=>
</form>
MySQL
<?php
$DB_HOST = 'xxx';
$DB_USER = 'xxx';
$DB_PASS = 'xxx';
$DB_NAME = 'xxx';
$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
die('Connection failed [' . $conn->connect_error . ']');
}
$myusername = stripslashes($_POST["username"]);
$mypassword = stripslashes($_POST["password"]);
$myusername = mysqli_real_escape_string($conn,$_POST['username']);
$mypassword = mysqli_real_escape_string($conn,$_POST['password']);
echo $myusername; // echos
echo "<br>";
echo $mypassword; // echos
$sql="SELECT * FROM register WHERE username='$myusername' and password='$mypassword'";
$result=mysqli_query($conn,$sql);
$count=mysqli_num_rows($result);
if($count==1){
echo "Yep";
}
else{
echo "nope";
}
N.B. : Vous devez également effacer vos sessions (détruire les sessions ), il se peut que quelque chose sur le serveur mette en cache les anciens noms d'utilisateur et mots de passe.
Assurez-vous également qu'il n'y a pas d'espaces dans vos colonnes, que les types sont corrects et que les longueurs sont suffisamment longues pour contenir les données. Généralement VARCHAR(255)
est plus que suffisant, mais est suggéré lors de l'utilisation de mots de passe hachés générés par password_hash()
, une fonction que vous devriez utiliser lors du stockage des mots de passe.
Voir aussi :
sur la pile.