$reponse = $bdd->query('SELECT * FROM planning WHERE semaine=\'01\' )
$reponse = $bdd->query('SELECT * FROM planning WHERE semaine=\'01\' ') ;
Pour les isset et tout, j'avoue ça m'a souvent destabiliser. Php offre un langage souple et plus intuitif que pas mal d'autres, mais sur ce point, il est assez sé au aine. Il faut regarder la doc ou les tableaux comparatifs. Dans les langages fortement typés, ces questions n'existent pas : soit la variable existe, soit t'as une erreur. Et si elle existe, soit elle est du type qu'il faut, soit elle est nulle. Gros Somodo. Mais à coté, les autres langages ont leurs difficultés

Là, la barrière entre non existant et null est quasi inexistant. Bref,
isset renverra False pour une variable jamais déclarée, détruite (avec unset) ou nulle. C'est la dernière condition que je ne trouve pas logique.
empty : renverra true pour :
* "" (une chaîne vide)
* 0 (0 en tant qu'entier)
* "0" (0 en tant que chaîne de caractères)
* NULL
* FALSE
* array() (un tableau vide)
* var $var; (une variable déclarée, mais sans valeur dans une classe)
Là encore ... "0" est vide pour lui. C'est là où PHP commence à être traitre ! donc if ("0" == 0 == null == false) et empty("0" == ""), tout ça c'est pareil !
Donc pour éviter ces problèmes, je te conseille perso, pour les $_POST, et trucs comme ça, de vérifier avec isset(). Pour des propriétés d'objet, avec === null (sauf erreur de ma part, j'avoue avoir un doute, c'est surtout un exemple du singleton où tu déclares $instance = null;), et pour le reste, dès que tu peux être le plus précis possible c'est mieux ($bool === false), ($int === 5), etc ... car n'oublions pas que "0" == 0 == null != "0 chien", mais que "0 chien" == 0 (lol). Mais "0" !== 0 !== null !== false
Je te conseille de lire la doc sur transtypage.