Problème de requête MySQLi [Résolu]

Signaler
-
Messages postés
32941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021
-
Bonjour, j'ai un problème avec mon code, j'ai fait un formulaire d'inscription qui fonctionnait mais maintenant, il ne fonctionne plus

je ne comprend pas pourquoi

voici le code de la page:

<!DOCTYPE html>
<html>
<head>
	<meta name="googlebot" content="noindex">
    <link rel="icon" type="images/png" sizes="512x512" href="android-chrome-512x512.png">
    <link rel="stylesheet" href="serie/allstyle.css">
    <link rel="stylesheet" href="style.css">
	<link rel="stylesheet" href="style1.css">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Streawer</title>
</head>
<body style="background-color: #444444;">
<!-- En-tête de la page-->
<script>
        $(document).keydown(function(e){
        if(e.which === 123){
           return false;
        }
    });
</script>
<div class="entete" onclick="window.location.reload()">
    <img src="img/logo.png" id="logo" alt="Logo Streawer"/>
    <a href="main.php" id="nm" style="color: #4DB89A;"><h1 id="nom">Streawer</h1></a>
</div>
<?php
require('config.php');
if (isset($_REQUEST['username'], $_REQUEST['email'], $_REQUEST['password'])){
    // verifier si le nom d'utilisateur existe
    $select = mysqli_query($conn, "SELECT * FROM `users` WHERE username='".$_POST['username']."'");
    // récupérer le nom d'utilisateur et supprimer les antislashes ajoutés par le formulaire
    $username = stripslashes($_REQUEST['username']);
    $username = mysqli_real_escape_string($conn, $username); 
        if(mysqli_num_rows($select)){
        // récupérer l'email et supprimer les antislashes ajoutés par le formulaire
        $email = stripslashes($_REQUEST['email']);
        $email = mysqli_real_escape_string($conn, $email);
        // récupérer le mot de passe et supprimer les antislashes ajoutés par le formulaire
        $password = stripslashes($_REQUEST['password']);
        $password = mysqli_real_escape_string($conn, $password);
        //requéte SQL + mot de passe crypté
        $query = "INSERT into `users` (username, email, password)
                VALUES ('$username', '$email', '".hash('sha256', $password)."')";
        // Exécute la requête sur la base de données
        $res = mysqli_query($conn, $query);
        if($res){
        echo "
            <div class='sucess'>
                <h3>Vous êtes inscrit avec succès.</h3>
                <p>Cliquez ici pour vous <a href='https://streawer.000webhostapp.com/'>connecter</a></p>
            </div>";
    }
    }else{
        $message = "Le nom d'utilisateur est deja utiliser.";
    }
}else{
?>
<form class="box" action="" method="post">
	<h1 class="box-logo box-title"><a href="https://streawer.000webhostapp.com/">Streawer</a></h1>
    <h1 class="box-title">S'inscrire</h1>
	<input type="text" class="box-input" name="username" placeholder="Nom d'utilisateur" required />
    <input type="text" class="box-input" name="email" placeholder="Email" required />
    <input type="password" class="box-input" name="password" placeholder="Mot de passe" required />
    <input type="submit" name="submit" value="S'inscrire" class="box-button" />
    <?php if (! empty($message)) { ?>
    	<p class="errorMessage"><?php echo $message; ?></p>
	<?php }?>
    <p class="box-register">Déjà inscrit? <a href="https://streawer.000webhostapp.com/">Connectez-vous ici</a></p>
</form>
<?php } ?>
</body>
<?php include('footer.php'); ?>
</html>


et la connexion au server MySQL fonctionne car je peux me connecter a mon site avec des identifiant mis avec phpMyAdmin.

Pour plus de précision demandez-moi.

Merci.

2 réponses

Messages postés
32941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021
3 557
Bonjour,

Affiche les erreurs PHP
(mets ce code au début de ton script php )
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


et à chaque requête, gère l'affichage éventuel des erreurs mysqli en cas d'erreur dans tes requêtes
sous la forme:
if (!mysqli_query($conn, " Ta requete sql ...")) {
    printf("Message d'erreur : %s\n", mysqli_error($link));
}


reviens nous voir avec le code modifié et les éventuels messages d'erreur si le souci persiste
j'ai mis le code avec ma requête et rien ne fonctionne pas encore.

voici le nouveau code:
<!DOCTYPE html>
<html>
<head>
	<meta name="googlebot" content="noindex">
    <link rel="icon" type="images/png" sizes="512x512" href="android-chrome-512x512.png">
    <link rel="stylesheet" href="serie/allstyle.css">
    <link rel="stylesheet" href="style.css">
	<link rel="stylesheet" href="style1.css">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Streawer</title>
</head>
<body style="background-color: #444444;">
<!-- En-tête de la page-->
<script>
        $(document).keydown(function(e){
        if(e.which === 123){
           return false;
        }
    });
