PHP/Mysql, recuperer information d'une requete dans une fonction [Résolu/Fermé]

Signaler
-
Messages postés
31
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
6 mai 2015
-
Bonjour,

Je réalise actuellement une vérification de formulaire.
J'ai une fonction checkpseudo($pseudo) et checkmail($mail)
et je voudrais qu'elle vérifie que le mail ou le pseudo n'existe pas déjà dans la BDD.

Comment vais-je passer une requête SQL correctement dans la fonction?
J'ai:
function checkpseudo($pseudo)//Implementer la dépendance UNIQUE
{
	$base = mysqli_connect ('localhost', 'root', '');
	$res = 'ok';
	$result = mysqli_query($base, "SELECT membre_pseudo FROM membres WHERE membre_pseudo LIKE '".$pseudo."'");
	if($result){
		mysqli_free_result($result);
		$res='exists';
		return $res;
	}
	else{
		return $res;
	}
}


Mais cela ne fonctionne pas, j'ai une erreur SQL.
Erreur SQL !INSERT INTO membres VALUES(NULL, 'pseu', 'jean', 'tete', '***@***', 'dbc4d84bfcfe2284ba11beffb853a8c4', '14/05/1990', 1429610378,0)

4 réponses

Messages postés
352
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 juin 2019
47
Me revoilà.

Bon déjà tu as une erreur sur le INSERT donc ce n'est pas cette fonction qui pose problème.

Le fonction qui appelle cette fonction fait le INSERT quand checkPseudo te renvoie "ok" ?

Déjà renvoie true et false dans checkPseudo et dans celle qui l'a appelée vérifie simplement cette valeur de retour

if(checkPseudo($pseudo)){
//Sous-entend : renvoie true (la vérif est OK)
//Faire l'INSERT
}
else{
//Pas d'insertion et gestion de l'erreur
}



EDIT :

Ton erreur est qu'il fait un INSERT comme si la vérif n'avait pas trouvé le pseudo déjà en BdD alors qu'il y est ?

En gros checkPseudo renvoie la mauvaise réponse ?

As-tu essayé de mettre ta requête SELECT de checkPseudo directement dans PHPMyAdmin par exemple voir ce que ça retourne ?
Le code avec les booléens.

function checkpseudo($pseudo)
{
 $base = mysqli_connect ('localhost', 'root', '');
 $res = true;
 $result = mysqli_query($base, "SELECT membre_pseudo FROM membres WHERE membre_pseudo LIKE '".$pseudo."'");
 if($result){
  mysqli_free_result($result);
  $res='exists';
  return $res;
 }
 else{
  return $res;
 }
}

Le code si chaque champs est valide:
if($pseudoc && $mailc && $mailvc && $mdpvc && $date_naissancec){
  var_dump('Passage dans 1er if (celui de l\'insertion)');
  $insertion = "INSERT INTO membres VALUES(NULL,  '".$pseudo."',
             '".$prenom."',
             '".$nom."',
             '".$mail."',
             '".md5($mdp)."',
             '".$date_naissance."',
             ".time().",". 0 .")";
             
             
  mysqli_query ($base,$insertion) or die ('Erreur SQL !'.$insertion.'<br />'.mysql_error());          
  mysql_close();           
  header('Location: ../index.php');
  exit();
 }



Le code si il y a un champs invalide:
 
 else{
  var_dump('Passage dans 1er else (si erreur il y a)');
  if(!$pseudoc){
   var_dump('Pseudo exist');
   //~ $message = "Ce pseudo est déjà utilisé, merci d'en choisir un autre.<a href="./inscription.php">Retour</a>";
   //~ echo "<script type='text/javascript'>alert('$message');</script>";
  }
  elseif(!$mailc){
   var_dump('mail exist');
   //~ $message = "Ce mail est déjà utilisé, merci d'en choisir un autre .<a href="./inscription.php">Retour</a>";
   //~ echo "<script type='text/javascript'>alert('$message');</script>";
  }
  elseif(!$mailvc){
   var_dump('mail different');
   //~ $message = "Merci d'entrer deux fois le même mail ..<a href="./inscription.php">Retour</a>";
   //~ echo "<script type='text/javascript'>alert('$message');</script>";
  }
  elseif(!$mdpvc){
   var_dump('mdp different');
   //~ $message = "Merci d'entrer deux fois le même mot de passe  .<a href="./inscription.php">Retour</a>";
   //~ echo "<script type='text/javascript'>alert('$message');</script>";
  }
  elseif($date_naissancec=='format'){
   var_dump('format date');
   //~ $message = "Le format de la date n'est pas valide (DD/MM/YYYY) .<a href="./inscription.php">Retour</a>;
   //~ echo "<script type='text/javascript'>alert('$message');</script>";
  }
  elseif($date_naissancec=='tooold'){
   var_dump('trop vieux');
   //~ $message = "Vous êtes trop agé! .<a href="./inscription.php">Retour</a>;
   //~ echo "<script type='text/javascript'>alert('$message');</script>";
  }
  elseif($date_naissancec=='tooyoung'){
   var_dump('trop jeune');
   //~ $message = "Tu es trop jeune! Reviens dans quelques années ;).<a href="./inscription.php">Retour</a>;
   //~ echo "<script type='text/javascript'>;</script>";
  }
  elseif($date_naissancec=='invalid'){
   var_dump('date invalid');
   //~ $message = "La date de naissance renseignée est invalide.<a href="./inscription.php">Retour</a>;;
   //~ echo "<script type='text/javascript'>alert('$message');</script>";
  }
  
 }


J'ai pas mal de commentaires dans les "erreurs" car je voulais une alert avec un lien, ce qui n'est pas possible, donc en attente actuellement ;)

