FluxBB.fr

Le site des utilisateurs francophones de FluxBB.

Vous n'êtes pas identifié(e).

#1 24-05-2012 23:21:09

Cr@sh_
Membre
Inscription : 02-09-2011
Messages : 85
Site Web

[Résolu] Problème $db->escape() et NOT IN

Bonsoir,

Je rencontre actuellement un problème avec la fonction db->escape et le paramètre NOT IN dans une requête SQL hmm

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 smile

Cordialement, Cr@sh_.


Administrateur et fondateur de Geek-Community

Hors ligne

#2 25-05-2012 08:32:48

fanf73
Wik-wiki
Lieu : Lyon
Inscription : 12-09-2006
Messages : 4 432
Site Web

Re : [Résolu] Problème $db->escape() et NOT IN

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

#3 25-05-2012 13:03:10

Cr@sh_
Membre
Inscription : 02-09-2011
Messages : 85
Site Web

Re : [Résolu] Problème $db->escape() et NOT IN

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() ... hmm


Administrateur et fondateur de Geek-Community

Hors ligne

#4 25-05-2012 13:30:01

fanf73
Wik-wiki
Lieu : Lyon
Inscription : 12-09-2006
Messages : 4 432
Site Web

Re : [Résolu] Problème $db->escape() et NOT IN

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

#5 25-05-2012 13:44:44

Cr@sh_
Membre
Inscription : 02-09-2011
Messages : 85
Site Web

Re : [Résolu] Problème $db->escape() et NOT IN

Merci beaucoup cela fonctionne désormais smile


Administrateur et fondateur de Geek-Community

Hors ligne

Pied de page des forums