[RESOLU] [PHP] Inclure une variable dans une req SQL

Eléphanteau du PHP | 17 Messages

27 mai 2014, 14:23

Bonjour,

J'ai identifier mon erreur mais je ne sais pas comment y remédier.
Le problème se trouve à cette ligne:

Code : Tout sélectionner

$req = $bdd->query('SELECT pseudo, pass, email FROM membres WHERE pseudo="'.$pseudo1.'"'); $ligne = $req->fetch();
Et c'est au niveaux du "'.$pseudo1.'"
j'ai essayé prêt de 50 manière différente mais là je suis à bout d'idée
Voici le code en entier

Code : Tout sélectionner

<?php $pseudo1=$_POST['pseudo']; $pass1=$_POST['password']; $pass2=$_POST['password2']; $email1=$_POST['email']; $email2=$_POST['email2']; $req = $bdd->query('SELECT pseudo, pass, email FROM membres WHERE pseudo="'.$pseudo1.'"'); $ligne = $req->fetch(); if ($req == true) { header('Location: connection3.php'); } elseif ($pass1 != $pass2 OR $email1 != $email2 AND $req == false) { header('Location: connection2.php'); } elseif ($pass1 == $pass2 AND $email1 == $email2 AND $req == false) { $req2 = $bdd->prepare('INSERT INTO membres(pseudo, pass, email) VALUES (:pseudo, :pass, :email)'); $req2->execute(array('pseudo' => $pseudo1, 'pass' => $pass1, 'email' => $email1 )); header('Location: creer2.php'); } ?>

cordialements,
aenarion
Je ne suis qu'une personne qui cherche à vous aider mais je suis comme vous, je suis "débutant" (quelqu'un cherchant de l'expérience en essayant de résoudre les problèmes des autres)

Eléphant du PHP | 422 Messages

27 mai 2014, 14:31

hello
J'ai identifier mon erreur
qui est ?
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Eléphanteau du PHP | 17 Messages

27 mai 2014, 14:50

L'erreur c'est

Code : Tout sélectionner

$req = $bdd->query('SELECT pseudo, pass, email FROM membres WHERE pseudo="'.$pseudo1.'"'); $ligne = $req->fetch();
Je ne suis qu'une personne qui cherche à vous aider mais je suis comme vous, je suis "débutant" (quelqu'un cherchant de l'expérience en essayant de résoudre les problèmes des autres)

Eléphant du PHP | 422 Messages

27 mai 2014, 14:55

hello

non! ca c'est le code qui génère l'erreur.

une erreur ca ressemble a ca : "PHP Parse error: syntax error, unexpected 'T' (T_STRING) in /home/v7q0Po/prog.php on line 3"
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Eléphanteau du PHP | 17 Messages

27 mai 2014, 15:03

Aucune erreur n'est généré, c'est juste que ça fait qu'a tout les coups les pseudo est déjç présent dans la base de donnée donc ça rempli la condtion 1. même si le pseudo entré n'est pas dans la base de donnée.
Sur un autre forum on m'a dit de faire

Code : Tout sélectionner

id = ...; $db->query("SELECT * FROM table WHERE id='$id';")->fetch();
Donc je vais essayer
Je ne suis qu'une personne qui cherche à vous aider mais je suis comme vous, je suis "débutant" (quelqu'un cherchant de l'expérience en essayant de résoudre les problèmes des autres)

Eléphant du PHP | 95 Messages

27 mai 2014, 16:06

ceci fonctionnera très bien ;)
$req = $bdd->query("SELECT pseudo, pass, email FROM membres WHERE pseudo LIKE ".$pseudo1);
EDIT:manque des guillemets dslé..
$req = $bdd->query("SELECT pseudo, pass, email FROM membres WHERE pseudo LIKE ".$bdd->quote($pseudo1));
on utilise LIKE et non = pour la comparaison de chaine en SQL
Modifié en dernier par chapt0011 le 28 mai 2014, 00:39, modifié 1 fois.
La b!te et le couteau sont bien souvent les meilleurs outils...mais aussi et surtout les seuls qui sont toujours à disposition!!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 mai 2014, 18:47

@chapt0011 : non pour l'égalité le like est une hérésie en terme de ressource
tu as oublié les ' autours de la chaine de caractère :)

@ aenarion33
merci d'utiliser le bbcode php c'est vachement mieux en couleur :)

tu a une erreur de conception dans ton code
<?php
$req = $bdd->query('SELECT pseudo, pass, email FROM membres WHERE pseudo="' . $pseudo1 . '"');
$ligne = $req->fetch();
if ($req == true) { // est ce que la requete c'est bien passée ?
    // oui on est renvoyé aute part
    header('Location: connection3.php');
} elseif ($pass1 != $pass2 OR $email1 != $email2 AND $req == false) { 
    // est ce que les mot de passe ou email sont différents et que la requete est ko
    header('Location: connection2.php');
} elseif ($pass1 == $pass2 AND $email1 == $email2 AND $req == false) {
    // mot et email ok mais requete ko
    $req2 = $bdd->prepare('INSERT INTO membres(pseudo, pass, email) VALUES (:pseudo, :pass, :email)');
    $req2->execute(array('pseudo' => $pseudo1, 'pass' => $pass1, 'email' => $email1));
    header('Location: creer2.php');
} 
tu commence par récupérer des données qui ne servent pas.
ensuite tu test si la requête c'est bien passé? Mais tu oublie que même si la requête ne retourne rien elle peux correctement s’exécuter. D’ailleurs, dans ton cas la requête est syntaxiquement correcte ton il n'y a pas de raison qu'elle échoue.
Il faut que tu comprenne que query retourne false lorsqu'il y a une erreur SQL or le fait que le pseudo ne soit pas présent (ou qu'il le soit d'ailleurs) ce n'est pas une erreur SQL).

