[RESOLU] Résultat NULL sur un LEFT OUTER JOIN

whaz
Invité n'ayant pas de compte PHPfrance

12 févr. 2016, 19:49

Bonjour à tous,
J'ai passé l'après midi dessus mais je ne vois pas la solution, j'espère que vous pourrez m'aider :)

Donc, j'explique le contexte :
J'ai décidé de mettre en place un système de messagerie privé sur mon site.
Depuis mon back office je peux injecter de nouveaux messages à mes utilisateurs.
Afin d'éviter d'encombrer la base de milliers de ligne inutile pour des utilisateurs qui ne viennent plus, j'ai décidé d'injecter le contenu de ce MP au moment où la personne se connecte.
Pour que chaque personne puisse agir sur ce MP (Lu, Non Lu, Supprimer) j'utilise donc 2 tables.

Et c'est la que ca coince...
L'idée de ma requète d'injection est de vérifier que ma table INBOX ne contienne pas déjà le message de la table MESSAGE.

Voici mon code :

Code : Tout sélectionner

<?php require('./connect.inc.php'); $user_id = $row['id']; $result= mysql_query("select m.id id from message AS m LEFT OUTER JOIN inbox AS i on i.messageid = NULL WHERE (m.userid = '0' or m.userid = '".$user_id."') and m.datefin > '".time()."' "); while($inb = mysql_fetch_array($result)){ $req = mysql_query("INSERT INTO inbox (messageid, userid, statut ) VALUES ('".$inb['id']."','".$user_id."','unread')"); } ?>
En fait, l'erreur qui se produit est que la requête ne détecte pas le résultat NULL et réinjecte le contenu indéfiniment.
J'ai testé en mettant une condition if ($resultat != NULL) avant le INSERT mais ca ne change rien.

Merci par avance pour vos lumières :)

Petit nouveau ! | 5 Messages

14 févr. 2016, 19:15

Bonjour,
Dans ta requete :
select m.id id from message as m left outer join inbox as i on i.messageid = NULL where (m.userid='0' ...

Ta jointure entre la table message et la table inbox est fait sur quelle liaison ? je ne la vois pas.

Pour memoire le terme ON suivant un JOIN est pour definir la jointure.
si le fait de rechercher un NULL dans ta table inbox est le but de ta requete, i.messageid=NULL doit se trouver dans la clause WHERE.

En esperant t'avoir aiguiller vers la solution.

whaz
Invité n'ayant pas de compte PHPfrance

15 févr. 2016, 12:53

Bonjour et merci de l'intérêt que tu portes à ma demande.
En fait j'ai retourné le problème dans tous les sens et j'ai déjà essayé différentes combinaisons.
Si je rajoute and i.messageid=NULL, la requète ne s'exécute pas
Si je fais ma jointure ON i.messageid = m.id j'obtiens le même résultat que ON i.messageid=NULL

Je ne vois pas ce qui cloche ...

whaz
Invité n'ayant pas de compte PHPfrance

15 févr. 2016, 13:02

En fait ce qui est étrange c'est que lorsque j'exécute ma requête en php, l'insertion se fait correctement.
Si je réexécute ma requête en PHP, elle se réinsert à nouveau.

Si je fais les mêmes requêtes sous MYSQL, la 1ère fois le résultat me retourne bien un contenu,
En revanche la 2ème fois elle m'affiche un résultat vide et c'est ce que je cherche à avoir.

Sauf que sous PHP la 2ème fois que j'exécute la requête je devrais avoir un résultat vide et donc ne pas avoir une 2ème réinsertion.

Petit nouveau ! | 5 Messages

15 févr. 2016, 16:16

Bonjour Whaz,
Si j'ai bien compris ton besoin en lisant ton bout de code, tu recherches dans la table message tous les éléments qui n'ont pas de correspondance dans la table inbox, ensuite tu insères dans la table inbox le messageid.
Première question : Ta base est elle en autocommit ? sinon il te faut faire un commit pour écrire tes informations en table. Ton utilitaire MySQL fait peut être le commit automatiquement alors que ton code PHP lui ne le lance pas. Je ne connais pas ton niveau en SQL mais si un commit (ou un rollback) n'est pas fait les informations restent en l'air et ne sont jamais ecritent ou non ecritent.
Donc pour reprendre ton exemple :
while($inb = mysql_fetch_array($result)){
$req = mysql_query("INSERT INTO inbox (messageid, userid, statut ) VALUES ('".$inb['id']."','".$user_id."','unread')");
...
$req = mysql_query("COMMIT");
...
}

J'avoue être un peu traditionnel au niveau de la base et "ON i.messageid = m.id" me semble plus correct que "ON i.messageid = NULL" car ta jointure est plus lisible. Ensuite dans la clause Where tu ajoutes "and i.messageid is null" et non pas "and i.messageid=NULL"
Tu devrais avancer un peu plus.

whaz
Invité n'ayant pas de compte PHPfrance

15 févr. 2016, 17:17

Bon j'ai finalement contourné le problème,
J'effectue une vérification avant d'insérer et ca à l'air de résoudre mon problème

Code : Tout sélectionner

require('./connect.inc.php'); $user_id = $row['id']; $result= mysql_query("select m.id id from message AS m LEFT OUTER JOIN inbox AS i on i.messageid = m.id WHERE (m.userid = '0' or m.userid = '".$user_id."') and m.datefin > '".time()."' and i.messageid is NULL"); while($inb = mysql_fetch_array($result)){ $res= mysql_query("select messageid from inbox where messageid='".$inb['id']."' and (userid = '0' or userid = '".$user_id."') limit 1"); $res2 = mysql_fetch_assoc ($req); if ($res2 == '') { $req = mysql_query("INSERT INTO inbox (messageid, userid, statut ) VALUES ('".$inb['id']."','".$user_id."','unread')"); }
En tout cas merci encore pour ton aide ;)

Petit nouveau ! | 5 Messages

15 févr. 2016, 18:56

C'est Super. Bravo. :pouce: