Re: {branche?} provoque une jointure / SPIP 3.1.1 SVN

Matthieu Marcillaud <[email protected]>
Newsgroups gmane.comp.web.spip.devel
Message-ID <[email protected]>
Le 12/08/2016 à 13:22, RealET a écrit :

> Est-ce que c'est ce que
> https://core.spip.net/projects/spip/repository/entry/branches/spip-3.1/ecrire/public/criteres.php#L522
> tente de faire ?
> $boucle->where[] = !$crit->cond ? $c :
>      ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
>

Ok, on a bien un bug ici. Je reproduis.

Le code généré est : (sql_quote(@$Pile[0]['id_rubrique']) ? 
sql_in('L1.id_rubrique', 
calcul_branche_in(sql_quote(@$Pile[0]['id_rubrique']))) : '1=1')

Mais sql_quote(0) donne '0' considérant que c'est du texte, sans 
précision du type de champ.
Du coup, ça entre toujours dans la condition.

Il faut ajouter le type int attendu par sql_quote ici...
Ce sql_quote est généré par kwote. Qui peut prendre le type en argument.
Donc , passer l'appel de :

$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles));

à

$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), 
$boucle->sql_serveur, 'int NOT NULL');

Mais la fonction kwote peut utiliser 2 sql_quote, et le second qui sera 
utilisé ici n'utilise pas l'argument de type : je pense que c'est un 
oubli et que ça devrait être ajouté.

Donc dans kwote() :
Passer de
return "sql_quote($lisp)";
à
return "sql_quote($lisp, '$serveur', '$type')";

Je suppose que l'oubli (si c'est le cas) vient de 
https://core.spip.net/projects/spip/repository/revisions/19257


Avec ces 2 corrections les boucles semblent fonctionner comme attendu :
?page=test :
<BOUCLE_br(EVENEMENTS){branche?}>
=> pas de jointure

?page=test&id_rubrique=1 :
<BOUCLE_br(EVENEMENTS){branche?}>
=> jointure OK

?page=test&id_rubrique[]=1&id_rubrique[]=2 :
<BOUCLE_br(EVENEMENTS){branche?}>
=> jointure OK

MM.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.