PHP

Requête SQL INSERT INTO dans PHP

Résolu

Bonjour tout le monde, je suis tout nouveau sur ce site !


Si je suis ici c'est que j'ai besoin de quelques éclaircissements alors je vous explique mon soucis dans le formulaire d'inscription.

Mon code n'est pas du tout terminé et je ne fais que le tester pour l'instant, j'apporterai des améliorations par la suite.

Alors lorsque je note des nouvelles données sur le formulaire et que je clique sur 'S'inscrire' j'ai une erreur SQL à la ligne 29. J'ai testé pas mal de moyen mais je n'arrive pas à comprendre mon erreur.


<?php
session_start();
$mysqli = mysqli_connect ("localhost", "root", "", "family-pic");


if(isset($_POST['forminscription']))
{
   if(!empty($_POST['pseudoClient']) AND !empty($_POST['prenomClient']) AND !empty($_POST['nomClient']) AND !empty($_POST['emailClient'])
      AND !empty($_POST['emailClient2']) AND !empty($_POST['passwordClient'])
      AND !empty($_POST['passwordClient2']))
   {
      $pseudoClient = htmlspecialchars($_POST['pseudoClient']);
      $prenomClient = htmlspecialchars($_POST['prenomClient']);
      $nomClient = htmlspecialchars($_POST['nomClient']);
      $emailClient = htmlspecialchars($_POST['emailClient']);
      $emailClient2 = htmlspecialchars($_POST['emailClient2']);
      $passwordClient = sha1($_POST['passwordClient']);
      $passwordClient2 = sha1($_POST['passwordClient2']);




      $pseudoClientlength = strlen($pseudoClient);
      if ($pseudoClientlength <= 255)
      {
         if ($emailClient == $emailClient2)
         {
            if(filter_var($emailClient, FILTER_VALIDATE_EMAIL))
            {
            if ($passwordClient == $passwordClient2)
            {
               $mysqli->insert("INSERT INTO clients(pseudoClient, prenomClient, nomClient, emailClient, passwordClient)
               VALUES (?, ?, ?, ?, ?)",
               array($pseudoClient, $prenomClient, $nomClient, $emailClient, $passwordClient));


            }
            else
            {
               echo "<script>alert('Les mots de passes ne correspondent pas !');
               document.location.href='Inscription.html'; </script>";
            }
            }
            else
            {
               echo "<script>alert('Votre adresse mail n'est pas valide !');
               document.location.href='Inscription.html'; </script>";
            }
         }
         else
         {
            echo "<script>alert('Les adresses mail ne correspondent pas !');
            document.location.href='Inscription.html'; </script>";
         }
      }
      else
      {
         echo "<script>alert('Le pseudo ne doit pas dépasser 255 caractères !');
         document.location.href='Inscription.html'; </script>";
      }
   }
   else
   {
      echo "<script>alert('Tous les champs doivent être complétés !');
      document.location.href='Inscription.html'; </script>";
   }


}
?>
694 vues
09 octobre 2019 à 15:48 (Édité)
Cette pub permet au site de vivre ...

Je me suis permis d'enlever le résolu pour te répondre 😉


Donc pour ta connexion j'ai fait quelques modifications avec les méthodes PDO et non plus mysqli :


session_start();

