Requête SQL anomalie

Résolu
franksh Messages postés 54 Statut Membre -  
franksh Messages postés 54 Statut Membre -
Salut, j'essai de récupérer les messages dans ma bdd de cette fashion sur le sql de phpmyadmin je récupère bien les bon données mais sur script php non
Ma table
id
id_sender
id_receiver
id_article
SELECT *, u.name, u.avatar, t.id as id_t, t.datechat as datem FROM marketchat t LEFT JOIN users u ON u.id = t.id_receiver WHERE t.id_sender = 1524 AND t.id_receiver = 1 OR t.id_sender = 1 AND t.id_receiver = 1524 AND id_article = 17;

Par exm ici je récupère le message que l'id 1 et l'id 1524 se sont envoyer sur l'article qui a l'id 17 ce code est executer sur phpmyadmin
mais sur mon script php ce code renvoi les messages que l'id 1 et l'id 1524 se sont envoyer sur d'autre article qui ont pas l'id 17

Mon script php

$q = $db->prepare("SELECT *,
       u.name,
       u.avatar,
       t.id as id_t,
       t.datechat as datem
       FROM marketchat t
       LEFT JOIN users u ON u.id = t.id_receiver
       WHERE t.id_sender = :id_tow
       AND t.id_receiver = :id_one
       OR t.id_sender = :id_one
       AND t.id_receiver = :id_tow
       AND id_article = :id_article");
       $q->execute([
         'id_tow' => $user_tow,
         'id_one' => $user_one,
         'id_article' => $id
       ]);

   // je fait un var_dump() sur id_article ce bien 17

J'espere être claire dans mes explication.
Merci d'avance

7 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour,

    Active la gestion des erreurs PDO à la connexion et place l'exécution de ta requête dans un bloc try/catch comme expliqué ici
    https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      au passage, il te manque des parenthèses dans ta requête
      7SELECT *,
             u.name,
             u.avatar,
             t.id as id_t,
             t.datechat as datem
             FROM marketchat t
             LEFT JOIN users u ON u.id = t.id_receiver
             WHERE (t.id_sender = :id_tow
                AND t.id_receiver = :id_one )
             OR ( t.id_sender = :id_one
                AND t.id_receiver = :id_tow )
             AND id_article = :id_article
      0
  2. franksh Messages postés 54 Statut Membre 1
     
    Oui j'ai oublié de le noté j'ai essayer d'abord avec les parenthèses j'avais le même problèmes
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      ce n'est pas par ce que ça n'a pas corrigé ton souci actuel .. qu'il ne faut pas les mettre ....

      Comme je te l'ai dit dans mon premier message.. active la gestion des erreurs PDO pour connaitre la cause du souci
      0
  3. franksh Messages postés 54 Statut Membre 1
     
    ca return


    Array
    (
    [:id_tow] => 1
    [:id_one] => 1524
    [:id_article] => 17
    )
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Ça devrait également te retourner un message d'erreur....
      Peux-tu nous partager le code tel que tu l'as modifié j'ai l'impression que tu n'as pas bien pris tout ce qu'il fallait
      0
      1. franksh Messages postés 54 Statut Membre 1 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        La voici

        $user_one = '1524';
        $user_tow = '1';
        $id = '17';
        $sql = "SELECT t.contenu
        FROM marketchat t
        WHERE (t.id_sender = :id_tow
        AND t.id_receiver = :id_one )
        OR ( t.id_sender = :id_one
        AND t.id_receiver = :id_tow )
        AND id_article = :id_article";

        $req = array(
        ':id_tow'=>$user_tow,
        ':id_one'=> $user_one,
        ':id_article' =>$id
        );
        try{
        $requete = $db -> prepare($sql);
        $requete->execute($req);
        $re = $requete->fetchAll(PDO::FETCH_OBJ);
        }catch(Exception $e){
        echo " Erreur ! ".$e->getMessage();
        print_r($req);
        echo "</pre>";
        }
        0
      2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > franksh Messages postés 54 Statut Membre
         
        Et donc, que ta fiche le écho de l'erreur ?
        Sûrement un message indiquant que le nombre de variables n'est pas bon...
        0
  4. franksh Messages postés 54 Statut Membre 1
     
    Enfaite quand je place le print_r et echo de pre dans le catch sa return rien du tout mais quand je le place a l'exterieur du catch ce la que sa m'affiche

    Array
    (
    [:id_tow] => 1
    [:id_one] => 1524
    [:id_article] => 17
    )

    ma connexion au bdd
      try {
         $db = new PDO("mysql:host=$host_name; dbname=$database;", $user_name, $password);
      $db->exec('SET NAMES utf8mb4');
      $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $db->query('SELECT * FROM users');
      } catch (PDOException $e) {
        echo "Erreur!: " . $e->getMessage() . "<br/>";
        die();
      }
    
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Et si après le fetchall tu fais un Var_dump
    de $re
    Qu'est-ce que ça t'affiche ?
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      N'obtiens-tu pas le bon résultat ?
      0
      1. franksh Messages postés 54 Statut Membre 1 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Non toujours pas le bon je fait un boucle sur $re sur id_article
        j'obtiens
        2
        2
        17
        17
        alors que dans $id tout la haut je déclare $id = '17';
        <?php foreach ($re as $k): ?>
          <p><?= $k->id_article; ?></p>
        <?php endforeach; ?>
        
        0
      2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > franksh Messages postés 54 Statut Membre
         
        Je t'ai demandé de faire un var_dump
        0
  7. franksh Messages postés 54 Statut Membre 1
     
    un var_dump de $re renvoi
        array(5) {
      [0]=>
      array(4) {
        ["contenu"]=>
        string(32) "1 pour 1524"
        [0]=>
        string(32) "1 pour 1524"
        ["id_article"]=>
        string(1) "2"
        [1]=>
        string(1) "2"
      }
      [1]=>
      array(4) {
        ["contenu"]=>
        string(40) "1524 to 1"
        [0]=>
        string(40) "1524 to 1"
        ["id_article"]=>
        string(1) "2"
        [1]=>
        string(1) "2"
      }
      [2]=>
      array(4) {
        ["contenu"]=>
        string(106) "
    id 17                              C'est article est-il toujours disponible?
                                "
        [0]=>
        string(106) "
    id 17                              C'est article est-il toujours disponible?
                                "
        ["id_article"]=>
        string(2) "17"
        [1]=>
        string(2) "17"
      }
      [3]=>
      array(4) {
        ["contenu"]=>
        string(14) "oui 1 toujours"
        [0]=>
        string(14) "oui 1 toujours"
        ["id_article"]=>
        string(2) "17"
        [1]=>
        string(2) "17"
      }
      [4]=>
      array(4) {
        ["contenu"]=>
        string(0) ""
        [0]=>
        string(0) ""
        ["id_article"]=>
        string(2) "17"
        [1]=>
        string(2) "17"
      }
    }
    
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      oui, désolé, il manque encore des parenthèses dans ta requête
      WHERE ( (t.id_sender = :id_tow
             AND t.id_receiver = :id_one )
          OR ( t.id_sender = :id_one
             AND t.id_receiver = :id_tow ) )
          AND id_article = :id_article";
      
      1
  8. franksh Messages postés 54 Statut Membre 1
     
    Merci vraiment
    la c'est bon je récupère bien les bon données
    0