IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Jointure et critères de sélection


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut Jointure et critères de sélection
    Bonjour,

    Je viens de passer mon après-midi sur une seule requête et la je bute sur la solution à adopter dans un cas précis.

    Je programme une messagerie interne pour mon espace membre, le fil de la conversation est sur une page.

    voici la requête qui affiche le fil de la conversation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $reponse = $pdo->query('SELECT
    	m.id idmsg,
    	m.message msg,
    	m.date_envoi dateen,
    	m.date_lecture datelu,
    	u.id id_expediteur,
    	u.username pseudo_expediteur
    FROM users u
    INNER JOIN messages m
    ON m.id_expediteur = u.id
    WHERE m.id_destinataire = \'1\' OR m.id_expediteur = \'1\';
    ORDER BY date_envoi DESC LIMIT 0, 10');
    les 1 dans la ligne du WHERE représente l'id du membre actuellement connecté (et qui affiche donc la page du fil de la conversation).

    Mon problème :
    Disons que le membre avec l'id 1 souhaite afficher sa conversation avec le membre possédant l'id 2 (via une variable GET) le nom de la page appelée par le membre 1 ressemble donc a ceci : /messages.php?idmbr=2 (jusqu'ici facile^^)
    Mais actuellement la requête affiche les messages à partir du moment ou elle trouve un enregistrement possédant l'id 1 du membre dans les champs id_expediteur ou id_destinataire.

    donc si le membre possédant l'id 1 envoie un message au membre possédant l'id 4, le message s'affichera (car la requête trouvera dans le champ id_expediteur l'id 1) ! et sa je ne veux pas car le fil de la conversation concerne uniquement le membre possédant l'id 1 a celui possédant l'id 2.. je ne sais pas si j'ai été très précis dans mon explication ? en même temps c'est difficile d'expliquer^^ donc je pense que le WHERE est a modifier mais de quelle façon ? à base de OR et AND non ? mais comment le mettre en place :/

    en gros je veux que la requête fasse :
    id_expediteur / id_destinataire
    1 / 2 : affiche
    2 / 1 : affiche
    1 / 3 : affiche PAS.
    ..

    je vous remercie j'attends vos réponses avec impatience car j'y arrive vraiment pas

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est exactement ce que tu as écris : 1 et 2, ou 2 et 1
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (m.id_destinataire = 1 AND m.id_expediteur = 2) OR (m.id_expediteur = 2 AND m.id_expediteur = 1)
    Et il n'y a pas besoin de guillemets sur des nombres.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    au moment ou tu as posté la réponse j'avais trouvé la solution^^ avec le code :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (m.id_destinataire = 1 OR m.id_expediteur = 1) AND (m.id_destinataire = 2 OR m.id_expediteur = 2);

    mais ton code fonctionne aussi :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (m.id_destinataire = 1 AND m.id_expediteur = 2) OR (m.id_expediteur = 2 AND m.id_expediteur = 1);

    du coup j'utilise ton code ou le mien ?
    lequel est le plus "conventionnel" ?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le mien est plus logique

    Avec le tiens on arrive à des combinaisons impossibles comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m.id_destinataire = 1  AND m.id_destinataire = 2
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    oops.. minute.. je reviens sur mon message, ton code ne fonctionne pas, bizarre mais il ne fonctionne pas :/

    voici ma bdd :
    Nom : phpmyadmin.jpg
Affichages : 70
Taille : 101,8 Ko

    avec mon code :
    j'ai 4 enregistrements affiché donc EXACT (voir image plus haut).

    avec ton code :
    j'ai 1 enregistrement affiché donc faux. il affiche uniquement l'enregistrement portant l'id 16 ! je ne comprends pas pourquoi ??

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Youps j'ai mis deux fois expediteur :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (m.id_destinataire = 1 AND m.id_expediteur = 2) OR (m.id_destinataire = 2 AND m.id_expediteur = 1);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    exact^^ ça marche nickel et en effet ton code est meilleur car avec le mien on arrive à des combinaisons impossibles ! j'avoue, je suis vaincu

    sinon j'ai une petite question supplémentaire :

    Je viens de mettre les deux variables en place mais j'ai un message d'erreur..
    ( ! ) Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column '$user_id' in 'where clause'' in C:\wamp\www\pag\messages.php on line 48
    ( ! ) PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column '$user_id' in 'where clause' in C:\wamp\www\pag\messages.php on line 48
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
     
    require_once 'inc/db.php';
    $user_id = $_SESSION['auth']->id;
    $idcorrespondant = $_GET['idmbr'];
     
    $reponse = $pdo->query('SELECT
    	m.id idmsg,
    	m.message msg,
    	m.date_envoi dateen,
    	m.date_lecture datelu,
    	u.id id_expediteur,
    	u.username pseudo_expediteur
    FROM users u
    INNER JOIN messages m
    ON m.id_expediteur = u.id
    WHERE (m.id_destinataire = $user_id AND m.id_expediteur = $idcorrespondant) OR (m.id_destinataire = $idcorrespondant AND m.id_expediteur = $user_id);
    ORDER BY date_envoi DESC LIMIT 0, 10');
     
    while ($donnees = $reponse->fetch())
    {
    ?>
    as tu une idée ?

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Les variables ne sont pas interprétés entre guillemets simples et il faut utiliser une requête préparée pour protéger la requête quand on place des données externes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $reponse = $pdo->prepare("SELECT
    	m.id idmsg,
    	m.message msg,
    	m.date_envoi dateen,
    	m.date_lecture datelu,
    	u.id id_expediteur,
    	u.username pseudo_expediteur
    FROM users u
    INNER JOIN messages m
    ON m.id_expediteur = u.id
    WHERE (m.id_destinataire = $user_id AND m.id_expediteur = ?) OR (m.id_destinataire = ? AND m.id_expediteur = $user_id);
    ORDER BY date_envoi DESC LIMIT 0, 10");
    $reponse->execute(array($_GET['idmbr'], $_GET['idmbr']));
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    exact ! merci pour ton code, je viens de faire la même chose pour déposer un message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if(!empty($_POST)){
    	// Connexion à la base de données
    	require_once 'inc/db.php';
    	$user_id = $_SESSION['auth']->id;
     
    	// Insertion du message à l'aide d'une requête préparée
    	$req = $pdo->prepare('INSERT INTO messages (id_expediteur, id_destinataire, message, date_envoi) VALUES('.$user_id.', ?, ?, NOW())');
    	$req->execute(array($_GET['idmbr'], $_POST['message']));
     
    	$_SESSION['flash']['success'] = 'Message envoyé !';
    }
    il fonctionne mais est-ce "améliorable" ? il faut aussi que je m'occupe de la sécurité des données pour le champ message avec un htmlspecialchars..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Erreur lors d'une récupération de données avec critère de sélection
    Par Squalthor dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/11/2006, 11h28
  2. Requête avec date comme critère de sélection
    Par deep-diver dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/09/2006, 11h40
  3. Réponses: 7
    Dernier message: 27/07/2006, 17h20
  4. Réponses: 5
    Dernier message: 06/07/2006, 11h40
  5. Réponses: 3
    Dernier message: 16/06/2006, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo