Calendrier pour chaque utilisateur

Default
,

Bonjour,

J'ai suivi le tuto "Créer un calendrier" ci-dessous : https://www.grafikart.fr/tutoriels/php/calendrier-php-157
et il fonctionne à la perfection !
J'aimerais le personnaliser en ne récupérant que les données de l'utilisateur connecté (mais également en créant un système d'ajout d'évênements).

Malheureusement j'ai essayé de rajouter de différentes façons la variable de session dans la requête de récupération des données (avec un WHERE, en créant une variable username etc) mais ça ne fonctionne absolument pas.. Comme vous pouvez l'imaginer je m'y connais très peu en jquery, j'essaye d'apprendre mais certaines choses restent un mystère pour moi...

Pourriez-vous me conseiller ?

Merci d'avance !

41 Réponse

1 3
17162
, Il a répondu à ma question !

Bonjour.
Je ne vois absolument pas le rapport entre jQuery et la récupération des données SQL, vu que jQuery ne fait que traiter des données déjà présentes dans le code HTML d'après le tutoriel concerné.

Montres nous plutôt ton code PHP concernant la récupération des données.

Default
, Il a répondu à ma question !

Bonjour Lartak,

Merci pour cette réponse rapide ! Voici la fonction de récupération des données (..ou alors je suis encore plus perdue que je ne le pensais..) :


class Date{

    var $days       = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi','Dimanche');
    var $months     = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