if(!empty($_POST)){
       extract($_POST);
       $valid = true;

       // Pour accéder aux variables de ton formulaire
	if (isset($_POST['connexion'])){
		$pseudoClient = (String) htmlentities(trim($_POST['pseudoClient']), ENT_QUOTES); 
		$passwordClient = (String) $_POST['passwordClient'];
		if (empty($pseudoClient)){
			$valid = false;
			$message_error = "Les champs pseudo et mot de passe sont vides !";
		}
		if (empty($passwordClient)){
			$valid = false;
		   	$message_error = "Le champ de mot de passe est vide !";
		}		
		if($valid){
			$passwordClient = sha1($passwordClient);
			try{
				$bdd = new PDO('mysql:host=localhost;dbname=family-pic;charset=utf8', 'root', '');
			}catch (Exception $e){
				die('Erreur : ' . $e->getMessage());
			}
			
			$req = $bdd->prepare("SELECT * 
				FROM clients 
				WHERE pseudoClient = ? AND passwordClient ?");
			$req->execute(array($pseudoClient, $passwordClient));
				if ($Requete->rowCount() == 0) {
				$message_error = "Le pseudo ou le mot de passe est incorrect !";
			}else{
				$_SESSION ['idClient'] = $req['idClient'];
				$_SESSION ['prenomClient'] = $req['prenomClient'];
				$_SESSION ['nomClient'] = $req['nomClient'];
				$_SESSION ['emailClient'] = $req['emailClient'];
				$_SESSION ['pseudoClient'] = $req['pseudoClient'];
				$_SESSION ['passwordClient'] = $req['passwordClient'];
				header ('Location:Ma-page.php');
				exit;
			}
		}
	}
}


Voilà ! (Je n'ai pas tester le code mais je t'ai refait un code qui utilise des méthodes plus récentes)

Cette pub permet au site de vivre ...

9 commentaires

De rien 😀

Si je peux aider un maximum de personnes et bien je le ferais avec plaisir 😁


Je t’ai répondu 👍

Pas de soucis ! Mais il n'était pas passé en "résolu" ^^ Du coup je l'ai fais ;)


Ensuite, merci énormément de m'aider à ce point, je tiens à préciser que c'est très rare de trouver des personnes comme toi qui sont prêtes à aider les autres sachant que je ne suis personne pour toi !


De plus, est-ce-que tu as pu voir ce que je t'ai posté dans ta section "Suggestions"? dans "Forum" ? :)

Je me suis permis d'enlever le résolu pour te répondre 😉


Donc pour ta connexion j'ai fait quelques modifications avec les méthodes PDO et non plus mysqli :


session_start();

if(!empty($_POST)){
       extract($_POST);
       $valid = true;

       // Pour accéder aux variables de ton formulaire
	if (isset($_POST['connexion'])){
		$pseudoClient = (String) htmlentities(trim($_POST['pseudoClient']), ENT_QUOTES); 
		$passwordClient = (String) $_POST['passwordClient'];
		if (empty($pseudoClient)){
			$valid = false;
			$message_error = "Les champs pseudo et mot de passe sont vides !";
		}
		if (empty($passwordClient)){
			$valid = false;
		   	$message_error = "Le champ de mot de passe est vide !";
		}		
		if($valid){
			$passwordClient = sha1($passwordClient);
			try{
				$bdd = new PDO('mysql:host=localhost;dbname=family-pic;charset=utf8', 'root', '');
			}catch (Exception $e){
				die('Erreur : ' . $e->getMessage());
			}
			
			$req = $bdd->prepare("SELECT * 
				FROM clients 
				WHERE pseudoClient = ? AND passwordClient ?");
			$req->execute(array($pseudoClient, $passwordClient));
				if ($Requete->rowCount() == 0) {
				$message_error = "Le pseudo ou le mot de passe est incorrect !";
			}else{
				$_SESSION ['idClient'] = $req['idClient'];
				$_SESSION ['prenomClient'] = $req['prenomClient'];
				$_SESSION ['nomClient'] = $req['nomClient'];
				$_SESSION ['emailClient'] = $req['emailClient'];
				$_SESSION ['pseudoClient'] = $req['pseudoClient'];
				$_SESSION ['passwordClient'] = $req['passwordClient'];
				header ('Location:Ma-page.php');
				exit;
			}
		}
	}
}


Voilà ! (Je n'ai pas tester le code mais je t'ai refait un code qui utilise des méthodes plus récentes)

Re ! Oui c'est quelque chose que j'avais aussi prévu de changer merci ! D'ailleurs j'ai un autre soucis lorsque je veux afficher le nom et le prénom dans la page de destination après le formulaire de connexion j'ai une erreur. Je t'envoie le code du formulaire de connexion ! Je pense le changer pour m'inspirer de ce que tu as déjà fais ! Le truc c'est que j'avais pris des cours il y a un moment et aujourd'hui il y a pas mal de changement donc je travail à l'ancienne et je suis un peu perdu aujourd'hui donc je me met à la page :)


