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.
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).
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
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
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
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.
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…
$stmt = $bdd->prepare("SELECT token,actif FROM membres WHERE pseudo like :login ") or die ('argh');
$stmt->execute(array(':login' => $login) or die('argh (bis)')