</script>
<div class="entete" onclick="window.location.reload()">
    <img src="img/logo.png" id="logo" alt="Logo Streawer"/>
    <a href="main.php" id="nm" style="color: #4DB89A;"><h1 id="nom">Streawer</h1></a>
</div>
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
require('config.php');
if (isset($_REQUEST['username'], $_REQUEST['email'], $_REQUEST['password'])){
    // verifier si le nom d'utilisateur existe
    $select = mysqli_query($conn, "SELECT * FROM `users` WHERE username='".$_POST['username']."'");
    // récupérer le nom d'utilisateur et supprimer les antislashes ajoutés par le formulaire
    $username = stripslashes($_REQUEST['username']);
    $username = mysqli_real_escape_string($conn, $username); 
        if(mysqli_num_rows($select)){
        // récupérer l'email et supprimer les antislashes ajoutés par le formulaire
        $email = stripslashes($_REQUEST['email']);
        $email = mysqli_real_escape_string($conn, $email);
        // récupérer le mot de passe et supprimer les antislashes ajoutés par le formulaire
        $password = stripslashes($_REQUEST['password']);
        $password = mysqli_real_escape_string($conn, $password);
        //requéte SQL + mot de passe crypté
        //$query = "INSERT into `users` (username, email, password) VALUES ('$username', '$email', '".hash('sha256', $password)."')";
            if (!mysqli_query($conn, "INSERT into `users` (username, email, password)
            VALUES ('$username', '$email', '".hash('sha256', $password)."')")) {
                printf("Message d'erreur : %s\n", mysqli_error($link));
            }
        // Exécute la requête sur la base de données
        $res = mysqli_query($conn, $query);
        if($res){
        echo "
            <div class='sucess'>
                <h3>Vous êtes inscrit avec succès.</h3>
                <p>Cliquez ici pour vous <a href='https://streawer.000webhostapp.com/'>connecter</a></p>
            </div>";
    }
    }else{
        $message = "Le nom d'utilisateur est deja utiliser.";
    }
}else{
?>
<form class="box" action="" method="post">
	<h1 class="box-logo box-title"><a href="https://streawer.000webhostapp.com/">Streawer</a></h1>
    <h1 class="box-title">S'inscrire</h1>
	<input type="text" class="box-input" name="username" placeholder="Nom d'utilisateur" required />
    <input type="text" class="box-input" name="email" placeholder="Email" required />
    <input type="password" class="box-input" name="password" placeholder="Mot de passe" required />
    <input type="submit" name="submit" value="S'inscrire" class="box-button" />
    <?php if (! empty($message)) { ?>
    	<p class="errorMessage"><?php echo $message; ?></p>
	<?php }?>
    <p class="box-register">Déjà inscrit? <a href="https://streawer.000webhostapp.com/">Connectez-vous ici</a></p>
</form>
<?php } ?>
</body>
<?php include('footer.php'); ?>
</html>
Messages postés
32941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021
3 557 > firpic
Rien ne fonctionne, c'est à dire ?
Tu as des messages d'erreur ?
La page reste blanche ?
>
Messages postés
32941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021

Je n'ai aucune erreur, la page et bien chargée correctement, c'est juste que la requête ne se fait pas et que rien ne s'affiche après avoir clique dessus (il devrait s'afficher les lignes 55 à 58.

pour voire la page :
https://streawer.000webhostapp.com/register.php
Messages postés
32941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021
3 557
Plusieurs choses.
Déjà, on essaye de placer le maximum de code PHP en dehors du HTML ( en général avant le code html )
Il faut également éviter d'utiliser $_POST. Dans ton cas tu fais du post .. donc il faut utiliser $_POST
On place le Javascript à la fin de la page, juste avant le </body> de préférence
On ne place rien en dehors des balises <body></body>


<?php
//affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//connexion à la bdd
require_once('config.php');

//Je découpe le oode en "fonctions" ( que tu pourrais placer dans un fichier à part si 
// jamais tu t'en resserts dans d'autres pages )

/**
* Récupère les infos d'un utilisateur via son username
*/
function getUserByName($username){
  global $conn;
  $username = mysqli_real_escape_string($conn, $username); 
  $sql = "SELECT * FROM `users` WHERE username='$username'";
  if(!$select = mysqli_query($conn, $sql)){
     printf("Message d'erreur : %s\n", mysqli_error($conn));
     return false;
  }else{
    return $select;
  }
}

/**
* verifier si le nom d'utilisateur existe
*/
function checkIfUserExist($username){
  $select = getUserByName($username);
  return mysqli_num_rows($select) ? true : false; // retourne true si il existe sinon false
}

function addUser($username,$email,$password){
  global $conn;
  $username = mysqli_real_escape_string($conn, $username); 
  $email = mysqli_real_escape_string($conn, $email);
  $password = mysqli_real_escape_string($conn, $password);
  $sql = "INSERT into `users` (username, email, password)
            VALUES ('$username', '$email', '".hash('sha256', $password)."')";
  if (!mysqli_query($conn, $sql)) {
    printf("Message d'erreur : %s\n", mysqli_error($link));
    return false;
  }else{
    return true; 
  }
   
}

//juste le temps des tests, pour voir si ton formulaire s'envoie bien
echo "<br> ---> POST :";
var_dump($_POST);

// Récupération PROPRE des variables AVANT de les utiliser
// pour ça, j'utilise l'écriture ternaire ( sorte de IF/ELSE )
$username = !empty( $_POST['username']) ?  $_POST['username'] : NULL; 
$email = !empty( $_POST['email']) ?  $_POST['email'] : NULL;
$password = !empty( $_POST['password']) ?  $_POST['password'] : NULL; 

//traitement du formulaire
if($username && $email && $password ){
  
  if( checkIfUserExist($username) ){
    $message = "Le nom d'utilisateur est deja utiliser.";
  }else{
    if(addUser($username,$email,$password))){
    $message =  "<div class='sucess'>
                  <h3>Vous êtes inscrit avec succès.</h3>
                  <p>Cliquez ici pour vous <a href='https://streawer.000webhostapp.com/'>connecter</a></p>
                </div>";
    }else{
      $message = " Erreur lors de l'insertion en BDD";
    }
  }
  
}
?>

