Requette SQL

Résolu
parousky Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   -  
Reivax962 Messages postés 3742 Statut Membre -
Bonjour, j'aimerais afficher des données enregistrées dans ma base de données, alors j'ai écris ce code là :

<?php
$cod = $_GET['code'];
$req2 = $bdd->query('SELECT * FROM annonces WHERE Code =: $cod');

while($donnees = $req2->fetch())
{
?>
<p class="pseudo">
<?php echo $donnees['pseudo']; ?>
</p>

<a href="Profil.php" class="profil">Voir le profil de l'annonceur</a>
<?php
}
?>

Mais à chaque fois, j'ai l'erreur :

Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\Servicity\rechercher.php on line 233

Alors je pense que cette erreur vient du fait que la requête a été bien posée, mais je ne vois pas trop où...
Alors est-ce que le code est suffisant pour que vous puissiez voir une éventuelle erreur ?
Merci d'avance !

5 réponses

  1. totodunet Messages postés 1513 Statut Membre 201
     
    salut,

    fais ça par étape :

    pose
    $req2='SELECT * FROM annonces WHERE Code =: $cod';


    puis ensuite affiches là :
    echo $req2;


    et executes le code SQL affiché dans ton SGBD

    si ça marche pas donnes nous ce qui est affiché par echo $req2
    0
  2. mpmp93 Messages postés 2931 Date d'inscription   Statut Membre Dernière intervention   1 343
     
    Bonsoir,

    Et ceci: ???

    $cod = $_GET['code'];
    $req2 = $bdd->query("SELECT * FROM annonces WHERE Code =: $cod");  


    Est-ce que $cod est un entier? Si oui, évitez l'injection de code SQL:

    $cod = (int) $_GET['code'];
    $req2 = $bdd->query("SELECT * FROM annonces WHERE Code =: $cod"); 

    0
  3. parousky Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   6
     
    Non ça ne marche toujours pas... J'ai mélangez vos deux codes ( parce que Code est bien un entier), alors j'ai écris ce code là :

    <?php
    $cod = (int) $_GET['code'];
    $req2='SELECT * FROM annonces WHERE Code =: $cod';
    echo $req2;

    while($donnees = $req2->fetch())
    {
    ?>
    <p class="pseudo">
    <?php echo $donnees['pseudo']; ?>
    </p>

    <a href="Profil.php" class="profil">Voir le profil de l'annonceur</a>
    <?php
    }
    }
    ?>

    Et j'obtiens le message :

    SELECT * FROM annonces WHERE Code =: $cod
    Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\Servicity\rechercher.php on line 234
    0
  4. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    Bonjour,

    1) Enlève les : dans ta requête SQL
    2) En PHP, si tu utilises des guillemets simples, les variables ne sont pas remplacées par leur valeur. Donc '$cod' donne $cod. Utilise des guillemets doubles : "$cod" donne 876 (par exemple).

    Ta ligne devient :
    $req2 = "SELECT * FROM annonces WHERE Code = $cod";

    Ou, si tu tiens aux guillemets simples :
    $req2 = 'SELECT * FROM annonces WHERE Code = ' . $cod;


    Xavier
    0
    1. mpmp93 Messages postés 2931 Date d'inscription   Statut Membre Dernière intervention   1 343
       
      le (int) est très important.

      Si dans l'URL une personne entre autre chose que une valeur entière, ça bloquera l'injection de code
      0
    2. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Bien sûr ! J'ai enlevé cette partie du code parce qu'il l'avait intégrée et ne rentrait pas en ligne de compte dans la correction que je propose...
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. parousky Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   6
     
    J'ai résolu le problème ! Effectivement, les " marchent mieux que les ' pour la requête, et j'ai écris ce code là :

    <?php
    $cod = (int) $_GET['code'];
    $req2=$bdd->query("SELECT * FROM annonces WHERE Code = $cod");

    while($donnees = $req2->fetch())
    {
    ?>
    <p class="pseudo">
    <?php echo $donnees['pseudo']; ?>
    </p>

    <a href="Profil.php" class="profil">Voir le profil de l'annonceur</a>
    <?php
    }
    }
    ?>
    Et ca marche nickel !
    0