    function getEvents($year){
        global $DB;
        $req = $DB->query('SELECT id,title,date FROM events WHERE YEAR(date)='.$year);
        $r = array();
        /**
         * Ce que je veux $r[TIMESTAMP][id] = title
         */
        while($d = $req->fetch(PDO::FETCH_OBJ)){
            $r[strtotime($d->date)][$d->id] = $d->title;
        }
        return $r;
    }```
17162
, Il a répondu à ma question !

Dans la requête SQL, tu récupères tous les évènements concernant une année, mais il n'y a pas de conditions concernant l'utilisateur connecté, tu devrais faire trois choses pour lui apporter la fonctionnalité dont tu parles :
1. Ajouter un champs dans la table events, pour faire le lien avec les évènements spécifiques à un utilisateur pour lesquels tu ajouteras par exemple la valeur de la clé primaire de l'utilisateur
2. Ajouter un argument dans la fonction getEvents qui pourrais être optionnel, qui serait l'identifiant de l'utilisateur
3. Définir une variable avec deux requêtes SQL possibles, selon si le deuxième argument est renseigné ou non, utiliser l'une ou l'autre.

Ce qui ferait par exemple :

public function getEvents($year, $user_id = null)
{
    global $DB;
    $sql = 'SELECT id,title,date FROM events WHERE YEAR(date)='.$year;
    if ($user_id) {
        $sql .= ' AND user_id = ' . $user_id;
    }
    $req = $DB->query($sql);
    // Suite du code de la fonction ...
}

Puis au niveau du code qui appelle la fonction :

$date = new Date();
$year = date('Y');
$id = $_SESSION['user_id']; // par exemple, qui correspondrait à la valeur de l'identifiant de l'utilisateur en base de données
$events = $date->getEvents($year, $id); // récupèrera tous les évènements de l'utilisateur connecté
// etc ...

Ne pas oublier bien sur d'ajouter un champ dans la table events pour relier des évènements aux utilisateurs.

Default
, Il a répondu à ma question !

Merci encore !

J'ai essayé ça :

 function getEvents($year, $username = null){
        global $DB;
        $sql = 'SELECT id,title,username,date FROM events WHERE YEAR(date)='.$year;
        if ($username) {
            $sql .= ' AND username = ' . $username;
        }
        $req = $DB->query($sql);
        /**
         * Ce que je veux $r[TIMESTAMP][id] = title
         */
        while($d = $req->fetch(PDO::FETCH_OBJ)){
            $r[strtotime($d->date)][$d->id] = $d->title;
        }
        return $r;
    }

qui m'a retourné "Fatal error: Call to a member function fetch() on boolean in C:\wamp\www\date.php on line 18"
Puis ça :

function getEvents($year, $username = null){
        global $DB;
        $req = $DB->query('SELECT id,title,username,date FROM events WHERE YEAR(date)='.$year);
        if ($username) {
            $req .= ' AND username = ' . $username;
        }
        $r = array();
        /**
         * Ce que je veux $r[TIMESTAMP][id] = title
         */
        while($d = $req->fetch(PDO::FETCH_OBJ)){
            $r[strtotime($d->date)][$d->id] = $d->title;
        }
        return $r;
    }

qui m'a retourné "Catchable fatal error: Object of class PDO could not be converted to string in C:\wamp\www\date.php on line 12"

Je ne comprends pas ce qui ne va pas..

17162
, Il a répondu à ma question !

Est-ce que tu as bien un champ nommé username dans ta table events et qui est évidemment renseigné ?
Tu devrais modifier le fichier config.php concernant la connexion à la base de données, de manière à avoir des erreurs plus explicite.
Pour la seconde erreur, c'est tout à fait normal étant donné que tu ajoutes une chaîne de caractères à un objet.

Default
, Il a répondu à ma question !

J'ai bien un champs username oui. En reprenant le premier code, il m'indique :

( ! ) Fatal error: Call to a member function fetch() on boolean in C:\wamp\www\date.php on line 18
Call Stack
Time Memory Function Location
1 0.0048 143784 {main}( ) ...\calendrier.php:0
2 0.0508 169712 Date->getEvents( ) ...\calendrier.php:44

<?php
        require('config.php'); 
        require('date.php');
        $date = new Date();
        $year = date('Y');
        $id = $_SESSION['username'];
        $events = $date->getEvents($year, $id);          <- VOICI LA LIGNE 44
        $dates = $date->getAll($year);
        ?>
40917
, Il a répondu à ma question !

Bonsoir,

@SLK : La fonction retourne un array mais le fetch est bien fait sur l'objet.

Par contre, il se peut que ton champs "date" entre en conflit avec MYSQL qui a déjà un champ date interne.

Sinon que donnes un echo de "$sql" avent d'exécuter la requête ?
De plus pour sécurisez la requête et évité les problèmes de " et ', il faudrait préparer la requête.

37685
, Il a répondu à ma question !

@Carouge10 :
Oui, en relisant je me suis dis que je disait n'importe quoi,
j'ai supprimé mon post, désolé, je ne pensais pas que quelqu'un avait déjà répondu, sinon je l'aurai laissé ^^

Par contre, Une minute, tu ne donnes pas la bonne ligne de l'erreur,
la ligne 44 de 'calendrier.php' lance la fonction 'getEvents()',
c'est dans cette fonction qu'est l'erreur, à la ligne 18 de 'date.php',
est-ce que tu peux nous dire quelle est cette ligne ?

Apparemment on applique la fonction 'fetch()' sur un booléen, au lieu d'un 'PDOStatement',
il faut donc voir comment à été initialisé cette variable qui essaie de faire un 'fetch()'. Il semble que cette initialisation ait merdé.

On dirait que c'est le $req->fetch(PDO::FETCH_OBJ) qui est dans le while.
Le '$req' est mal initialisé.
Carouge10 à surement raison.

Default
, Il a répondu à ma question !

Bonjour tout le monde et merci beaucoup pour vos réponses !

@Carouge10, que veux-tu dire par un echo de $sql? Un print_r ? Désolée..
Et j'ai modifié le champs date, à priori ça n'a rien changé.

@SLK, voici la ligne 18

<?php

class Date{

    var $days       = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi','Dimanche');
    var $months     = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

    function getEvents($year, $username = null){
        global $db;
        $sql = 'SELECT id,title,username,date FROM events WHERE YEAR(date)='.$year;
        if ($username) {
            $sql .= ' AND username = ' . $username;
        }
        $req = $db->query($sql);

        /**
         * Ce que je veux $r[TIMESTAMP][id] = title
         */
        while($d = $req->fetch(PDO::FETCH_OBJ)){    <- LIGNE 18
            $r[strtotime($d->date)][$d->id] = $d->title;
        }
        return $r;
    }

    function getAll($year){
        $r = array();

        $date = new DateTime($year.'-01-01');
        while($date->format('Y') <= $year){
            // Ce que je veux => $r[ANEEE][MOIS][JOUR] = JOUR DE LA SEMAINE
            $y = $date->format('Y');
            $m = $date->format('n');
            $d = $date->format('j');
            $w = str_replace('0','7',$date->format('w'));
            $r[$y][$m][$d] = $w;
            $date->add(new DateInterval('P1D'));
        }
        return $r; 
    }

}
12066
, Il a répondu à ma question !

Si tu récupères un objet ou un tableau, le echo fonctionne pas mais le print_r oui, ou un var_dump.

Default
, Il a répondu à ma question !

Ok merci Medhikacim !
Donc si je fais mon print_r juste après le require (date.php) de calendrier.php, il me dit que ma variable n'est pas définie..

12066
, Il a répondu à ma question !

Je n'ai pas lu le sujet, mais je viens de la faire, je t'ai juste éclairé sur la fonction print_r et echo.
Mais, je me pose une question $sql c'est la requête ?

37685
, Il a répondu à ma question !

@Carouge10, que veux-tu dire par un echo de $sql? Un print_r ? Désolée..

Non,
le '$sql' n'est qu'une 'string', tu peux faire un echo dessus, pas de soucis.

<?php
    echo 'Valeur de mon $sql : ' . $sql . '<br>'; die(); // tu executes et tu regardes ce qu'il y a marqué.
?>

@SLK, voici la ligne 18

Bon ben d'accord, mais c'est exactement la ligne que j'avais "supposé",
donc ma réponse précédente, et en particulier celle de Carouge10, sont toujours d'actualité...

Je répète :
"Le '$req' est mal initialisé."

Ça veut dire que la requête SQL est foireuse,
c'est là qu'on doit chercher.

Tu fais un YEAR(date) dans ta requête.
Est-ce que dans le champ 'date', en base de données, il y a bien une "date au format AAAA-MM-JJ" ?
(La fonction 'YEAR()' de SQL attend un paramètre de ce type là)

Tu utilises la variable '$year' aussi,
fais un echo dessus pour vérifier qu'il y a bien la valeur attendue dedans.
si le echo ne fonctionne pas, fais un var_dump() ou print_r()

Donc si je fais mon print_r juste après le require (date.php) de calendrier.php, il me dit que ma variable n'est pas définie..

Tu as fait un print_r() sur quelle variable ?
Parce-que Carouge10 demandait de le faire sur $sql,
mais je ne vois pas de $sql juste après le require (date.php).

12066
, Il a répondu à ma question !

SLK a raison.
C'est bien ce que j'ai compris $sql est un String, une chaîne de caractères donc echo fonctionne.

12066
, Il a répondu à ma question !

Je pense avoir trouvé une erreur....

        $req = $DB->query('SELECT id,title,username,date FROM events WHERE YEAR(date)='.$year);
        if ($username) {
            $req .= ' AND username = ' . $username;
        }

En effet tu essaie de concaténer un objet avec un string

$req .= ' AND username = ' . $username

Essaie plutôt ceci...

$requete = " SELECT id,title,username,date FROM events WHERE YEAR(date)='.$year";
        if ($username) {
            $requete .= ' AND username = ' . $username;
        }
        $resultat = $DB->query($requete);
37685
, Il a répondu à ma question !

En effet tu essaie de concaténer un objet avec un string

Je ne pense pas que '$username' soit un objet,
vu le nom de la variable, et qu'il y a un champ de la table avec le même nom,
c'est probablement une 'string'.

Mais en fait tu as raison, il vaut mieux vérifier !!

12066
, Il a répondu à ma question !

Je me suis mal exprimé.
Je ne dis pas que $username est un objet.
Mais je ne pense pas que tu peux faire un truc du genre
$DB->query() . "STRING";

37685
, Il a répondu à ma question !

Ah,
non mais elle concatène bien que des 'string' là, il n'y a pas de soucis.
Effectivement tu as raison, on ne peut pas faire ce genre de choses, mais là ce n'est pas le cas.

(en tous cas c'est toujours bon de vérifier ce qu'il y a dans '$username') ^^

12066
, Il a répondu à ma question !

Oui car si c'est un objet, ça marchera pas, et il pourrait donc concatener par exemple AND idUsername avec $username['id'] ou $username->id en fonction du type que c'est.

Default
, Il a répondu à ma question !

Wow, vous m'avez un peu perdue je crois.. Désolée !

@SLK : Mon champs date est bien au format AAAA-MM-JJ oui et le print_r de $year me renvoie bien 2017.
@Mehdikacim, j'ai inclu tes corrections et ça me donne :

( ! ) Notice: Undefined variable: sql in C:\wamp\www\calendrier.php on line 40
Call Stack
Time Memory Function Location
1 0.0018 143608 {main}( ) ...\calendrier.php:0
2017
( ! ) Notice: Undefined variable: req in C:\wamp\www\date.php on line 19
Call Stack
Time Memory Function Location
1 0.0018 143608 {main}( ) ...\calendrier.php:0
2 0.0110 163192 Date->getEvents( ) ...\calendrier.php:44

( ! ) Fatal error: Call to a member function fetch() on null in C:\wamp\www\date.php on line 19
Call Stack
Time Memory Function Location
1 0.0018 143608 {main}( ) ...\calendrier.php:0
2 0.0110 163192 Date->getEvents( ) ...\calendrier.php:44

Et, en espérant avoir répondu à toutes les questions, ma variable username renvoie bien à l'username utilisé dans la base de données pour définir l'event.

Merci beaucoup de vous intéresser à mon post !!

1 3