<!DOCTYPE html>
<html>
  <head>
    <meta name="googlebot" content="noindex">
      <link rel="icon" type="images/png" sizes="512x512" href="android-chrome-512x512.png">
      <link rel="stylesheet" href="serie/allstyle.css">
      <link rel="stylesheet" href="style.css">
      <link rel="stylesheet" href="style1.css">
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Streawer</title>
  </head>
  <body style="background-color: #444444;">
    <!-- En-tête de la page-->
    <div class="entete" onclick="window.location.reload()">
        <img src="img/logo.png" id="logo" alt="Logo Streawer"/>
        <a href="main.php" id="nm" style="color: #4DB89A;"><h1 id="nom">Streawer</h1></a>
    </div>

    <form class="box" action="" method="post">
      <h1 class="box-logo box-title"><a href="https://streawer.000webhostapp.com/">Streawer</a></h1>
        <h1 class="box-title">S'inscrire</h1>
        <input type="text" class="box-input" name="username" placeholder="Nom d'utilisateur" required />
        <input type="text" class="box-input" name="email" placeholder="Email" required />
        <input type="password" class="box-input" name="password" placeholder="Mot de passe" required />
        <input type="submit" name="submit" value="S'inscrire" class="box-button" />
        <?php if (!empty($message)) { ?>
          <p class="errorMessage"><?php echo $message; ?></p>
        <?php }?>
        <p class="box-register">Déjà inscrit? <a href="https://streawer.000webhostapp.com/">Connectez-vous ici</a></p>
    </form>
    <?php 
    } 
    ?>
    <?php include('footer.php'); ?>

    <script>
    $(document).keydown(function(e){
      if(e.which === 123){
         return false;
      }
    });
    </script>
  </body>
</html>

des que j'accède a la page cette erreur s'affiche :
---> POST :array(0) { }


Puis une fois le formulaire remplie et envoyer ces erreur s'affcihe :

---> POST :array(4) { ["username"]=> string(4) "test" ["email"]=> string(4) "test" ["password"]=> string(4) "test" ["submit"]=> string(10) "S'inscrire" }
Notice: Undefined variable: link in /storage/ssd3/384/16626384/public_html/register.php on line 44

Warning: mysqli_error() expects parameter 1 to be mysqli, null given in /storage/ssd3/384/16626384/public_html/register.php on line 44
Message d'erreur :


J'ai modifie la ligne 44 car ce n'était pas la meme variable donc j'ai mis $conn au lieu de $link. Du coup il me met cette erreur :
---> POST :array(4) { ["username"]=> string(4) "test" ["email"]=> string(4) "test" ["password"]=> string(4) "test" ["submit"]=> string(10) "S'inscrire" } Message d'erreur : Field 'last_login' doesn't have a default value
Messages postés
32941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021
3 557 > firpic
ah ben voila....

Donc :
Message d'erreur : Field 'last_login' doesn't have a default value


Cela veut dire que :
Soit tu ajoutes cette colonne dans ta requête INSERT en lui mettant une valeur
Soit, dans la config de ta table, tu définis ce champ avec une valeur par défaut.
( Ce n'est donc pas un souci de php .. mais de mysql. )
>
Messages postés
32941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021

Comment ont fait pour que se message ne sois pas affciher :
---> POST :array(4) { ["username"]=> string(4) "test" ["email"]=> string(4) "test" ["password"]=> string(4) "test" ["submit"]=> string(10) "S'inscrire" }
Messages postés
32941
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 juin 2021
3 557 > firpic
Et bien c'est facile ... tu lis les commentaires que j'ai mis dans le code ... et ça te permettra de trouver !