EDIT: a mon avis, l'erreur sur le INSERT est due au fait que dans ma BDD, le champs pseudo soit UNIQUE, du coup cela ne passe pas quand on lui dit d'inserer et qu'il n'y a pas d'erreur, il faut donc lui dire qu'il y a une erreur, et c'est donc dans la fonction checkpseudo qu'il faut changer des choses.
Lorsque j'exécute ma requête avec PhpMyadmin et 'pseu' à la place de $pseudo, PhpMyAdmin me renvoie bien la colonne pseudo de la table, avec 1 ligne comme valeur 'pseu'.
Je suppose donc que cela fonctionne.

EDIT
Oui, il ne fait pas la bonne vérif
EDIT2
Si je fais la requête avec un pseudo inexistant dans phpmyadmin, il ne me renvoi rien, la requête marche donc.
Messages postés
29058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 juillet 2020
2 638
Bonjour,
Avec LIKE .. il faut utiliser des %

Prend l'habitude de séparer la requête de son exécution pour pouvoir en faire des echo si besoin.


$sql =  "SELECT membre_pseudo
             FROM membres 
             WHERE membre_pseudo LIKE '%$pseudo%' ";
echo "<br> La requête :<br>".$sql;
$result = mysqli_query($base,$sql);


Une fois le Echo de la requête effectué.. tu la copie et la teste en DIRECT dans ta BDD
re-bonjour Jordane45:

function checkpseudo($pseudo)
{
	$base = mysqli_connect ('localhost', 'root', '');
	$res = true;
	$requete = "SELECT membre_pseudo FROM membres WHERE membre_pseudo LIKE '%$pseudo%'";
	$result = mysqli_query($base, $requete);
	if($result){
		mysqli_free_result($result);
		$res='exists';
		return $res;
	}
	else{
		return $res;
	}
}


ma fonction checkpseudo($pseudo) ressemble désormais à ca.. au niveau des '%', cela effectue tout seul la concaténation? oubien faut-il que j'utilise des '.'?

Avec cette fonction, j'ai toujours l'erreur MySQL.
Erreur SQL !INSERT INTO membres VALUES(NULL, 'pseu', 'jean', 'dumar', '***@***', 'b59c67bf196a4758191e42f76670ceba', '20/02/1980', 1429620633,0)
Messages postés
31
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
6 mai 2015

J'ai essayé avec une nouvelle requête, cela ne fonctionne toujours pas, et avec PHPMYADMIn, cela me renvoi bien 1 avec pseu à la place de $pseudo.

	function checkpseudo($pseudo)//
{
$base = mysqli_connect ('localhost', 'root', '');
	$res = true;	
	$requete = "SELECT COUNT(*) AS nbr FROM membres WHERE membre_pseudo = '".$pseudo."'";
	$result = mysqli_query($base,$requete);
	if($result['nbr'] > 0) return false;
	else return true;

}


cela ne fonctionne pas non plus...
Messages postés
29058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 juillet 2020
2 638
Attentio :
$result = mysqli_query($base,$requete);

Mysqli_query ... te retourne true ou false (1 ou 0 ) ... pour te dire si la requête s'est bien exécutée ou non .. rien de plus !
Ca ne te dit pas si tu as des résultats ou non ....

Pour récupérer le NB il faut le FETCH
$res = mysqli_fetch_row($result)
$NB = $res['nbr'];
$retour = $NB>0 ? true:false;

Messages postés
31
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
6 mai 2015

Du coup:
function checkpseudo($pseudo)
{
 $base = mysqli_connect ('localhost', 'root', '');
 $requete = "SELECT COUNT(*) AS nbr FROM membres WHERE membre_pseudo = '".$pseudo."'";
 $result = mysqli_query($base,$requete);
 $resu = mysqli_fetch_row($result);
 $NB = $res['nbr'];
 if($NB > 0){
  var_dump("YES");
   return false;
  }
 else{
  var_dump("NOPE");
   return true;
 }
}


Pense tu que c'est correct?

EDIT
ok, clairement non, ça ne fonctionne pas. Je ne comprends pas bien la structure que tu me donne Jordane45

$base = mysqli_connect ('localhost', 'root', '');
	$requete = "SELECT COUNT(*) AS nbr FROM membres WHERE membre_pseudo = '".$pseudo."'";
	//~ $result = mysqli_query($base,$requete);
	$resu = mysqli_fetch_row($requete);
	$NB = $resu['nbr'];
	if($NB > 0){
		var_dump("YES");
		return false;
	 }
	else{
		var_dump("NOPE");
		return true;
	}


seulement il me dis que je ne passe pas le bon parametre a mysqli_fetch_row...
Messages postés
29058
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 juillet 2020
2 638 >
Messages postés
31
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
6 mai 2015

Que te donne ceci :

$base = mysqli_connect ('localhost', 'root', '');
	$requete = "SELECT COUNT(*) AS nbr FROM membres WHERE membre_pseudo = '".$pseudo."'";
	 $result = mysqli_query($base,$requete);
	$resu = mysqli_fetch_row($result);
     // Le temps des tests :
     print_r($resu);

    $NB = $resu['nbr'];
    $return = $NB>0 ? true:false;
      // Le temps des tests :
     print( $return ? 'true':'false' );   
     return $return;
Messages postés
31
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
6 mai 2015

Salut!
J'ai résolu mon probleme avec:
function checkpseudo($link, $pseudo) {
    $stmt = mysqli_prepare($link, 'SELECT COUNT(*) AS nbr FROM membres WHERE membre_pseudo = ?');
    mysqli_stmt_bind_param($stmt, 's', $pseudo);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $NB);
    mysqli_stmt_fetch($stmt);
    return 0 == $NB;
}


Merci! =)
(je peux pas le marqué en resolu parceque je suis connecté.. mais ce sujet est a clore)