Bonjour , il se trouve que j'ai un petit probléme depuis des jours et je ne trouve aucune solution ><
En fait , il y a deux tables

la table cours : A chaque fois qu'on ajoute un cours il y a juste L'ID en auto increment qui augmente ...

la table RDV : A chaque fois qu'on prends rdv pour un cours l'idenfant devient egal à l'id du cours en question

Ce que je veux faire c'est envoyer un mail en récupérant les infos des differentes tables , mais le probléme c'est qu'il y a plusieurs idenfant qui à le même chiffre .. donc lorsque j'exécute la requete ci dessous , c'est le premier idenfant qui est pris en compte , et non pas celui selectionner.

Je sais que ` WHERE c.id = r.idenfant"); // Probleme
est faux , j'ai essayé énormément d'alternative , mais je ne vois vraiment pas comment le résoudre

Un petit schéma pour mieux comprendre :)
http://www.noelshack.com/2015-29-1437159904-sans-titre-1.jpg

<?php
require_once 'inc/db.php';
    $req = $pdo->query("SELECT r.id, r.id_nom_prenom_rdv, r.idenfant, r.nom_rdv , r.prenom_rdv,  c.id , c.date , c.heure , c.matiere , c.id_nom_prenom , c.nom , c.prenom
    FROM cours c, rdv r
    WHERE c.id = r.idenfant"); // Probleme 
    $row = $req->fetch(PDO::FETCH_ASSOC);

    $to = $row['id_nom_prenom'] . "@example.com";
    $subject = " [COACHING]" .  " ID : " . $row['id_nom_prenom_rdv'] . " a pris rendez vous " ;
    $txt = "Bonjour, " . $row['nom_rdv'] . $row['prenom_rdv'] . " a pris rdv pour le cours de " .$row['matiere'] ."  a la date " . $row['date'] . " de  " . $row['heure'] . ". Une fois que vous aurez confirmez la prise de rendez vous, un mail sera envoyer a xxx ainsi qu'a " . $row['id_nom_prenom_rdv'] . " " . "http://localhost:63342/cours/validation_token.php?token='$token";
    $headers = "From: webmaster@example.com" . "\r\n" .
        "CC: xxx@example.com";

    mail($to, $subject, $txt, $headers);

14 réponses


bugland
Réponse acceptée

Pour la requète il te faut absolument récupérer le numéro de ton cours et l'id de l'utilisateur en question en php sinon tu ne pourras pas filtrer correctement. On va partir sur l'exemple de Alexandra elle est connecté à son compte te va validé son cours il faut que tu récupère son idUtilisateur en php. Si tu veux avoir tout les cours de l'utilisateur connecté voici la requete. Après les jointure la sont faite à l'ancienne le mieux est de faire de jointure avec INNER JOIN mais bon test déja comme ca, si jamais tu veux juste le cours de l'utilisateur tu ajouter une clause dans le where en filtrant sur l'idenfant et il faut que tu le récupère en php :

$req = $pdo->query("SELECT r.id, r.idenfant,  c.id , c.date , c.heure , c.matiere , c.id_nom_prenom , c.nom , c.prenom , u.nom , u.prenom , u.idbooster
    FROM cours c, rdv r , utilisateur u
    WHERE c.id = r.idenfant 
    AND r.idutilisateur = u.id
    AND r.idutilisateur = " . $idUtilisateurConnecte . ")";
    $row = $req->fetch(PDO::FETCH_ASSOC);

Salut, il faut que tu te poses tout d'abord les bonnes questions. Comme est ce qu'un cours spécifiquement est pris par un et un seul RDV ou par plusieurs rendez vous. A ce que je vois ton cours est lié à plusieurs rendez vous vu que Antoine et Laurence à le même id de cours si tu veux qu'un cours soit lié à un et un seul rendez vous il ne faut pas que dans ta table RDV il y ai plusieurs fois le même idenfant. J'attends plus de détails pour répondre plus précisément.

Comme le dit bugland, la conception fait que une salle = pleins de rdv. Plus d'informations sont à donner car pas trop clair pour le moment. Par exemple le rdv, dans mon esprit, se doit d'être unique (comme chez le médecin) donc dans ce cas là il faudrait rajouter le champ datetime (un nouveau champ ?) pour pouvoir cibler la bonne personne.

Bonjour , tout d'abord je tiens a vous remercier pour l'interet porter à mon probléme
Pour répondre à vos questions : "est ce qu'un cours spécifiquement est pris par un et un seul RDV ou par plusieurs rendez vous" Comme le montre l'infographie un cours peut avoir plusieurs rendez vous ( comme ci qu'il y avait un professeur ( le cours ) pour plusieurs éléves , ( les rdv )

" il ne faut pas que dans ta table RDV il y ai plusieurs fois le même idenfant" En fait si je fais ça c'est pour ensuite créer une page admin ou j'afficherai pour le "directeur" tout les rdv pris pour un cours spécifique.

"une salle = pleins de rdv"
Donc à ce moment créer une nouvelle col ou une nouvelle table ? c'est certain ! mais je ne vois pas comment ( enfin quoi mettre ) j'avais même penser à un token qui serrai générer dans les deux talbles dés qu'on " prends rdv " et qu'ensuite on compare les deux token , si le token est le même celui de la table RDV alors on a une ROW unique pour lier les deux tables .. SAUF que , à chaque nouveau rendez vous , dans la table 'cours' ça sera pas possible à moins d'écraser celle existante , pour la faire correspondre à celle fraichement créer dans rdv.
^
Enfin je pense que ça ne sois pas le bon chemin à suivre .. si vous pouvez éclairer ma lanterne pls :D

Une autre question est ce qu'un RDV est associé à un et un seul COURS ?
Après pour afficher tous les RDV pour un cours spécifiques il suffit de faire un WHERE sur idenfant de ta table RDV genre
SELECT *
FROM RDV
WHERE idenfant = 12
Et la tu aura tous les RDV qui vont assité au cours 12.

Oui ! et il peut y avoir plusieurs rdv pour un seul cours.
Le cours est statique en quelques sorte , seul la table rdv avec idenfant = id de la table cours .

"Après pour afficher tous les RDV pour un cours spécifiques il suffit de faire un WHERE sur idenfant de ta table RDV genre
SELECT *
FROM RDV
WHERE idenfant = 12
Et la tu aura tous les RDV qui vont assité au cours 12."

Oui je sais , ce n'est pas là le problème .. comme je le dis plus haut -> Ce que je veux faire c'est envoyer un mail en récupérant les infos des différentes tables , mais le problème c'est qu'il y a plusieurs idenfant qui à le même chiffre .. donc lorsque j'exécute la requête ci dessus , c'est le premier idenfant qui est pris en compte , et non pas celui sélectionner.

SELECT *
FROM RDV R
INNER JOIN COURS C
ON R.idenfant = C.ID
WHERE R.idenfant = 12

Pour moi avec cette requète tu récupère toutes les info des 2 tables pour le cours numéro 12.
Je comprends pas quand tu dis que c'est le premier idefant qui est pris en compte et non celui selectionné.
C'est tout à fait normal qu'il y est plusieurs idenfant avec le même chiffre car tu peux avoir plusieurs RDV pour un cours.

Est ce que cela te parle ou pas ?

Alors "Je comprends pas quand tu dis que c'est le premier idefant qui est pris en compte et non celui selectionné."
Je propose quelques screen pour illustré le probléme :
http://www.noelshack.com/2015-29-1437215875-sans-titre-2.jpg

Hum je vais essayer ce que tu as poster et je te dis ça :)

Ce qui est bien c'est que déja je peux envoyer un mail a Jean Dujardin car l'id_nom_prenom = a son adresse mail , mais ça serrai pour le notifier de la personne que ça coince , j'aimerai pouvoir lui dire que c'est nom prenom qui a pris rdv et non pas qu'il y a un nouveau participant et que ça sera la surprise au moment du cours m'voyez ? :v

En faite il te manque un idUtilisateur dans ta table RDV et dans ta requete de recupèration tu devras ajouter le WHERE sur cette idUtilisateur. Donc il te faut une table utilisateur en plus et dans ton RDV l'idUtilisateur pour faire la jointure avec ton utilisateur.

Hum je vois .. donc dans ma DB ça donne ça : http://www.noelshack.com/2015-29-1437245227-sans-titre-3.jpg
Mais au niveau de la requette je bloque

$req = $pdo->query("SELECT r.id, r.idenfant,  c.id , c.date , c.heure , c.matiere , c.id_nom_prenom , c.nom , c.prenom , u.nom , u.prenom , u.idbooster
    FROM cours c, rdv r , utilisateur u
    WHERE c.id = r.idenfant AND r.idutilisateur"); // A REVOIR CLAIREMENT PCK C NUL :v
    $row = $req->fetch(PDO::FETCH_ASSOC);

Une table de mapping entre RDV et cours te serait bénéfique : Id_user|id_rdv|ID_cours où id_rdv et id_cours serait foreign key

Mille Merci Bugland après quelques modification et quelques essaie tout a fini par fonctionner ! t'es au top :D

De rien bon courage :)