ton premier test est donc inutile

je suppose que le but est de valider un formulaire, dans ce cas je ferais plutôt ainsi (c'est fait rapidment il faut quand même tester).
<?php
try {
    if (empty($_POST['password']) || empty($_POST['password2']) || empty($_POST['email']) || empty($_POST['email'])
        || ($_POST['password'] != $_POST['password2']) || ($_POST['email'] != $_POST['email2'])
    ) {
        // est ce que les mot de passe ou email sont différents et que la requete est ko
        header('Location: connection2.php');
    } else {
        $bdd = new PDO('');
        $req = $bdd->query('SELECT count(1) as nb FROM membres WHERE pseudo=' . $bdd->quote($pseudo1));
        $ligne = $req->fetch(PDO::FETCH_OBJ);
        $req->closeCursor();
        if ($ligne->nb == 0) {
            $sql = 'INSERT INTO membres(pseudo, pass, email) VALUES (';
            $sql .= $bdd->quote($_POST['pseudo']) . ' ,';
            $sql .= $bdd->quote($_POST['password']) . ' ,';
            $sql .= $bdd->quote($_POST['email']);
            $sql .= ')';
            $bdd->query($sql);
            header('Location: creer2.php');
        } else {
            // le pseudo existe déjà
            header('Location: connection3.php'); // je suppose ?
        }
    }
} catch (PDOException $e) {
    echo 'Erreur SQL : ' . $e->getMessage();
}
par principe ou ne récupère pas de donnée qui ne servent pas.
les variables temporaires ne sont utile que si cela facilite la lecture (donc $pass = $_POST['password'] est inutile, on perd ml'information de l'origine).

Les requêtes préparées ne sont pas vraiment utile dans ton cas (elle sont simulée par défaut et font ce que j'ai fat à la main).
utiliser des fichiers numéroté n'est pas non plus une bonne idée, mais si au départ cela semble l'être (tu peux surement tous faire sur le même fichier avec des paramètres sans parler du fait que cela serait surement plus efficace ?).

Dernière chose : quand tu as un problème n'oublie pas de décrire précisément ce problème, d'ajouter les éventuels messages d'erreurs et surtout de nous dire ce que tu souhaite au final (c'est évident pour toi mais pas pour nous ;) )

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 17 Messages

28 mai 2014, 18:11

Je ne sais pas comment colorer le code sur ce site internet ^^ dsl.
Puis merci à tous de vos réponses.

Je ne comprend pas très bien ton code moogli mais ce soir je vais essayer de le comprendre . "si la requête ne retourne rien elle peux correctement s’exécuter" (phrase de moogli). La requête ne retournera true que si le pseudo est déjà pris donc je ne vois pas de faille dans ma requête.
Le but de la requête est de voir si le pseudo est déjà pris car le code sert à créer un compte si jamais le pseudo n'est pas déjà pris et que les 2 mot de passe et les 2 emails entrés sont les même. Et au passage je vérifie que c'est bien une adresse mail qui a été rentré.

Pour on ne met pas $req = $bdd->query("S.....WHERE pseudo='$pseudo1';") mais plustôt $req = $bdd->query("S....WHERE pseudo LIKE ".$pseudo1); Donc pourquoi on met LIKE à la place du '=' et pourquoi sur mon site web le '=' fonctionne très bien ?

Avec ce code tout marche parfaitement:

Code : Tout sélectionner

$pseudo1 = htmlspecialchars($_POST['pseudo']); $pass1 = htmlspecialchars($_POST['password']); $pass2 = htmlspecialchars($_POST['password2']); $email1 = htmlspecialchars($_POST['email']); $email2 = htmlspecialchars($_POST['email2']); if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email'])) { $req=$bdd->query("SELECT * FROM membres WHERE pseudo='$pseudo1';")->fetch(); if ($req == true) { header('Location: connection3.php'); } elseif ($pass1 != $pass2 OR $email1 != $email2 AND $req == false) { header('Location: connection2.php'); } elseif ($pass1 == $pass2 AND $email1 == $email2 AND $req == false) { $req2 = $bdd->prepare('INSERT INTO membres(pseudo, pass, email, date_inscription) VALUES (:pseudo, :pass, :email, NOW())'); $req2->execute(array('pseudo' => $pseudo1, 'pass' => $pass1, 'email' => $email1 )); header('Location: creer2.php'); } $req->closeCursor(); $req2->closeCursor(); } else { header('Location: creer3.php'); }
Cordialement,
aenarion
Je ne suis qu'une personne qui cherche à vous aider mais je suis comme vous, je suis "débutant" (quelqu'un cherchant de l'expérience en essayant de résoudre les problèmes des autres)