Le site des utilisateurs francophones de FluxBB.
Vous n'êtes pas identifié(e).
Bonsoir,
Je rencontre actuellement un problème avec la fonction db->escape et le paramètre NOT IN dans une requête SQL 
Je désire choisir dans un topic (grâce à son id) un pseudo aléatoirement en voulant en exclure certain, donc j'ai décidé de prendre le paramètre NOT IN pour exclure certains pseudos, le problème c'est pour que cela fonctionne, il faut que le NOT IN est cette structure : NOT IN ('Valeur 1', 'Valeur 2') car ce sont des lettres et non des chiffres ...
Le truc c'est que je veux sécurisé ma variable PHP $pseudo_not_in avec la fonction $db->escape() ce qui a pour effet de mettre un antislash devant les apostrophes, ce qui est normal mais cela rend ma variable inutile.
Voici la structure de ma requête:
$result = $db->query('SELECT * FROM '.$db->prefix.'posts WHERE topic_id = '.$id_topic.' AND poster NOT IN (\''.$db->escape($pseudo_not_in).'\') ORDER BY RAND()') or error('Unable to choose a username', __FILE__, __LINE__, $db->error());$topic_id est protégé grâce à un intval un peu plus haut donc là pas de problème, mais il faut protéger la variable $pseudo_not_in pour éviter les injections SQL même si le script est fait pour être utilisé par des administrateurs.
Est ce que l'un d'entre vous à une solution ? Car j'ai regardé la structure de admin_censoring.php, la requête est protégée par la fonction $db->escape mais ensuite dans le cache c'est affiché sans les antislashs grâce à ce bout de code je pense:
$result = $db->query('SELECT search_for, replace_with FROM '.$db->prefix.'censoring') or error('Unable to fetch censoring list', __FILE__, __LINE__, $db->error());
$num_words = $db->num_rows($result);
$search_for = $replace_with = array();
for ($i = 0; $i < $num_words; $i++)
{
list($search_for[$i], $replace_with[$i]) = $db->fetch_row($result);
$search_for[$i] = '%(?<=[^\p{L}\p{N}])('.str_replace('\*', '[\p{L}\p{N}]*?', preg_quote($search_for[$i], '%')).')(?=[^\p{L}\p{N}])%iu';
}Si quelqu'un à une solution je suis preneur 
Cordialement, Cr@sh_.
Administrateur et fondateur de Geek-Community
Hors ligne
Bonjour,
Je dirais que c'est au moment de générer ta liste que tu dois faire un "db->escape". De quelle manière est-ce que tu créés la variable "$pseudo_not_in" ?
Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.
Hors ligne
Bonjour,
Je récupère ma variable $pseudo_not_in grâce à un imput ou je rentre les pseudos, qui est ensuite récupérer comme ceci:
$id_topic = intval($_POST['numero_topic']);
$pseudo_not_in = pun_trim($_POST['pseudo_not_in']);Même si je fais le $db->escape() ici, les pseudos à exclure ne sont pas pris en compte ...
Quand je rempli mon champs comme ceci: 'Cr@sh_', 'Test', 'Test 2' ça fonctionne (sans le $db->escape()), mais si je le rempli comme ceci: Cr@sh_, Test, Test 2 ça m’envoie l'erreur "Unable to choose a username".
J'ai même essayer les guillemets mais pas moyen non plus, la je sèche complètement, car je voudrais juste à taper les pseudos et qu'ils soient juste séparer d'une virgule, et non avec des apostrophes et pouvoir donc utiliser la fonction $db->escape() ... 
Administrateur et fondateur de Geek-Community
Hors ligne
Ton problème est normal : pour utilise une clause "IN" sur un champ de type "textuel", il faut que chaque valeur soit entourée par des '' . Essaye avec ça :
$pseudo_not_in = '\''.implode('\', \'', explode(', ', $db->escape(pun_trim($_POST['pseudo_not_in'])))).'\'';Mais il faut que toutes tes valeurs soient séparée par ", " (virgule + espace)
Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.
Hors ligne
Merci beaucoup cela fonctionne désormais 
Administrateur et fondateur de Geek-Community
Hors ligne