Chargement en cours ecrire/public/compiler.php +1 −0 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -255,6 +255,7 @@ function calculer_requete_sql(&$boucle) $order = array(); return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '') . $boucle->in . $boucle->hash . "\n\n // REQUETE \$result = spip_optim_select(\n\t\tarray(\"" . Chargement en cours ecrire/public/criteres.php +80 −44 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -440,7 +440,6 @@ function calculer_criteres ($idb, &$boucles) { foreach($boucles[$idb]->criteres as $crit) { $critere = $crit->op; // critere personnalise ? $f = "critere_".$critere; if (!function_exists($f)) Chargement en cours @@ -461,54 +460,44 @@ function calculer_criteres ($idb, &$boucles) { } } # Criteres de comparaison function calculer_critere_DEFAUT($idb, &$boucles, $crit) function critere_IN_dist ($idb, &$boucles, $crit) { list($fct, $col, $op, $val, $table, $args_sql) = calculer_critere_infixe($idb, $boucles, $crit); // ajout pour le cas special d'une condition sur le champ statut: // il faut alors interdire a la fonction de boucle // de mettre ses propres criteres de statut // http://www.spip.net/@statut (a documenter) if ($col == 'statut') $boucles[$idb]->statut = true; // ajout pour le cas spcial des forums // il faut alors interdire a la fonction de boucle sur forum // de selectionner uniquement les forums sans pere elseif ($boucles[$idb]->type_requete == 'forums' AND ($col == 'id_parent' OR $col == 'id_forum')) $boucles[$idb]->plat = true; static $cpt = 0; list($col, $op, $val)= calculer_critere_infixe($idb, $boucles, $crit); $var = '$in' . $cpt++; $x= "\n\t$var = array();"; foreach ($val as $k => $v) { if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) { // optimiser le traitement des constantes if (is_numeric($r[2])) $x .= "\n\t$var" . "[]= $r[2];"; else $x .= "\n\t$var" . "[]= '".addslashes($r[2])."';"; } else { // Pour permettre de passer des tableaux de valeurs // on repere l'utilisation brute de #ENV**{X}, // c'est-a-dire sa traduction en ($PILE[0][X]). // et on deballe mais en rajoutant l'anti XSS $t = preg_match(",^(\n//.*\n)?\\\$Pile.0,", $v) ? "array_map('addslashes', $v)" : $v; $x .= "\n\tif (!(is_array($v)))\n\t\t$var" ."[]= addslashes($v);\n\telse $var = array_merge($var, $t);"; } } // inserer le nom de la table SQL devant le nom du champ if ($table) { if ($col[0] == "`") $ct = "$table." . substr($col,1,-1); else $ct = "$table.$col"; } else $ct = $col; $boucles[$idb]->in .= $x; // inserer la fonction SQL if ($fct) $ct = "$fct($ct$args_sql)"; $where = array("'IN'", "\"$col\"", "('(\'' . join(\"','\",$var) . '\')')"); // inserer la negation (cf !...) if (strtoupper($op) == 'IN') { $kval = "'(\'' . " . join(" .\n\"','\" . ", $val) . " . '\')'"; $where = array("'IN'", "\"$ct\"", $kval); if ($crit->not) { $where = array("'NOT'", $where); } else { $boucles[$idb]->default_order[] = "'cpt'"; $boucles[$idb]->select[]= "FIND_IN_SET($ct, '\" ." . join(" .','.", $val) . " .\"') AS cpt"; } } else { $where = array("'$op'", "'$ct'", $val[0]); if ($crit->not) $where = array("'NOT'", $where); $boucles[$idb]->select[]= "FIND_IN_SET($col, '\" . join(',', $var) .\"') AS cpt"; } // inserer la condition (cf {lang?}) et c'est fini $boucles[$idb]->where[]= (!$crit->cond ? $where : Chargement en cours @@ -518,13 +507,35 @@ function calculer_critere_DEFAUT($idb, &$boucles, $crit) "''")); } # Criteres de comparaison function calculer_critere_DEFAUT($idb, &$boucles, $crit) { list($col, $op, $val)= calculer_critere_infixe($idb, $boucles, $crit); $where = array("'$op'", "'$col'", $val[0]); // inserer la negation (cf !...) if ($crit->not) $where = array("'NOT'", $where); // inserer la condition (cf {lang?}) $boucles[$idb]->where[]= (!$crit->cond ? $where : array("'?'", calculer_argument_precedent($idb, $col, $boucles), $where, "''")); } function calculer_critere_infixe($idb, &$boucles, $crit) { global $table_des_tables, $tables_principales, $table_date; global $exceptions_des_jointures; $boucle = &$boucles[$idb]; $type = $boucle->type_requete; $col_table = $boucle->id_table; $table = $boucle->id_table; list($fct, $col, $op, $val, $args_sql) = calculer_critere_infixe_ops($idb, $boucles, $crit); Chargement en cours @@ -541,7 +552,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { else if ($table_date[$type] AND preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) { list($col, $col_table) = list($col, $table) = calculer_critere_infixe_date($idb, $boucles, $regs); } Chargement en cours @@ -557,10 +568,35 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { if ($exceptions_des_jointures[$col]) // on ignore la table, quel luxe! list($t, $col) = $exceptions_des_jointures[$col]; $col_table = calculer_critere_externe_init($boucle, $col, $desc, $crit); $table = calculer_critere_externe_init($boucle, $col, $desc, $crit); } } return array($fct, $col, $op, $val, $col_table, $args_sql); // ajout pour le cas special d'une condition sur le champ statut: // il faut alors interdire a la fonction de boucle // de mettre ses propres criteres de statut // http://www.spip.net/@statut (a documenter) if ($col == 'statut') $boucles[$idb]->statut = true; // ajout pour le cas spcial des forums // il faut alors interdire a la fonction de boucle sur forum // de selectionner uniquement les forums sans pere elseif ($boucles[$idb]->type_requete == 'forums' AND ($col == 'id_parent' OR $col == 'id_forum')) $boucles[$idb]->plat = true; // inserer le nom de la table SQL devant le nom du champ if ($table) { if ($col[0] == "`") $col = "$table." . substr($col,1,-1); else $col = "$table.$col"; } // inserer la fonction SQL if ($fct) $col = "$fct($col$args_sql)"; return array($col, $op, $val); } // Champ hors table, ca ne peut etre qu'une jointure. Chargement en cours ecrire/public/debug.php +1 −1 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -337,7 +337,7 @@ function debug_dumpfile ($texte, $fonc, $type) { include_spip('inc/filtres'); http_no_cache(); lang_select($auteur_session['lang']); $self = self(); $self = str_replace("\\'", ''', self()); $self .= ((strpos($self, '?') !== false) ? '&' : '?') . 'var_mode=debug'; echo _DOCTYPE_ECRIRE, Chargement en cours ecrire/public/interfaces.php +1 −0 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -64,6 +64,7 @@ class Boucle { var $default_order = array(); var $date = 'date' ; var $hash = "" ; var $in = "" ; var $lien = false; var $sous_requete = false; var $hierarchie = ''; Chargement en cours Chargement en cours
ecrire/public/compiler.php +1 −0 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -255,6 +255,7 @@ function calculer_requete_sql(&$boucle) $order = array(); return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '') . $boucle->in . $boucle->hash . "\n\n // REQUETE \$result = spip_optim_select(\n\t\tarray(\"" . Chargement en cours
ecrire/public/criteres.php +80 −44 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -440,7 +440,6 @@ function calculer_criteres ($idb, &$boucles) { foreach($boucles[$idb]->criteres as $crit) { $critere = $crit->op; // critere personnalise ? $f = "critere_".$critere; if (!function_exists($f)) Chargement en cours @@ -461,54 +460,44 @@ function calculer_criteres ($idb, &$boucles) { } } # Criteres de comparaison function calculer_critere_DEFAUT($idb, &$boucles, $crit) function critere_IN_dist ($idb, &$boucles, $crit) { list($fct, $col, $op, $val, $table, $args_sql) = calculer_critere_infixe($idb, $boucles, $crit); // ajout pour le cas special d'une condition sur le champ statut: // il faut alors interdire a la fonction de boucle // de mettre ses propres criteres de statut // http://www.spip.net/@statut (a documenter) if ($col == 'statut') $boucles[$idb]->statut = true; // ajout pour le cas spcial des forums // il faut alors interdire a la fonction de boucle sur forum // de selectionner uniquement les forums sans pere elseif ($boucles[$idb]->type_requete == 'forums' AND ($col == 'id_parent' OR $col == 'id_forum')) $boucles[$idb]->plat = true; static $cpt = 0; list($col, $op, $val)= calculer_critere_infixe($idb, $boucles, $crit); $var = '$in' . $cpt++; $x= "\n\t$var = array();"; foreach ($val as $k => $v) { if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) { // optimiser le traitement des constantes if (is_numeric($r[2])) $x .= "\n\t$var" . "[]= $r[2];"; else $x .= "\n\t$var" . "[]= '".addslashes($r[2])."';"; } else { // Pour permettre de passer des tableaux de valeurs // on repere l'utilisation brute de #ENV**{X}, // c'est-a-dire sa traduction en ($PILE[0][X]). // et on deballe mais en rajoutant l'anti XSS $t = preg_match(",^(\n//.*\n)?\\\$Pile.0,", $v) ? "array_map('addslashes', $v)" : $v; $x .= "\n\tif (!(is_array($v)))\n\t\t$var" ."[]= addslashes($v);\n\telse $var = array_merge($var, $t);"; } } // inserer le nom de la table SQL devant le nom du champ if ($table) { if ($col[0] == "`") $ct = "$table." . substr($col,1,-1); else $ct = "$table.$col"; } else $ct = $col; $boucles[$idb]->in .= $x; // inserer la fonction SQL if ($fct) $ct = "$fct($ct$args_sql)"; $where = array("'IN'", "\"$col\"", "('(\'' . join(\"','\",$var) . '\')')"); // inserer la negation (cf !...) if (strtoupper($op) == 'IN') { $kval = "'(\'' . " . join(" .\n\"','\" . ", $val) . " . '\')'"; $where = array("'IN'", "\"$ct\"", $kval); if ($crit->not) { $where = array("'NOT'", $where); } else { $boucles[$idb]->default_order[] = "'cpt'"; $boucles[$idb]->select[]= "FIND_IN_SET($ct, '\" ." . join(" .','.", $val) . " .\"') AS cpt"; } } else { $where = array("'$op'", "'$ct'", $val[0]); if ($crit->not) $where = array("'NOT'", $where); $boucles[$idb]->select[]= "FIND_IN_SET($col, '\" . join(',', $var) .\"') AS cpt"; } // inserer la condition (cf {lang?}) et c'est fini $boucles[$idb]->where[]= (!$crit->cond ? $where : Chargement en cours @@ -518,13 +507,35 @@ function calculer_critere_DEFAUT($idb, &$boucles, $crit) "''")); } # Criteres de comparaison function calculer_critere_DEFAUT($idb, &$boucles, $crit) { list($col, $op, $val)= calculer_critere_infixe($idb, $boucles, $crit); $where = array("'$op'", "'$col'", $val[0]); // inserer la negation (cf !...) if ($crit->not) $where = array("'NOT'", $where); // inserer la condition (cf {lang?}) $boucles[$idb]->where[]= (!$crit->cond ? $where : array("'?'", calculer_argument_precedent($idb, $col, $boucles), $where, "''")); } function calculer_critere_infixe($idb, &$boucles, $crit) { global $table_des_tables, $tables_principales, $table_date; global $exceptions_des_jointures; $boucle = &$boucles[$idb]; $type = $boucle->type_requete; $col_table = $boucle->id_table; $table = $boucle->id_table; list($fct, $col, $op, $val, $args_sql) = calculer_critere_infixe_ops($idb, $boucles, $crit); Chargement en cours @@ -541,7 +552,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { else if ($table_date[$type] AND preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) { list($col, $col_table) = list($col, $table) = calculer_critere_infixe_date($idb, $boucles, $regs); } Chargement en cours @@ -557,10 +568,35 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { if ($exceptions_des_jointures[$col]) // on ignore la table, quel luxe! list($t, $col) = $exceptions_des_jointures[$col]; $col_table = calculer_critere_externe_init($boucle, $col, $desc, $crit); $table = calculer_critere_externe_init($boucle, $col, $desc, $crit); } } return array($fct, $col, $op, $val, $col_table, $args_sql); // ajout pour le cas special d'une condition sur le champ statut: // il faut alors interdire a la fonction de boucle // de mettre ses propres criteres de statut // http://www.spip.net/@statut (a documenter) if ($col == 'statut') $boucles[$idb]->statut = true; // ajout pour le cas spcial des forums // il faut alors interdire a la fonction de boucle sur forum // de selectionner uniquement les forums sans pere elseif ($boucles[$idb]->type_requete == 'forums' AND ($col == 'id_parent' OR $col == 'id_forum')) $boucles[$idb]->plat = true; // inserer le nom de la table SQL devant le nom du champ if ($table) { if ($col[0] == "`") $col = "$table." . substr($col,1,-1); else $col = "$table.$col"; } // inserer la fonction SQL if ($fct) $col = "$fct($col$args_sql)"; return array($col, $op, $val); } // Champ hors table, ca ne peut etre qu'une jointure. Chargement en cours
ecrire/public/debug.php +1 −1 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -337,7 +337,7 @@ function debug_dumpfile ($texte, $fonc, $type) { include_spip('inc/filtres'); http_no_cache(); lang_select($auteur_session['lang']); $self = self(); $self = str_replace("\\'", ''', self()); $self .= ((strpos($self, '?') !== false) ? '&' : '?') . 'var_mode=debug'; echo _DOCTYPE_ECRIRE, Chargement en cours
ecrire/public/interfaces.php +1 −0 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -64,6 +64,7 @@ class Boucle { var $default_order = array(); var $date = 'date' ; var $hash = "" ; var $in = "" ; var $lien = false; var $sous_requete = false; var $hierarchie = ''; Chargement en cours