Bonjour,

J'ai suivi le tuto "Créer un calendrier" ci-dessous :</br> https://www.grafikart.fr/tutoriels/php/calendrier-php-157 </br>
et il fonctionne à la perfection ! </br>
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éponses


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.

Bonjour Lartak,

Merci pour cette réponse rapide ! </br>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;
    }```

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.

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"
</br>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..

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.

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);
        ?>

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.

@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.

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; 
    }

}

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

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..

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 ?

@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).

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

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);

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 !!

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";

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') ^^

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.

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 !!

Si ça revoit à l'user complet, tu as déjà un erreur de concaténation entre un string et un tableau ou objet.

Erf...

Une Minute,
au début du sujet, en répondant à Lartak, tu as donné un code (on va l'appeler "VERSION_1"),
ensuite tu RE réponds à Lartak, en donnant un nouveau code ("VERSION_2").

Là,
Mehdikacim à trouvé une erreur sur "VERSION_1",
et il t'a proposé une correction,
MAIS
toi tu en était au code "VERSION_2",
et tu as utilisé le code qui était censé corriger la VERSION_1, sur ta VERSION_2,
ce n'est pas bon.

C'est pour ça que tu n'as même plus de '$sql'.

( ! ) Notice: Undefined variable: sql

Je commence à avoir mal à la tête :S

En fait il est tard chez moi,
je vais aller dormir, bonne chance en tous cas, je repasserai plus tard pour voir si tu as trouvé.

SLK, merci quand même pour ton aide et bonne nuit !
J'avais laissé trainé en print_r sql, c'est pour ça.. Ce boulet !

Merci encore Mehdikacim, est-ce que ce n'est pas à cause de $r ? Sachant que j'essaye de récupérer l'event par l'id (alors que je veux le définir par l'username) en piochant dans un tableau qu'en plus je n'ai pas défini plus tôt.. Est ce que c'est compréhensible ?

Ta méthode admet en paramètre username.
Si username n'est pas défini, username est à null, bon tu aurai pu l'appeler toto pas ça le problème.
Même si tu envoies l'id c'est pas grave mais par contre, si tu envoies l'id donc je pense que tu vois juste. Ta requête n'est pas bonne car en gros tu cherches l'égalité entre username de la bdd et un id.
De puis dans ta base de données l'id est un int ( integer ou plutôt un entier )
Dans une requête SQL tu as deux possibiltés comme ça tu dormiras moins bête ce soir et ça t'évitera des erreurs bêtes lol.
Soit une reqûete lambda
SELECT FROM table WHERE id=1;
et une autre requête beta
SELECT
FROM table WHERE username='toto';
tu remarques donc je l'espère les apostrophes ''toto' alors qu'autour du 1 non.
Donc tu dois voir où je veux en venir. Quand c'est du texte varchar ou char ou autre la chaîne de caractères doit être entourées d'apostrophes ou de quotes l'integer non.

J'en reviens à ton cas :
$requete .= ' AND username = ' . $username;

ici tu prends le champs username dans ta BDD, dans les apostrophes ou quotes mais ici quotes par soucis de concaténation.
USERNAME n'est pas un int donc génère une erreur.
Voilà la démonstration de ton erreur.
Maintenant tu veux par l'id,
$requete .= ' AND id = ' . $username;
même si, en paramètre de ta méthode c'est plus judicieux de remplacer $username par $id et dans ta requête aussi :)

C'est super sympa d'avoir pris le temps de m'expliquer tout ça !

J'ai donc tout lié à mon username, en ajoutant $username = $_SESSION['username']; je n'ai plus de souci avec l'username.
Mais il m'indique toujours "Call to a member function fetch() on string" pour ma partie :

while($d = $req->fetch(PDO::FETCH_OBJ)){
            $r[strtotime($d->date)][$d->username] = $d->title;

Est-ce justement parce qu'il appelle un int ? Comment corriger "$req .= ' AND username = ' . $username;" ?

Merci d'avance

Essaie un print_r($req->fetchAll())

Il ne me renvoie rien (je l'ai mis juste en dessous de mon fetch)..

hello, je me permets car g posté ça y'a po longtemps... g pas trouvé de soluce...
tu pourrais tenter un :

$d = $req->fetch(PDO::FETCH_OBJ);
$r[strtotime($d->date)][$d->username] = $d->title;

à la place de ta boucle, juste pour voir si ça fonctionne...

Reposte nous le code que tu as actuellement afin de repartir sur de bonne base car certain on mélangé les 2 versions sans avoir tout lu. (^_^)

@Saibe, ça ne fonctionne pas pour moi non, merci quand même !

@Carouge10, hum.. moi aussi j'ai sans doute du un peu tout mélanger.. Les voici :

Le fameux "date.php"

<?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 = $_SESSION['username'];
        global $db;
        $req = " SELECT id,title,username,date FROM events WHERE YEAR(date)='.$year";
        if ($username) {
            $req .= ' AND username = ' . $username;
        }
        $resultat = $db->query($req);

        while($d = $req->fetch(PDO::FETCH_OBJ)){ 
            $r[strtotime($d->date)][$d->username] = $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; 
    }

}

calendrier.php

<?php
session_start();

if (isset($_SESSION['username']))
{
?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Calendrier</title>
        <link rel="stylesheet" type="text/css" href="style.css" />
        <script type="text/javascript" src="js/jquery.min.js"></script>
        <script type="text/javascript">
            jQuery(function($){
               $('.month').hide();
               $('.month:first').show();
               $('.months a:first').addClass('active');
               var current = 1;
               $('.months a').click(function(){
                    var month = $(this).attr('id').replace('linkMonth','');
                    if(month != current){
                        $('#month'+current).slideUp();
                        $('#month'+month).slideDown();
                        $('.months a').removeClass('active'); 
                        $('.months a#linkMonth'+month).addClass('active'); 
                        current = month;
                    }
                    return false; 
               });
            });
        </script>
    </head>
    <body>
        <?php
        require('includes/identifiants.php'); 
        require('date.php');
        $date = new Date();
        $year = date('Y');
        $username = $_SESSION['username'];
        $events = $date->getEvents($year, $username); 
        $dates = $date->getAll($year);
        ?>
        <div class="periods">
            <div class="year"><?php echo $year; ?></div>
            <div class="months">
                <ul>
                    <?php foreach ($date->months as $id=>$m): ?>
                         <li><a href="#" id="linkMonth<?php echo $id+1; ?>"><?php echo utf8_encode(substr(utf8_decode($m),0,3)); ?></a></li>
                    <?php endforeach; ?>
                </ul>
            </div>
            <div class="clear"></div>
            <?php $dates = current($dates); ?>
            <?php foreach ($dates as $m=>$days): ?>
               <div class="month relative" id="month<?php echo $m; ?>">
               <table>
                   <thead>
                       <tr>
                           <?php foreach ($date->days as $d): ?>
                                <th><?php echo substr($d,0,3); ?></th>
                           <?php endforeach; ?>
                       </tr>
                   </thead>
                   <tbody>
                       <tr>
                       <?php $end = end($days); foreach($days as $d=>$w): ?>
                           <?php $time = strtotime("$year-$m-$d"); ?>
                           <?php if($d == 1 && $w != 1): ?>
                                <td colspan="<?php echo $w-1; ?>" class="padding"></td>
                           <?php endif; ?>
                           <td<?php if($time == strtotime(date('Y-m-d'))): ?> class="today" <?php endif; ?>>
                                <div class="relative">
                                    <div class="day"><?php echo $d; ?></div>
                                </div>
                               <div class="daytitle">
                                   <?php echo $date->days[$w-1]; ?> <?php echo $d; ?>  <?php echo $date->months[$m-1]; ?>
                               </div>
                               <ul class="events">
                                   <?php if(isset($events[$time])): foreach($events[$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                   <?php endforeach; endif;  ?>
                               </ul>
                           </td>
                           <?php if($w == 7): ?>
                            </tr><tr>
                           <?php endif; ?>
                       <?php endforeach; ?>
                       <?php if($end != 7): ?>
                            <td colspan="<?php echo 7-$end; ?>" class="padding"></td>
                       <?php endif; ?>
                       </tr>
                   </tbody>
               </table>
               </div>
            <?php endforeach; ?>
        </div>
        <div class="clear"></div>
    </body>
</html>
<?php
}
else
{
  include('probleme_connexion.php');
?>

<?php
}
?>

Je pense avoir trouvé.
Enlève le point avant $year dans la construction du select et ajoute une ' après $year.

:) en effet, ça c po bon :

$req = " SELECT id,title,username,date FROM events WHERE YEAR(date)='.$year"; // ??????

a corrigé en

$req = 'SELECT id,title,username,date FROM events WHERE YEAR(date)="'.$year.'"';

ou si $year = int

$req = "SELECT id,title,username,date FROM events WHERE YEAR(date)=$year";

ou encoer si $year = int

$req = 'SELECT id,title,username,date FROM events WHERE YEAR(date)='.$year;

j'en passe et des meilleurs, bref faire gaffe au quotes

Ohh merci oui ! Par contre, j'ai malheureusement toujours le même message d'erreur...

Que donne un echo $sql; juste avant de faire $req->execute(...)

Il me dit : "Notice: Undefined variable: sql in C:\wamp\www\date.php on line 18".

Pardon, je parlais de $req qui est la chaine de caractère.

Tu as bien ce code là hein ?

$req = 'SELECT id,title,username,date FROM events WHERE YEAR(date)="'.$year.'"'; // ou une des autres versions proposées par Saibe

if ($username) {
    $req .= ' AND username = ' . $username;
}

$resultat = $db->query($req);

while ($d = $req->fetch(PDO::FETCH_OBJ)) {
    ...
}

Mais il m'indique toujours "Call to a member function fetch() on string" pour ma partie :

Ohh merci oui ! Par contre, j'ai malheureusement toujours le même message d'erreur...

Le message dit qu'on applique 'fetch()' sur un 'String',
c'est la ligne :

while ($d = $req->fetch(PDO::FETCH_OBJ)) {

Effectivement,
si on regarde comment est initialisé '$req', on voit bien que c'est un 'String',
alors que nous on voulait qu'il soit un 'PDOStatement'.

Dans ton code, le PDOStatement, c'est '$resultat',
c'est lui qui a récupéré le resultat de la requête ($db->query()).
C'est sur lui qu'il faut faire le fetch :

while ($d = $resultat->fetch(PDO::FETCH_OBJ)) {

Si ça ne fonctionne toujours pas,
stp, rajoute ce genre de "debug" pour qu'on voit ce qui se passe : (le echo et les print_r)

$req = 'SELECT id,title,username,date FROM events WHERE YEAR(date)="'.$year.'"'; // ou une des autres versions proposées par Saibe

if ($username) {
    $req .= ' AND username = ' . $username;
}

echo '$req : ' . $req . '<br>';

$resultat = $db->query($req);

echo '-------------------- $db --------------------<br>';
echo '<pre>';
print_r($db);
echo '</pre>';

echo '-------------------- $resultat --------------------<br>';
echo '<pre>';
print_r($resultat);
echo '</pre>';

while ($d = $resultat->fetch(PDO::FETCH_OBJ)) {
    ...
}

Et la fonction "query()",
dans $resultat = $db->query($req);,
c'est bien la fonction de PDO hein ? Ce n'est pas une fonction à toi ?
Si c'est une fonction à toi, montre-la nous.

Désolée pour ce retour tardif, donc au final ça me donne :

$req : SELECT id,title,username,date FROM events WHERE YEAR(date)="2017" AND username = admin
-------------------- $db --------------------
PDO Object
(
)
-------------------- $resultat --------------------

Plus le message concernant le fetch:

( ! ) Fatal error: Call to a member function fetch() on boolean in C:\wamp\www\date.php on line 31
Call Stack
Time Memory Function Location
1 0.0156 143416 {main}( ) ...\calendrier.php:0
2 0.0354 164136 Date->getEvents( ) ...\calendrier.php:43

Et query est bien une fonction PDO oui, par contre, je ne comprends pas pourquoi je ne retourne plus le tableau de résultats comme au début :

"$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;"

    Merci d'avance.

oh bon sang on est tous passé à coté... :'(

il manque les double quotes dans le 'AND'.

Remplacer :

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

Par :

$req .= ' AND username = "' . $username . '"';

[EDIT]
Pas tout le monde non !
Mehdikacim l'avait dit il y a 21 heures...

J'en reviens à ton cas :
$requete .= ' AND username = ' . $username;

ici tu prends le champs username dans ta BDD, dans les apostrophes ou quotes mais ici quotes par soucis de concaténation.
USERNAME n'est pas un int donc génère une erreur.

Et Saibe pratiquement aussi xD

j'en passe et des meilleurs, bref faire gaffe au quotes

Ne crions pas victoire trop vite...
Rajoute les double-quotes, réexécute le script (en laissant les echo/print_r),
et remontre-nous le tout (avec l'éventuel message d'erreur comme tu viens de faire)

Après, il y a ça : $d->title qui m'intrigue un peu...
Mais on verra plus tard !

... Ca fonctionne !!

Dire que vous m'aviez tous mis en garde ! Je suis vraiment trop nulle..
Bref, merci infiniment SKL, merci à tout le monde d'avoir pris le temps de regarder, vous êtes au top !

Juste pour le plaisir :

$req : SELECT id,title,username,date FROM events WHERE YEAR(date)="2017" AND username = "admin"
-------------------- $db --------------------
PDO Object
(
)
-------------------- $resultat --------------------
PDOStatement Object
(
[queryString] => SELECT id,title,username,date FROM events WHERE YEAR(date)="2017" AND username = "admin"
)
SELECT id,title,username,date FROM events WHERE YEAR(date)="2017" AND username = "admin"

-> Je vais aller revoir mes bases maintenant !

Heureux d'avoir pu contribuer à ton aide :)