Php: problème avec mon fetch() dans un if

Bonjour j’ai un petit soucis dans un if qui pose problème dans la suite de mon code. J’ai ce bout de code:

					$stmt = $bdd->prepare("SELECT token,actif FROM membres WHERE pseudo like :login ");
					if($stmt->execute(array(':login' => $login)) AND $row = $stmt->fetch()) {
						$clebdd = $row['token'];	// Récupération de la clé
						$actif = $row['actif']; // $actif contiendra alors 0 ou 1
						echo '1) '.$actif.'<br >';
					}
					 echo '2) '.$actif.'<br >';
					 

J’ai remarqué que la partie du code $row = $stmt->fetch()) n’est pas executé et passe dès lors au echo 2)
Cela pose problème car les varibales $actif et $clebdd ne sont pas définies. Si j’enlève ce même bout de code, l’intérieur du if est lu mais les variables ne sont toujours pas définies.

Comment je pourrais faire ?

Merci

Deux raisons :

  • Parce que ton $stmt->execute() plante.
  • Parce que tu utilises AND et que AND ne se comporte pas comme tu le veux. Je parierai que PHP interprête ceci :

(
$stmt->execute(array(’:login’ => $login)) AND ($row)
) = $stmt->fetch()

Ce qui n’est pas :

$stmt->execute(array(’:login’ => $login)) AND ($row = $stmt->fetch())

Et de manière générale, n’utilise pas AND mais && (et idem pour OR, où tu devrais utiliser ||).

La différence n’est pas très compliquée : AND et OR sont moins prioritaires que && et || (ex: a < b AND c < d ne donne pas la même chose que a < b && c < d).

J’ai compris ce que tu disais par rapport au &&. Mais pourquoi il plante au niveau du $stmt ?

L’instruction “AND” prend la priorité sur l’opération d’assignation “=”

PHP essaie donc de combiner ton opération “execute” et “$row” avec l’opérateur “AND” puis d’assigner le “$stmt->fetch” dans le résultat du “AND”.

Si tu encadrais “$row = $stmt->fetch” par des parenthèses, ça éviterait la confusion des opérations.

EDIT : tu pourrais aussi éviter de combiner 4 opérations sur une seule ligne et ainsi rendre ton script plus facile à analyser et à debugger
Edité le 22/10/2013 à 22:52

Mh j’ai toujours mon problème :s Il ne parvient toujours pas à définir mon $actif, je continue à chercher, si vous avez une solution elle est la bienvenue :slight_smile:

J’ai fait un 2ème if avec le $row = … mais la condition n’est pas analysé, elle est sautée et passe à la suite donc c’est la condition en elle même qui ne fonctionne pas mais pourquoi ??? Ca ne serait pas un problème en rapport au fait que je me connecte à ma base en PDO ? :s
Edité le 23/10/2013 à 16:55

Mais ton login existe bien en base ? Si tu joues la requête dans phpmyadmin ou mysqlworkbench, tu as bien des données ?

Oui oui, le pseudo (login) et le token existe bien. Je suis en train de regarder si ce n’est pas un problème du au fait que je me connecte a ma bdd en PDO et donc uitliser un STATEMENT … dans le fetch mais n’étant pas doué en PDO je me documente sur google et j’ai un peu du mal :slight_smile:

En fait, l’utilisateur rentre son pseudo dans un formulaire (juste ca pour faire simple), il y a une page de vérification qui check si le pseudo est valide, des lors un token est généré et un mail d’activation est généré avec un lien de confirmation avec le $pseudo envoyé en GET ainsi que le token (ils sont bien envoyé et vérifié avec un echo).Dans ma page d’activation, ou j’ai récupéré le pseudo et le token, il récupére dans ma bdd le champs actif (0 ou 1) et le token (clebdd) pour le comparer a celui envoyé via le mail d’activation. Mais ca coince au début, a cette endroit:

$stmt = $bdd->prepare("SELECT token,actif FROM membres WHERE pseudo like :login ");
					if($stmt->execute(array(':login' => $login)) && $row = $stmt->fetch()) {
						$clebdd = $row['token'];	// Récupération de la clé
						$actif = $row['actif']; // $actif contiendra alors 0 ou 1
						echo '1) '.$actif.'<br >';
					}
					 echo '2) '.$actif.'<br >';

Plus précisément à cause du $row = … cette condition n’est meme pas exécuté, je l’ai essayé dans un 2eme if. donc je dois coder ça d’une autre manière. Je syus en train de regarder pour un fetch_style mais je ne m’y connais pas…

$stmt = $bdd->prepare("SELECT token,actif FROM membres WHERE pseudo like :login ");

Dans ton SQL, tu devrais faire attention et employer un “=” au lieu d’utiliser “LIKE”.

Sinon, tu sembles insister pour regrouper un paquet d’opérations sur une seule ligne et ça rend les choses plus compliquées à débugger parce qu’on ne peut pas identifier quelle opération fait échouer ton script. Si tu pouvais tout découper pour isoler les opérations, ça permettrait de trouver à quel endroit il y a un problème.

$stmt = $bdd->prepare("SELECT token,actif FROM membres WHERE pseudo = ':login' ");
$stmt->bindParam(:login, $login, PDO::PARAM_STR)

$Cond1 = ($stmt->execute(array(':login' => $login)));
$Cond2 = ($row = $stmt->fetch());

if ($Cond1 === True) {
 echo "Execute a bien fonctionné<br>";
}
if ($Cond2 === True){ 
  echo "Fetch a bien fonctionné<br>";
}


if($Cond1 && $Cond2) { 
$clebdd = $row['token'];	// Récupération de la clé 
$actif = $row['actif']; // $actif contiendra alors 0 ou 1 
echo '1) '.$actif.'<br >'; 
} 
echo '2) '.$actif.'<br >';

Note 1 : je n’ai pas testé le code, mais c’est pour donner une idée.
Note 2 : tu n’avais pas mis de bindParam.

Jaydee: dans PDO, execute peut prendre les paramètres en tableau.

Ceci étant, la remarque est plus ou moins la même. Tente ça :

$stmt = $bdd->prepare("SELECT token,actif FROM membres WHERE pseudo like :login ")
                              ->execute(array(':login' => $login);
if (false !== ($row = $stmt->fetch())) {
  echo "trouvé";
} else {
  echo "non trouvé";
}
var_dump($row);

Avec ton code, Sans-Nom, j’ai ce message d’erreur: Fatal error: Call to a member function fetch() on a non-object in

Jaidree, j’avais déjà séparé mes conditions pour trouvé mon erreur et comme cité plus haut dessus la condition qui pose problème est celle avec le $row…

meaculpa.

$stmt = $bdd->prepare("SELECT token,actif FROM membres WHERE pseudo like :login ") or die ('argh');
$stmt->execute(array(':login' => $login) or die('argh (bis)')