<?php 
session_start();
if (isset ($_POST['connexion'])) {
if (empty ($_POST['pseudoClient'])) {
   echo "<script>alert('Les champs pseudo et mot de passe sont vides !');
   document.location.href='Accueil.html'; </script>";
} else {
if (empty ($_POST['passwordClient'])) {
   echo "<script>alert('Le champ de mot de passe est vide !');
   document.location.href='Accueil.html'; </script>";
} else {
$pseudoClient = htmlentities($_POST['pseudoClient'], ENT_QUOTES, "ISO-8859-1"); 
$passwordClient = sha1($_POST['passwordClient']);
$mysqli = mysqli_connect ("localhost", "root", "", "family-pic");
if (!$mysqli) {
   echo "Erreur de connexion à la base de données.";
} else {
   $Requete = mysqli_query($mysqli, "SELECT * FROM clients WHERE pseudoClient ='".$pseudoClient."' AND passwordClient ='".$passwordClient."'");
if (mysqli_num_rows ($Requete) == 0) {
echo "<script>alert('Le pseudo ou le mot de passe est incorrect !');
   document.location.href='Accueil.html'; </script>";
} else {

$_SESSION ['idClient'] = $idClient;
$_SESSION ['prenomClient'] = $prenomClient;
$_SESSION ['nomClient'] = $nomClient;
$_SESSION ['emailClient'] = $emailClient;
$_SESSION ['pseudoClient'] = $pseudoClient;
$_SESSION ['passwordClient'] = $passwordClient;

header ('Location:Ma-page.php');

Pour sécuriser ton code tu peux faire cette modification un peu partout :


Avant :


echo "<script>alert('Tous les champs doivent être complétés !');
      document.location.href='Inscription.html'; </script>";


Après :


$_SESSION['flash'] = "Tous les champs doivent être complétés !";
header('Location: inscription.html');
exit;


Sur ta page de destination tu mets ce code :


if (isset($_SESSION['flash'])) {
   echo $_SESSION['flash'];
   unset($_SESSION['flash']);
}

Voilà ! Merci beaucoup ! j'envoie le code juste en dessous :)

Me manque plus qu'à faire sur le formulaire d'inscription une requête de vérification pour l'adresse mail=(si l'adresse mail existe déjà alors message d'erreur sinon tu continues).

Par contre sur mon formulaire de connexion j'avais utilisé la méthode "mysqli_connect" et ça marche très bien comme ça donc je laisse pour l'instant ^^


<?php
session_start();
$bdd = new PDO('mysql:host=localhost;dbname=family-pic;charset=utf8', 'root', '');

if(isset($_POST['forminscription']))
{
   if(!empty($_POST['pseudoClient']) AND !empty($_POST['prenomClient']) AND !empty($_POST['nomClient']) AND !empty($_POST['emailClient']) 
      AND !empty($_POST['emailClient2']) AND !empty($_POST['passwordClient']) 
      AND !empty($_POST['passwordClient2']))
   {
      $pseudoClient = htmlspecialchars($_POST['pseudoClient']);
      $prenomClient = htmlspecialchars($_POST['prenomClient']);
      $nomClient = htmlspecialchars($_POST['nomClient']);
      $emailClient = htmlspecialchars($_POST['emailClient']);
      $emailClient2 = htmlspecialchars($_POST['emailClient2']);
      $passwordClient = sha1($_POST['passwordClient']);
      $passwordClient2 = sha1($_POST['passwordClient2']);


      $pseudoClientlength = strlen($pseudoClient);
      if ($pseudoClientlength <= 255) 
      {
         if ($emailClient == $emailClient2)
         {
            if(filter_var($emailClient, FILTER_VALIDATE_EMAIL))
            {
            if ($passwordClient == $passwordClient2)
            {
               $req_client = $bdd->prepare("INSERT INTO clients(pseudoClient, prenomClient, nomClient, emailClient, passwordClient)
               VALUES (?, ?, ?, ?, ?)");
               $req_client->execute(array($pseudoClient, $prenomClient, $nomClient, $emailClient, $passwordClient));
               echo "<script>alert('Votre compte a bien été créé !');
               document.location.href='Accueil.html'; </script>";

            }
            else
            {
               echo "<script>alert('Les mots de passes ne correspondent pas !');
               document.location.href='Inscription.html'; </script>";
            }
            }
            else
            {
               echo "<script>alert('Votre adresse mail n'est pas valide !');
               document.location.href='Inscription.html'; </script>";
            }
         }
         else
         {
            echo "<script>alert('Les adresses mail ne correspondent pas !');
            document.location.href='Inscription.html'; </script>";
         }
      }
      else
      {
         echo "<script>alert('Le pseudo ne doit pas dépasser 255 caractères !');
         document.location.href='Inscription.html'; </script>";
      }
   }
   else
   {
      echo "<script>alert('Tous les champs doivent être complétés !');
      document.location.href='Inscription.html'; </script>";
   }

}
?>
J'ai essayé, j'ai l'erreur "warning:mysqli::execute() expects exactly 0 parameters, 1 given on line 31"


Pour l'erreur oui il faut une connexion en PDO sinon tu ne pourras pas utiliser execute et prepare 😁


Je vais changé la méthode de connexion à la base de donnée dans ce cas et je te tiens au courant. C'est peut-être là que ça bloque. Parce que la requête en soi est bonne.


Ta requête est correcte ! Et n'hésite pas !


Merci beaucoup ça fait du bien de ne pas travailler seul lol


De rien 👌😁

D'accord merci beaucoup ! J'ai essayé, j'ai l'erreur "warning:mysqli::execute() expects exactly 0 parameters, 1 given on line 31"


Je vais changé la méthode de connexion à la base de donnée dans ce cas et je te tiens au courant. C'est peut-être là que ça bloque. Parce que la requête en soi est bonne.


Merci beaucoup ça fait du bien de ne pas travailler seul lol

Bonjour Dr-Lunastra et bienvenue à toi ! 🤗


Pour répondre à ta problématique c'est simple, au vu de ton code c'est le $mysqli->insert() qui ne fonctionne pas .. 😁


Si tu suis mes tutos / articles tu verras que j'utilise toujours :


$DB->query('...');
// et 
$DB->insert('...');


Ce sont 2 fonctions que j'ai faite qui me permettent de gagner du temps lorsque je développe. (Voir articles query() et insert())


Ces 2 fonctions regroupent prepare() et execute().


Donc teste avec cela :


Avant :


$mysqli->insert("INSERT INTO clients(pseudoClient, prenomClient, nomClient, emailClient, passwordClient)
  VALUES (?, ?, ?, ?, ?)",
  array($pseudoClient, $prenomClient, $nomClient, $emailClient, $passwordClient));


Après :


$req_client = $mysqli->prepare("INSERT INTO clients(pseudoClient, prenomClient, nomClient, emailClient, passwordClient)
  VALUES (?, ?, ?, ?, ?)");
$req_client->execute(array($pseudoClient, $prenomClient, $nomClient, $emailClient, $passwordClient));




De plus, n'utilise plus les méthodes mysqli (exemple : mysqli_connect). Ce n'est plus maintenu donc il peut y avoir des failles.


Utilise les méthodes PDO (Article pour se connecter à ta BDD en PDO)

Cette pub permet au site de vivre ...