PHP/Mysql, recuperer information d'une requete dans une fonction

Résolu/Fermé
Hip - 21 avril 2015 à 14:04
MrHip7 Messages postés 31 Date d'inscription jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015 - 21 avril 2015 à 17:23
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)

A voir également:

4 réponses

Miimidedel Messages postés 345 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 5 juin 2019 71
Modifié par Miimidedel le 21/04/2015 à 14:20
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 ?
0
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.
0
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.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
21 avril 2015 à 14:46
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
0
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)
0
MrHip7 Messages postés 31 Date d'inscription jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
21 avril 2015 à 15:19
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...
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
Modifié par jordane45 le 21/04/2015 à 15:32
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;

0
MrHip7 Messages postés 31 Date d'inscription jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
Modifié par MrHip7 le 21/04/2015 à 16:00
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...
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > MrHip7 Messages postés 31 Date d'inscription jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
21 avril 2015 à 17:10
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;
0
MrHip7 Messages postés 31 Date d'inscription jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
21 avril 2015 à 17:23
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)
0