Pour utiliser la session, il faut donc enregistrer le tableau des equations à exlure dans une variable de session ($_SESSION).
Par exemple dans ton script, commence par initialiser ce tableau si il n'existe pas :
if (!isset($_SESSION['disable_equations'])) {
$_SESSION['disable_equations'] = [];
}
Pour utiliser ce tableau dans une condition sql NOT IN, il faut plutôt utiliser la fonction implode pour transformer le tableau en une chaine de caractère (l'inverse de la fonction explode).
Il ne faut pas de guillemet autour de la liste :
id NOT IN (1,2,3) au lieu de
id NOT IN ("1,2,3")
$sql = 'SELECT * from equation WHERE activationq= "'.$yes.'" AND id NOT IN ('.implode(',', $_SESSION['disable_equations']).') ORDER BY RAND() LIMIT 0,1';
Il faut aussi penser à vérifier si le tableau contient au moins un élément pour ajouter la condition sql NOT IN, puisque si le tableau est vide, la condition sera alors sous la forme id NOT IN () ce qui va surement déclencher une erreur sql.
$sql = 'SELECT * from equation WHERE activationq= "'.$yes.'" ';
if (count($_SESSION['disable_equations']) > 0) {
$sql .= 'AND id NOT IN ('.implode(',', $_SESSION['disable_equations']).') ';
}
$sql .= 'ORDER BY RAND() LIMIT 0,1';
Concernant la sécurité : tu devrais utiliser une requête préparée avec des paramètres au lieu de concaténer directement les variables PHP $_SESSION['ecoles'], $matiere, $yes, etc.
Tu risques en effet une injection sql. Outre les éventuelles erreurs que ceci pourrait causer, si les variables PHP sont modifiables par l'utilisateur, un internaute malintentionné pourrait facilement extraire toutes les données ou supprimer ta base.
Sauf erreur de ma part, il n'est pas possible d'utiliser simplement un paramètre d'une requête préparée pour réaliser la condition sql NOT IN avec la fonction implode, car il faudrait un paramètre par identifiant (mais j'insiste, tu devrais utiliser une requête préparée avec des paramètres pour les autres conditions sql).
Puisque le tableau ne doit contenir que des nombres entiers (id), une manière simple pour éviter les injections sql dans ce cas est d'appliquer la fonction intval sur chaque élément du tableau. Pour appliquer cette fonction sur chaque élément, on peut utiliser la fonction array_map.
$sql = 'SELECT * from equation WHERE activationq= "'.$yes.'" ';
if (count($_SESSION['disable_equations']) > 0) {
$sql .= 'AND id NOT IN ('.implode(',', array_map('intval', $_SESSION['disable_equations'])).') ';
}
$sql .= 'ORDER BY RAND() LIMIT 0,1';
Autre remarque au passage; Pour afficher une variable PHP dans du code HTML, tu devrais plutôt utiliser la fonction htmlspecialchars (ou htmlentities) à la place de stripslashes.
Attention, si tu as déjà appliqué htmlspecialchars/htmlentities sur les données avant de les insérer en bdd, il ne faut alors pas réutiliser ces fonctions à l'affichage.
Enfin, pour enregistrer les id à exclure dans le tableau, à partir de ton extrait de code, on peut éventuellement ajouter l'id de l'équation dans le tableau lors de l'affichage de l'équation :
foreach ($bdd->query($sql) as $data) {
$_SESSION['disable_equations'][] = $data['id'];
echo '<input...';
}
A voir si cela convient : avec cette solution, si l'utilisateur recharge la page sans répondre à l'équation, celle-ci sera tout de même exclue.
Si tu traites les réponses en PHP (via un formulaire par exemple), il serait p-e mieux d'ajouter l'id de l'équation à exclure dans le tableau lorsque l'utilisateur donne la bonne réponse.
Pour utiliser la session, il faut donc enregistrer le tableau des equations à exlure dans une variable de session ($_SESSION).
Par exemple dans ton script, commence par initialiser ce tableau si il n'existe pas :
[PHP]if (!isset($_SESSION['disable_equations'])) {
$_SESSION['disable_equations'] = [];
}[/PHP]
Pour utiliser ce tableau dans une condition sql NOT IN, il faut plutôt utiliser la fonction implode pour transformer le tableau en une chaine de caractère (l'inverse de la fonction explode).
Il ne faut pas de guillemet autour de la liste : [i]id NOT IN (1,2,3)[/i] au lieu de [i]id NOT IN ("1,2,3")[/i]
[PHP]$sql = 'SELECT * from equation WHERE activationq= "'.$yes.'" AND id NOT IN ('.implode(',', $_SESSION['disable_equations']).') ORDER BY RAND() LIMIT 0,1';[/PHP]
Il faut aussi penser à vérifier si le tableau contient au moins un élément pour ajouter la condition sql NOT IN, puisque si le tableau est vide, la condition sera alors sous la forme id NOT IN () ce qui va surement déclencher une erreur sql.
[PHP]$sql = 'SELECT * from equation WHERE activationq= "'.$yes.'" ';
if (count($_SESSION['disable_equations']) > 0) {
$sql .= 'AND id NOT IN ('.implode(',', $_SESSION['disable_equations']).') ';
}
$sql .= 'ORDER BY RAND() LIMIT 0,1';[/PHP]
Concernant la sécurité : tu devrais utiliser une requête préparée avec des paramètres au lieu de concaténer directement les variables PHP $_SESSION['ecoles'], $matiere, $yes, etc.
Tu risques en effet une injection sql. Outre les éventuelles erreurs que ceci pourrait causer, si les variables PHP sont modifiables par l'utilisateur, un internaute malintentionné pourrait facilement extraire toutes les données ou supprimer ta base.
Sauf erreur de ma part, il n'est pas possible d'utiliser simplement un paramètre d'une requête préparée pour réaliser la condition sql NOT IN avec la fonction implode, car il faudrait un paramètre par identifiant (mais j'insiste, tu devrais utiliser une requête préparée avec des paramètres pour les autres conditions sql).
Puisque le tableau ne doit contenir que des nombres entiers (id), une manière simple pour éviter les injections sql dans ce cas est d'appliquer la fonction intval sur chaque élément du tableau. Pour appliquer cette fonction sur chaque élément, on peut utiliser la fonction array_map.
[PHP]$sql = 'SELECT * from equation WHERE activationq= "'.$yes.'" ';
if (count($_SESSION['disable_equations']) > 0) {
$sql .= 'AND id NOT IN ('.implode(',', array_map('intval', $_SESSION['disable_equations'])).') ';
}
$sql .= 'ORDER BY RAND() LIMIT 0,1';[/PHP]
Autre remarque au passage; Pour afficher une variable PHP dans du code HTML, tu devrais plutôt utiliser la fonction htmlspecialchars (ou htmlentities) à la place de stripslashes.
Attention, si tu as déjà appliqué htmlspecialchars/htmlentities sur les données avant de les insérer en bdd, il ne faut alors pas réutiliser ces fonctions à l'affichage.
Enfin, pour enregistrer les id à exclure dans le tableau, à partir de ton extrait de code, on peut éventuellement ajouter l'id de l'équation dans le tableau lors de l'affichage de l'équation :
[PHP]foreach ($bdd->query($sql) as $data) {
$_SESSION['disable_equations'][] = $data['id'];
echo '<input...';
}[/PHP]
A voir si cela convient : avec cette solution, si l'utilisateur recharge la page sans répondre à l'équation, celle-ci sera tout de même exclue.
Si tu traites les réponses en PHP (via un formulaire par exemple), il serait p-e mieux d'ajouter l'id de l'équation à exclure dans le tableau lorsque l'utilisateur donne la bonne réponse.