Changeset 97655 in spip-zone for _plugins_/fulltext


Ignore:
Timestamp:
May 10, 2016, 7:11:25 AM (4 years ago)
Author:
kent1@…
Message:

PSR SPIP

Location:
_plugins_/fulltext/trunk/inc
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fulltext/trunk/inc/fulltext.php

    r96626 r97655  
    11<?php
    22
    3 if (!defined('_ECRIRE_INC_VERSION')) return;
     3if (!defined('_ECRIRE_INC_VERSION')) {
     4        return;
     5}
    46
    57include_spip('inc/rechercher');
     
    1113        // signaler les incoherences de charset site/tables qui plantent les requetes avec accents...
    1214        // ?exec=convert_sql_utf8 => conversion base | ?exec=convert_utf8 => conversion site
    13         $data = sql_fetch(sql_query("SHOW CREATE TABLE " . table_objet_sql($table)));
    14         preg_match(',DEFAULT CHARSET=([^\s]+),', $data["Create Table"], $match);
     15        $data = sql_fetch(sql_query('SHOW CREATE TABLE ' . table_objet_sql($table)));
     16        preg_match(',DEFAULT CHARSET=([^\s]+),', $data['Create Table'], $match);
    1517        $charset_table = strtolower(str_replace('-', '', $match[1]));
    1618        $charset_table = preg_replace(',^latin1$,', 'iso88591', $charset_table);
    17         if ($charset_table != '' AND $charset != $charset_table) {
     19        if ($charset_table != '' and $charset != $charset_table) {
    1820                $modif = (substr($charset, 0, 3) == 'iso' ? 'convert_utf8' : 'convert_sql_utf8');
    1921                $url = generer_url_ecrire($modif);
    20                 echo _T('fulltext:incoherence_charset') . "<strong><a href='$url'>" . _T('fulltext:convertir_utf8') . "</a></strong>";
     22                echo _T('fulltext:incoherence_charset') . "<strong><a href='$url'>" . _T('fulltext:convertir_utf8') . '</a></strong>';
    2123        }
    2224}
     
    2729}
    2830
    29 
    30 function fulltext_liste_des_tables(){
     31function fulltext_liste_des_tables() {
    3132        $champs = liste_des_champs();
    3233        $tables = array();
     
    3536        );
    3637
    37         foreach($champs as $table=>$fields){
     38        foreach ($champs as $table => $fields) {
    3839                $tables[$table] = array(
    3940                        'fields' => $fields,
     
    4344                );
    4445
    45                 if (strtolower($tables[$table]['engine'])=='myisam'){
    46                         if($keys = fulltext_keys($table)){
     46                if (strtolower($tables[$table]['engine'])=='myisam') {
     47                        if ($keys = fulltext_keys($table)) {
    4748                                $tables[$table]['keys'] = $keys;
    4849                        }
     
    5455                        $champ_titre = array_pop($c);
    5556
    56                         if (!isset($tables[$table]['keys'][$champ_titre])){
     57                        if (!isset($tables[$table]['keys'][$champ_titre])) {
    5758                                $tables[$table]['index_prop'][$champ_titre] = array($champ_titre);
    5859                        }
    59                         if (!isset($tables[$table]['keys']['tout'])){
     60                        if (!isset($tables[$table]['keys']['tout'])) {
    6061                                $tables[$table]['index_prop']['tout'] = array_keys($fields);
    61                                 if (isset($champs_interdits[$table]))
    62                                         $tables[$table]['index_prop']['tout'] = array_diff($tables[$table]['index_prop']['tout'],$champs_interdits[$table]);
     62                                if (isset($champs_interdits[$table])) {
     63                                        $tables[$table]['index_prop']['tout'] = array_diff($tables[$table]['index_prop']['tout'], $champs_interdits[$table]);
     64                                }
    6365                        }
    6466                }
     
    6971/**
    7072 * Récupération de l'engine utilisé par une table sql
    71  * 
     73 *
    7274 * Retourne MyISAM ou InnoDB
    73  * 
     75 *
    7476 * @param string $table
    7577 *              La table à analyser
    76  * @return string 
     78 * @return string
    7779 *              Le moteur utilisé
    7880 */
    7981function fulltext_trouver_engine_table($table) {
    80         if ($s = sql_query("SHOW CREATE TABLE " . table_objet_sql($table)) AND $t = sql_fetch($s) AND $create = array_pop($t) AND preg_match('/\bENGINE=([^\s]+)/', $create, $engine)) {
     82        if ($s = sql_query('SHOW CREATE TABLE ' . table_objet_sql($table)) and $t = sql_fetch($s) and $create = array_pop($t) and preg_match('/\bENGINE=([^\s]+)/', $create, $engine)) {
    8183                return $engine[1];
    8284        }
     
    8486
    8587function fulltext_index($table, $champs, $nom = null) {
    86         if (!$nom)
     88        if (!$nom) {
    8789                list(, $nom) = each($champs);
     90        }
    8891
    89         if ($nom !== 'tout')
     92        if ($nom !== 'tout') {
    9093                $champs = array($nom);
     94        }
    9195
    9296        $trouver_table = charger_fonction('trouver_table', 'base');
     
    9498
    9599        foreach ($champs as $i => $f) {
    96                 if (preg_match(',^(tiny|long|medium)?text\b,i', $desc['field'][$f]))
     100                if (preg_match(',^(tiny|long|medium)?text\b,i', $desc['field'][$f])) {
    97101                        $champs[$i] = "`$f`";
    98                 else if (preg_match(',^varchar.*\b,i', $desc['field'][$f]) && !preg_match(',COLLATE utf8_bin.*\s,i', $desc['field'][$f]))
     102                } elseif (preg_match(',^varchar.*\b,i', $desc['field'][$f]) && !preg_match(',COLLATE utf8_bin.*\s,i', $desc['field'][$f])) {
    99103                        $champs[$i] = "`$f`";
    100                 else
     104                } else {
    101105                        unset($champs[$i]);
     106                }
    102107        }
    103         return "`$nom` (" . join(',', $champs) . ")";
     108        return "`$nom` (" . join(',', $champs) . ')';
    104109}
    105110
    106111function fulltext_lien_creer_index($table, $champs, $nom = null) {
    107         $url = generer_action_auteur("fulltext_creer_index","$table/$nom",generer_url_ecrire('fulltext'));
    108         return bouton_action(_T('fulltext:fulltext_creer', array('index' => fulltext_index($table, $champs, $nom))),$url);
     112        $url = generer_action_auteur('fulltext_creer_index', "$table/$nom", generer_url_ecrire('fulltext'));
     113        return bouton_action(_T('fulltext:fulltext_creer', array('index' => fulltext_index($table, $champs, $nom))), $url);
    109114}
    110115
    111116function fulltext_reinitialiser_document() {
    112         sql_updateq("spip_documents", array('contenu' => '', 'extrait' => 'non'), "extrait='err'");
    113         return "<p><strong>" . _T('fulltext:index_reinitialise') . "</strong></p>";
     117        sql_updateq('spip_documents', array('contenu' => '', 'extrait' => 'non'), "extrait='err'");
     118        return '<p><strong>' . _T('fulltext:index_reinitialise') . '</strong></p>';
    114119}
    115120
    116121function fulltext_reinitialiser_totalement_document() {
    117         sql_updateq("spip_documents", array('contenu' => '', 'extrait' => 'non'));
    118         return "<p><strong>" . _T('fulltext:index_reinitialise_totalement') . "</strong></p>";
     122        sql_updateq('spip_documents', array('contenu' => '', 'extrait' => 'non'));
     123        return '<p><strong>' . _T('fulltext:index_reinitialise_totalement') . '</strong></p>';
    119124}
    120125
    121126function fulltext_reinitialiser_document_ptg() {
    122         sql_updateq("spip_documents", array('contenu' => '', 'extrait' => 'non'), "extrait='ptg'");
    123         return "<p><strong>" . _T('fulltext:index_reinitialise_ptg') . "</strong></p>";
     127        sql_updateq('spip_documents', array('contenu' => '', 'extrait' => 'non'), "extrait='ptg'");
     128        return '<p><strong>' . _T('fulltext:index_reinitialise_ptg') . '</strong></p>';
    124129}
  • _plugins_/fulltext/trunk/inc/fulltext_creer_index.php

    r95483 r97655  
    33 * Plugin Fulltext
    44 */
    5 if (!defined("_ECRIRE_INC_VERSION")) return;
     5if (!defined('_ECRIRE_INC_VERSION')) {
     6        return;
     7}
    68
    79include_spip('inc/fulltext');
    810
    9 function fulltext_liste_creer_index($arg=null){
     11function fulltext_liste_creer_index($arg = null) {
    1012
    11         list($table, $nom) = array_pad(explode("/", $arg), 2, null);
     13        list($table, $nom) = array_pad(explode('/', $arg), 2, null);
    1214
    13         $ok = $erreur = "";
     15        $ok = $erreur = '';
    1416
    1517        $tables = fulltext_liste_des_tables();
    16         if ($table AND isset($tables[$table]) AND isset($tables[$table]['index_prop'][$nom])){
    17                 list($ok, $erreur) = fulltext_creer_index($table,$nom,$tables[$table]['index_prop'][$nom]);
    18         }
    19         elseif ($table=="all") {
    20                 foreach($tables as $table => $desc) {
    21                         foreach($desc['index_prop'] as $nom => $champs) {
     18        if ($table and isset($tables[$table]) and isset($tables[$table]['index_prop'][$nom])) {
     19                list($ok, $erreur) = fulltext_creer_index($table, $nom, $tables[$table]['index_prop'][$nom]);
     20        } elseif ($table == 'all') {
     21                foreach ($tables as $table => $desc) {
     22                        foreach ($desc['index_prop'] as $nom => $champs) {
    2223                                list($ok1, $erreur1) = fulltext_creer_index($table, $nom, $champs);
    23                                 if ($ok1) $ok .= $ok1 . "<br />";
    24                                 if ($erreur1) $erreur .= $erreur1 . "<br />";
     24                                if ($ok1) {
     25                                        $ok .= $ok1 . '<br />';
     26                                }
     27                                if ($erreur1) {
     28                                        $erreur .= $erreur1 . '<br />';
     29                                }
    2530                        }
    2631                }
     
    3742        if ($table == 'document' && $nom == 'tout') {
    3843                // On initialise l'indexation du contenu des documents
    39                 sql_updateq("spip_documents", array('contenu' => ''), "extrait='non'");
     44                sql_updateq('spip_documents', array('contenu' => ''), "extrait='non'");
    4045        }
    41         if (!$s = sql_alter($query="TABLE " . table_objet_sql($table) . " ADD FULLTEXT " . $index)){
    42                 spip_log($query,"fulltext"._LOG_ERREUR);
    43                 return array('',"$table : " . _T('spip:erreur') . " " . mysql_errno() . " " . mysql_error());
     46        if (!$s = sql_alter($query = 'TABLE ' . table_objet_sql($table) . ' ADD FULLTEXT ' . $index)) {
     47                spip_log($query, 'fulltext'._LOG_ERREUR);
     48                return array('', "$table : " . _T('spip:erreur') . ' ' . mysql_errno() . ' ' . mysql_error());
    4449        }
    4550        sql_optimize(table_objet_sql($table));
     
    4853
    4954        if (isset($keys[$nom])) {
    50                 return array("$table : " . _T('fulltext:fulltext_cree') . " : $keys[$nom]", "");
     55                return array("$table : " . _T('fulltext:fulltext_cree') . " : $keys[$nom]", '');
    5156        } else {
    52                 return array("", "$table : "._T('spip:erreur'));
     57                return array('', "$table : "._T('spip:erreur'));
    5358        }
    5459
  • _plugins_/fulltext/trunk/inc/recherche_to_array.php

    r97650 r97655  
    1212
    1313
    14 if (!defined('_ECRIRE_INC_VERSION')) return;
     14if (!defined('_ECRIRE_INC_VERSION')) {
     15        return;
     16}
    1517
    1618
     
    3537
    3638        $requete = array(
    37                 "SELECT"=>array(),
    38                 "FROM"=>array(),
    39                 "WHERE"=>array(),
    40                 "GROUPBY"=>array(),
    41                 "ORDERBY"=>array(),
    42                 "LIMIT"=>"",
    43                 "HAVING"=>array()
     39                'SELECT' => array(),
     40                'FROM' => array(),
     41                'WHERE' => array(),
     42                'GROUPBY'=> array(),
     43                'ORDERBY' => array(),
     44                'LIMIT' => '',
     45                'HAVING' => array()
    4446        );
    4547
    4648        $table = $options['table'];
    47         if ($options['champs'])
     49        if ($options['champs']) {
    4850                $champs = $options['champs'];
    49         else {
     51        } else {
    5052                $l = liste_des_champs();
    5153                $champs = $l[$table];
     
    5557        // s'il n'y a qu'un mot mais <= 3 lettres, il faut le chercher avec une *
    5658        // ex: RFC => RFC* ; car mysql fulltext n'indexe pas ces mots
    57         if (preg_match('/^\w{1,3}$/', $recherche))
     59        if (preg_match('/^\w{1,3}$/', $recherche)) {
    5860                $recherche .= '*';
     61        }
    5962
    6063        list($methode, $q, $preg) = expression_recherche($recherche, $options);
     
    6871        // c'est un pis-aller : ca a peu de chance de marcher, mais mieux quand meme que en conservant la ','
    6972        // (aka ca marche au moins dans certains cas comme avec spip_formulaires_reponses_champs)
    70         if (strpos($_id_table,",")!==false){
    71                 $_id_table = explode(',',$_id_table);
     73        if (strpos($_id_table, ',') !== false) {
     74                $_id_table = explode(',', $_id_table);
    7275                $_id_table = reset($_id_table);
    7376        }
    7477
    75         $requete['SELECT'][] = "t.".$_id_table;
     78        $requete['SELECT'][] = 't.'.$_id_table;
    7679        $a = array();
    7780        // Recherche fulltext
    7881        foreach ($champs as $champ => $poids) {
    79                 if (is_array($champ)){
    80                         spip_log("requetes imbriquees interdites");
     82                if (is_array($champ)) {
     83                        spip_log('requetes imbriquees interdites');
    8184                } else {
    82                         if (strpos($champ,".")===FALSE)
     85                        if (strpos($champ, '.') === false) {
    8386                                $champ = "t.$champ";
     87                        }
    8488                        $requete['SELECT'][] = $champ;
    8589                        $a[] = $champ.' '.$methode.' '.$q;
    8690                }
    8791        }
    88         if ($a) $requete['WHERE'][] = join(" OR ", $a);
     92        if ($a) {
     93                $requete['WHERE'][] = join(' OR ', $a);
     94        }
    8995        $requete['FROM'][] = table_objet_sql($table).' AS t';
    9096
     
    100106
    101107                // si espace, ajouter la meme chaine avec des guillemets pour ameliorer la pertinence
    102                 $pe = (strpos($r, ' ') AND strpos($r,'"')===false)
    103                         ? sql_quote(trim("\"$r\""), $serveur) : '';
     108                $pe = (strpos($r, ' ') and strpos($r, '"') === false) ? sql_quote(trim("\"$r\""), $serveur) : '';
    104109
    105110                // On utilise la translitteration pour contourner le pb des bases
    106111                // declarees en iso-latin mais remplies d'utf8
    107                 if (($r2 = translitteration($r)) != $r)
     112                if (($r2 = translitteration($r)) != $r) {
    108113                        $r .= ' '.$r2;
     114                }
    109115
    110116                $p = sql_quote(trim("$r"), $serveur);
     
    118124                        $val_where = $val;
    119125                        // Une chaine exacte rapporte plein de points
    120                         if ($pe)
     126                        if ($pe) {
    121127                                $val .= "+ 2 * MATCH($key) AGAINST ($pe)";
     128                        }
    122129
    123130                        // Appliquer les ponderations donnees
     
    133140                        // sa ponderation est eventuellement donnee par la table $liste
    134141                        if ($key == "t.`${name}`"
    135                           AND isset($champs[$name])
    136                           AND $ponderation = $champs[$name])
     142                                and isset($champs[$name])
     143                                and $ponderation = $champs[$name]) {
    137144                                $mult = $ponderation;
     145                        }
    138146
    139147                        // Appliquer le coefficient multiplicatif
    140                         if ($mult != 1)
     148                        if ($mult != 1) {
    141149                                $val = "($val) * $mult";
     150                        }
    142151
    143152                        // si symboles booleens les prendre en compte
     
    155164                if (isset($jointures[$table])) {
    156165                        include_spip('action/editer_liens');
    157                         $trouver_table = charger_fonction('trouver_table','base');
     166                        $trouver_table = charger_fonction('trouver_table', 'base');
    158167                        $cle_depart = id_table_objet($table);
    159                         $table_depart = table_objet($table,$serveur);
    160                         $desc_depart = $trouver_table($table_depart,$serveur);
     168                        $table_depart = table_objet($table, $serveur);
     169                        $desc_depart = $trouver_table($table_depart, $serveur);
    161170                        $depart_associable = false;
    162171                        if ($table != 'article') {
     
    165174                        $i = 0;
    166175                        foreach ($jointures[$table] as $table_liee => $champs) {
    167                                 if ($table_liee!==$table){
    168 
     176                                if ($table_liee !== $table) {
    169177                                        $i++;
    170                                         spip_log($pe,'recherche');
     178                                        spip_log($pe, 'recherche');
    171179                                        if ($mkeys = fulltext_keys($table_liee, 'obj'.$i, $serveur)) {
    172180                                                $_id_join = id_table_objet($table_liee);
    173181                                                $table_join = table_objet($table_liee);
    174182
    175                                                 $subscore = "MATCH(".implode($mkeys,',').") AGAINST ($p".($boolean ? ' IN BOOLEAN MODE':'').")";
     183                                                $subscore = 'MATCH(' . implode($mkeys, ',').") AGAINST ($p".($boolean ? ' IN BOOLEAN MODE':'') . ')';
    176184                                                // on peut definir une fonction de recherche jointe pour regler les cas particuliers
    177                                                 $cle_arrivee =  id_table_objet($table_liee);
    178                                                 $table_arrivee = table_objet($table_liee,$serveur);
    179                                                 $desc_arrivee = $trouver_table($table_arrivee,$serveur);
     185                                                $cle_arrivee = id_table_objet($table_liee);
     186                                                $table_arrivee = table_objet($table_liee, $serveur);
     187                                                $desc_arrivee = $trouver_table($table_arrivee, $serveur);
    180188                                                /**
    181189                                                 * cas simple : $cle_depart dans la table_liee
    182190                                                 *
    183                                                  * Ce cas pourrait exister par exemple si on activait une jointure de recherche sur les articles avec la table spip_evenements du plugin agenda.
    184                                                  * Il suffirait d'ajouter la ligne suivante dans le pipeline "declarer_tables_objets_sql" dans le fichier base/agenda_evenements :
     191                                                 * Ce cas pourrait exister par exemple si on activait une jointure de recherche sur les articles
     192                                                 * avec la table spip_evenements du plugin agenda.
     193                                                 * Il suffirait d'ajouter la ligne suivante dans le pipeline "declarer_tables_objets_sql"
     194                                                 * dans le fichier base/agenda_evenements :
    185195                                                 * $tables['spip_articles']['rechercher_jointures']['evenement'] = array('titre' => 8, 'descriptif' => 5, 'lieu' => 5, 'adresse' => 3);
    186196                                                 *
    187197                                                 */
    188                                                 if (isset($desc_arrivee['field'][$cle_depart])){
     198                                                if (isset($desc_arrivee['field'][$cle_depart])) {
    189199                                                        $join = "
    190200                                                                LEFT JOIN (
     
    195205                                                                ORDER BY score DESC LIMIT 100
    196206                                                                ) AS o$i ON o$i.$cle_depart=t.$cle_depart";
    197                                                         $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     207                                                        $score[] = 'IF(SUM(o' . $i . '.score) IS NULL,0,SUM(o' . $i . '.score))';
    198208                                                        $from .= $join;
    199                                                         $full_text_where[] = "o".$i.".score IS NOT NULL";
    200                                                 }
    201                                                 /**
    202                                                  * cas simple : $cle_arrivee dans la table
    203                                                  *
    204                                                  * Ce cas pourrait exister par exemple si on activait une jointure de recherche sur les évènements (du plugin agenda) avec la table spip_articles.
    205                                                  * Il suffirait d'ajouter la ligne suivante dans le pipeline "declarer_tables_objets_sql" dans le fichier base/agenda_evenements :
    206                                                  * $tables['spip_evenements']['rechercher_jointures']['article'] = array('titre' => 8, 'texte' => 5);
    207                                                  */
    208                                                 elseif (isset($desc_depart['field'][$cle_arrivee])){
     209                                                        $full_text_where[] = 'o' . $i . '.score IS NOT NULL';
     210                                                } elseif (isset($desc_depart['field'][$cle_arrivee])) {
     211                                                        /**
     212                                                         * cas simple : $cle_arrivee dans la table
     213                                                         *
     214                                                         * Ce cas pourrait exister par exemple si on activait une jointure de recherche
     215                                                         * sur les évènements (du plugin agenda) avec la table spip_articles.
     216                                                         * Il suffirait d'ajouter la ligne suivante dans le pipeline "declarer_tables_objets_sql"
     217                                                         * dans le fichier base/agenda_evenements :
     218                                                         * $tables['spip_evenements']['rechercher_jointures']['article'] = array('titre' => 8, 'texte' => 5);
     219                                                         */
    209220                                                        $join = "
    210221                                                                LEFT JOIN (
     
    215226                                                                ORDER BY score DESC LIMIT 100
    216227                                                                ) AS o$i ON o$i.$cle_depart=t.$cle_depart";
    217                                                         $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     228                                                        $score[] = 'IF(SUM(o' . $i . '.score) IS NULL,0,SUM(o' . $i . '.score))';
    218229                                                        $from .= $join;
    219                                                         $full_text_where[] = "o".$i.".score IS NOT NULL";
    220                                                 }
    221                                                 // sinon cherchons une table de liaison
    222                                                 // cas recherche principale article, objet lie document : passer par spip_documents_liens
    223                                                 elseif ($l = objet_associable($table_liee)){
     230                                                        $full_text_where[] = 'o' . $i . '.score IS NOT NULL';
     231                                                } elseif ($l = objet_associable($table_liee)) {
     232                                                        // sinon cherchons une table de liaison
     233                                                        // cas recherche principale article, objet lie document : passer par spip_documents_liens
    224234                                                        list($primary, $table_liens) = $l;
    225235                                                        $join = "
     
    232242                                                                ORDER BY score DESC LIMIT 100
    233243                                                                ) AS o$i ON o$i.id_objet=t.$_id_table";
    234                                                         $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     244                                                        $score[] = 'IF(SUM(o' . $i . '.score) IS NULL,0,SUM(o' . $i . '.score))';
    235245                                                        $from .= $join;
    236                                                         $full_text_where[] = "o".$i.".score IS NOT NULL";
    237                                                 }
    238                                                 // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens
    239                                                 elseif ($l = $depart_associable){
     246                                                        $full_text_where[] = 'o' . $i . '.score IS NOT NULL';
     247                                                } elseif ($l = $depart_associable) {
     248                                                        // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens
    240249                                                        list($primary, $table_liens) = $l;
    241250                                                        $join = "
     
    248257                                                                                ORDER BY score DESC LIMIT 100
    249258                                                                ) AS o$i ON o$i.id_objet=t.$_id_table";
    250                                                         $score[] = "IF(SUM(o".$i.".score) IS NULL,0,SUM(o".$i.".score))";
     259                                                        $score[] = 'IF(SUM(o' . $i . '.score) IS NULL,0,SUM(o' . $i . '.score))';
    251260                                                        $from .= $join;
    252                                                         $full_text_where[] = "o".$i.".score IS NOT NULL";
     261                                                        $full_text_where[] = 'o' . $i . '.score IS NOT NULL';
    253262                                                }
    254263                                        }
     
    257266                }
    258267
    259                 $full_text_where = array("((".implode(") OR (",$full_text_where)."))");
     268                $full_text_where = array('(('.implode(') OR (', $full_text_where).'))');
    260269
    261270                $requete['FROM'][] = $from;
     
    267276                $requete['WHERE'] = $full_text_where;
    268277
    269                 if (defined('_FULLTEXT_WHERE_'.$table))
     278                if (defined('_FULLTEXT_WHERE_'.$table)) {
    270279                        $requete['WHERE'][] = constant('_FULLTEXT_WHERE_'.$table);
    271                 else
    272                         if (!test_espace_prive()
    273                         AND !defined('_RECHERCHE_FULLTEXT_COMPLETE')
    274                         AND in_array($table, array('article', 'rubrique', 'breve', 'forum', 'syndic_article')))
     280                } elseif (!test_espace_prive()
     281                        and !defined('_RECHERCHE_FULLTEXT_COMPLETE')
     282                        and in_array($table, array('article', 'rubrique', 'breve', 'forum', 'syndic_article'))) {
    275283                                $requete['WHERE'][] = "t.statut='publie'";
     284                }
    276285
    277286                // nombre max de resultats renvoyes par l'API
     
    283292                // popularite ?
    284293                if (true # config : "prendre en compte la popularite
    285                 AND $table == 'article')
    286                         $requete['SELECT'][] = "t.popularite";
     294                        and $table == 'article') {
     295                        $requete['SELECT'][] = 't.popularite';
     296                }
    287297
    288298                # "t.date"
     
    291301                #array_unshift($requete['FROM'], table_objet_sql($table)." AS t");
    292302                $requete['GROUPBY'] = array("t.$_id_table");
    293                 $requete['ORDERBY'] = "score DESC";
    294                 $requete['LIMIT'] = "0,"._FULLTEXT_MAX_RESULTS;
     303                $requete['ORDERBY'] = 'score DESC';
     304                $requete['LIMIT'] = '0,'._FULLTEXT_MAX_RESULTS;
    295305                $requete['HAVING'] = '';
    296306
     
    303313
    304314        $s = sql_select(
    305                 $requete['SELECT'], $requete['FROM'], $requete['WHERE'],
    306                 implode(" ",$requete['GROUPBY']),
    307                 $requete['ORDERBY'], $requete['LIMIT'],
    308                 $requete['HAVING'], $serveur
     315                $requete['SELECT'],
     316                $requete['FROM'],
     317                $requete['WHERE'],
     318                implode(' ', $requete['GROUPBY']),
     319                $requete['ORDERBY'],
     320                $requete['LIMIT'],
     321                $requete['HAVING'],
     322                $serveur
    309323        );
    310324
    311         if (!$s) spip_log(mysql_errno().' '.mysql_error()."\n".$recherche, 'recherche');
    312 
    313         while ($t = sql_fetch($s,$serveur)
    314         AND (!isset($t['score']) OR $t['score']>0)) {
     325        if (!$s) {
     326                spip_log(mysql_errno().' '.mysql_error()."\n".$recherche, 'recherche');
     327        }
     328
     329        while ($t = sql_fetch($s, $serveur)
     330                and (!isset($t['score']) or $t['score']>0)) {
    315331                $id = intval($t[$_id_table]);
    316332
     
    320336
    321337                        if (isset($t['popularite'])
    322                         AND $mpop = $GLOBALS['meta']['popularite_max'])
     338                                and $mpop = $GLOBALS['meta']['popularite_max']) {
    323339                                $pts *= (1+$t['popularite']/$mpop);
     340                        }
    324341
    325342                        $r[$id]['score'] = $pts;
    326 
    327343                }
    328344                // fin FULLTEXT
    329345
    330 
    331                 if (!$fulltext OR (defined('_FULLTEXT_FIELD_SCORE') AND _FULLTEXT_FIELD_SCORE)) {
     346                if (!$fulltext or (defined('_FULLTEXT_FIELD_SCORE') and _FULLTEXT_FIELD_SCORE)) {
    332347                        if ($options['toutvoir']
    333                         OR autoriser('voir', $table, $id)) {
     348                                or autoriser('voir', $table, $id)) {
    334349                                // indiquer les champs concernes
    335350                                $champs_vus = array();
     
    339354                                $vu = false;
    340355                                foreach ($champs as $champ => $poids) {
    341                                         $champ = explode('.',$champ);
     356                                        $champ = explode('.', $champ);
    342357                                        $champ = end($champ);
    343                                 // translitteration_rapide uniquement si on est deja en utf-8
    344                                 $value = ($GLOBALS['meta']['charset']=='utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ]));
     358                                        // translitteration_rapide uniquement si on est deja en utf-8
     359                                        $value = ($GLOBALS['meta']['charset']=='utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ]));
    345360                                        if ($n =
    346361                                                ($options['score'] || $options['matches'])
    347                                         ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER)
    348                                         : preg_match($preg, $value)
     362                                                ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER)
     363                                                : preg_match($preg, $value)
    349364                                        ) {
    350365                                                $vu = true;
    351366
    352                                                 if ($options['champs'])
     367                                                if ($options['champs']) {
    353368                                                        $champs_vus[$champ] = $t[$champ];
    354                                                 if ($options['score'])
     369                                                }
     370                                                if ($options['score']) {
    355371                                                        // on pondere le nombre d'occurence par une fonction inverse de la longueur du contenu
    356372                                                        // 1 = 1 occurence pour 200 mots de 8 lettres = 1600 signes
    357373                                                        $score += $n * $poids * sqrt(sqrt(1600/strlen($t[$champ])));
    358                                                 if ($options['matches'])
     374                                                }
     375                                                if ($options['matches']) {
    359376                                                        $matches[$champ] = $regs;
    360 
     377                                                }
    361378                                                if (!$options['champs']
    362                                                 AND !$options['score']
    363                                                 AND !$options['matches'])
     379                                                        and !$options['score']
     380                                                        and !$options['matches']) {
    364381                                                        break;
     382                                                }
    365383                                        }
    366384                                }
     
    368386                                if ($vu) {
    369387                                        $r[$id] = array();
    370                                         if ($champs_vus)
     388                                        if ($champs_vus) {
    371389                                                $r[$id]['champs'] = $champs_vus;
    372                                         if ($score)
     390                                        }
     391                                        if ($score) {
    373392                                                $r[$id]['score'] = ($fulltext?$r[$id]['score']:0)+$score;
    374                                         if ($matches)
     393                                        }
     394                                        if ($matches) {
    375395                                                $r[$id]['matches'] = $matches;
     396                                        }
    376397                                }
    377398                        }
     
    381402        // Gerer les donnees associees
    382403        if (!$fulltext
    383         AND isset($jointures[$table])
    384         AND $joints = recherche_en_base(
     404                and isset($jointures[$table])
     405                and $joints = recherche_en_base(
    385406                        $recherche,
    386407                        $jointures[$table],
     
    389410        ) {
    390411                include_spip('action/editer_liens');
    391                 $trouver_table = charger_fonction('trouver_table','base');
     412                $trouver_table = charger_fonction('trouver_table', 'base');
    392413                $cle_depart = id_table_objet($table);
    393                 $table_depart = table_objet($table,$serveur);
    394                 $desc_depart = $trouver_table($table_depart,$serveur);
     414                $table_depart = table_objet($table, $serveur);
     415                $desc_depart = $trouver_table($table_depart, $serveur);
    395416                $depart_associable = objet_associable($table);
    396417                foreach ($joints as $table_liee => $ids_trouves) {
    397418                        // on peut definir une fonction de recherche jointe pour regler les cas particuliers
    398                         if (
    399                                         !(
    400                                                         $rechercher_joints = charger_fonction("rechercher_joints_${table}_${table_liee}","inc",true)
    401                                                         or $rechercher_joints = charger_fonction("rechercher_joints_objet_${table_liee}","inc",true)
    402                                                         or $rechercher_joints = charger_fonction("rechercher_joints_${table}_objet_lie","inc",true)
    403                         )
    404                         ){
     419                        if (!(
     420                                $rechercher_joints = charger_fonction("rechercher_joints_${table}_${table_liee}", 'inc', true)
     421                                or $rechercher_joints = charger_fonction("rechercher_joints_objet_${table_liee}", 'inc', true)
     422                                or $rechercher_joints = charger_fonction("rechercher_joints_${table}_objet_lie", 'inc', true)
     423                        )) {
    405424                                $cle_arrivee =  id_table_objet($table_liee);
    406                                 $table_arrivee = table_objet($table_liee,$serveur);
    407                                 $desc_arrivee = $trouver_table($table_arrivee,$serveur);
     425                                $table_arrivee = table_objet($table_liee, $serveur);
     426                                $desc_arrivee = $trouver_table($table_arrivee, $serveur);
    408427                                // cas simple : $cle_depart dans la table_liee
    409                                 if (isset($desc_arrivee['field'][$cle_depart])){
    410                                         $s = sql_select("$cle_depart, $cle_arrivee", $desc_arrivee['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur);
    411                                 }
    412                                 // cas simple : $cle_arrivee dans la table
    413                                 elseif (isset($desc_depart['field'][$cle_arrivee])){
    414                                         $s = sql_select("$cle_depart, $cle_arrivee", $desc_depart['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur);
    415                                 }
    416                                 // sinon cherchons une table de liaison
    417                                 // cas recherche principale article, objet lie document : passer par spip_documents_liens
    418                                 elseif ($l = objet_associable($table_liee)){
     428                                if (isset($desc_arrivee['field'][$cle_depart])) {
     429                                        $s = sql_select("$cle_depart, $cle_arrivee", $desc_arrivee['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur);
     430                                } elseif (isset($desc_depart['field'][$cle_arrivee])) {
     431                                        // cas simple : $cle_arrivee dans la table
     432                                        $s = sql_select("$cle_depart, $cle_arrivee", $desc_depart['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur);
     433                                } elseif ($l = objet_associable($table_liee)) {
     434                                        // sinon cherchons une table de liaison
     435                                        // cas recherche principale article, objet lie document : passer par spip_documents_liens
    419436                                        list($primary, $table_liens) = $l;
    420                                         $s = sql_select("id_objet as $cle_depart, $primary as $cle_arrivee", $table_liens, array("objet='$table'",sql_in($primary, array_keys($ids_trouves))), '','','','',$serveur);
    421                                 }
    422                                 // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens
    423                                 elseif ($l = $depart_associable){
     437                                        $s = sql_select("id_objet as $cle_depart, $primary as $cle_arrivee", $table_liens, array("objet='$table'",sql_in($primary, array_keys($ids_trouves))), '', '', '', '', $serveur);
     438                                } elseif ($l = $depart_associable) {
     439                                        // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens
    424440                                        list($primary, $table_liens) = $l;
    425                                         $s = sql_select("$primary as $cle_depart, id_objet as $cle_arrivee", $table_liens, array("objet='$table_liee'",sql_in('id_objet', array_keys($ids_trouves))), '','','','',$serveur);
    426                                 }
    427                                 // cas table de liaison generique spip_xxx_yyy
    428                                 elseif($t=$trouver_table($table_arrivee."_".$table_depart,$serveur)
    429                                                 OR $t=$trouver_table($table_depart."_".$table_arrivee,$serveur)){
    430                                         $s = sql_select("$cle_depart,$cle_arrivee", $t["table_sql"], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur);
    431                                 }
    432                         }
    433                         else
     441                                        $s = sql_select("$primary as $cle_depart, id_objet as $cle_arrivee", $table_liens, array("objet='$table_liee'", sql_in('id_objet', array_keys($ids_trouves))), '', '', '', '', $serveur);
     442                                } elseif ($t = $trouver_table($table_arrivee . '_' . $table_depart, $serveur)
     443                                        or $t=$trouver_table($table_depart . '_' . $table_arrivee, $serveur)) {
     444                                        // cas table de liaison generique spip_xxx_yyy
     445                                        $s = sql_select("$cle_depart,$cle_arrivee", $t['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur);
     446                                }
     447                        } else {
    434448                                list($cle_depart,$cle_arrivee,$s) = $rechercher_joints($table,$table_liee,array_keys($ids_trouves), $serveur);
    435 
    436                         while ($t = is_array($s)?array_shift($s):sql_fetch($s)) {
     449                        }
     450                        while ($t = is_array($s) ? array_shift($s) : sql_fetch($s)) {
    437451                                $id = $t[$cle_depart];
    438452                                $joint = $ids_trouves[$t[$cle_arrivee]];
    439                                 if (!isset($results))
     453                                if (!isset($results)) {
    440454                                        $results = array();
    441                                 if (!isset($results[$id]))
     455                                }
     456                                if (!isset($results[$id])) {
    442457                                        $results[$id] = array();
     458                                }
    443459                                if (isset($joint['score']) and $joint['score']) {
    444460                                        $results[$id]['score'] += $joint['score'];
    445461                                }
    446462                                if (isset($joint['champs']) and $joint['champs']) {
    447                                         foreach($joint['champs'] as $c => $val) {
     463                                        foreach ($joint['champs'] as $c => $val) {
    448464                                                $results[$id]['champs'][$table_liee.'.'.$c] = $val;
    449465                                        }
    450466                                }
    451467                                if (isset($joint['matches']) and $joint['matches']) {
    452                                         foreach($joint['matches'] as $c => $val) {
     468                                        foreach ($joint['matches'] as $c => $val) {
    453469                                                $results[$id]['matches'][$table_liee.'.'.$c] = $val;
    454470                                        }
     
    460476        return $r;
    461477}
    462 
    463 
    464 ?>
  • _plugins_/fulltext/trunk/inc/rechercher.php

    r95441 r97655  
    1212
    1313
    14 if (!defined('_ECRIRE_INC_VERSION')) return;
     14if (!defined('_ECRIRE_INC_VERSION')) {
     15        return;
     16}
    1517
    1618
     
    2527                include_spip('base/objets');
    2628                $tables_objets = lister_tables_objets_sql();
    27                 foreach($tables_objets as $t=>$infos){
    28                         if ($infos['rechercher_champs']){
     29                foreach ($tables_objets as $t => $infos) {
     30                        if ($infos['rechercher_champs']) {
    2931                                $liste[$infos['type']] = $infos['rechercher_champs'];
    3032                        }
     
    4749                include_spip('base/objets');
    4850                $tables_objets = lister_tables_objets_sql();
    49                 foreach($tables_objets as $t=>$infos){
    50                         if ($infos['rechercher_jointures']){
     51                foreach ($tables_objets as $t => $infos) {
     52                        if ($infos['rechercher_jointures']) {
    5153                                $liste[$infos['type']] = $infos['rechercher_jointures'];
    5254                        }
     
    5961
    6062
    61 function fulltext_keys($table, $prefix=null, $serveur=null) {
    62         if ($s = sql_query("SHOW CREATE TABLE ".table_objet_sql($table), $serveur)
    63         AND $t = sql_fetch($s)
    64         AND $create = array_pop($t)
    65         AND preg_match_all('/,\s*FULLTEXT\sKEY.*`(.*)`\s+[(](.*)[)]/i', $create, $keys, PREG_SET_ORDER)) {
     63function fulltext_keys($table, $prefix = null, $serveur = null) {
     64        if ($s = sql_query('SHOW CREATE TABLE ' . table_objet_sql($table), $serveur)
     65        and $t = sql_fetch($s)
     66        and $create = array_pop($t)
     67        and preg_match_all('/,\s*FULLTEXT\sKEY.*`(.*)`\s+[(](.*)[)]/i', $create, $keys, PREG_SET_ORDER)) {
    6668                $cles = array();
    6769                foreach ($keys as $key) {
    6870                        $cle = $key[2];
    69                         if ($prefix)
     71                        if ($prefix) {
    7072                                $cle = preg_replace(',`.*`,U', $prefix.'.$0', $cle);
     73                        }
    7174                        $cles[$key[1]] = $cle;
    7275                }
    73                 spip_log("fulltext $table: ".join(', ',array_keys($cles)),'recherche');
     76                spip_log("fulltext $table: ".join(', ', array_keys($cles)), 'recherche');
    7477                return $cles;
    7578        }
     
    8285        static $expression = array();
    8386        $key = serialize(array($recherche, $options['preg_flags']));
    84         if (isset($expression[$key]))
     87        if (isset($expression[$key])) {
    8588                return $expression[$key];
     89        }
    8690
    8791        $u = $GLOBALS['meta']['pcre_u'];
    88         if ($u AND strpos($options['preg_flags'],$u)===false)
     92        if ($u and strpos($options['preg_flags'], $u) === false) {
    8993                $options['preg_flags'] .= $u;
     94        }
    9095        include_spip('inc/charsets');
    9196        $recherche = trim($recherche);
    9297
    9398        // retirer les + de +truc et les * de truc*
    94         $recherche = preg_replace(",(^|\s)\+(\w),Uims","$1$2",$recherche);
    95         $recherche = preg_replace(",(\w)\*($|\s),Uims","$1$2",$recherche);
     99        $recherche = preg_replace(',(^|\s)\+(\w),Uims', "$1$2", $recherche);
     100        $recherche = preg_replace(',(\w)\*($|\s),Uims', "$1$2", $recherche);
    96101
    97102        $is_preg = false;
    98         if (substr($recherche,0,1)=='/' AND substr($recherche,-1,1)=='/') {
     103        if (substr($recherche, 0, 1) == '/' and substr($recherche, -1, 1) == '/') {
    99104                // c'est une preg
    100105                $recherche_trans = translitteration($recherche);
     
    105110                // sauf ceux de moins de 4 lettres (on supprime ainsi 'le', 'les', 'un',
    106111                // 'une', 'des' ...)
    107                 if (preg_match(",\s+,".$u, $recherche)) {
     112                if (preg_match(',\s+,'. $u, $recherche)) {
    108113                        $is_preg = true;
    109114                        $recherche_inter = '|';
     
    115120                                }
    116121                        }
    117                         // mais on cherche quand même l'expression complète, même si elle
     122                        // mais on cherche quand meme l'expression complete, meme si elle
    118123                        // comporte des mots de moins de quatre lettres
    119124                        $recherche = rtrim($recherche.preg_replace(',\s+,'.$u, '|', $recherche_inter), '|');
     
    127132        // ou si l'expression reguliere est invalide
    128133        if (!$is_preg
    129         OR (@preg_match($preg,'')===FALSE) ) {
     134        or (@preg_match($preg, '') === false) ) {
    130135                $methode = 'LIKE';
    131136                $u = $GLOBALS['meta']['pcre_u'];
    132                 // eviter les parentheses et autres caractères qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses
     137                // eviter les parentheses et autres caractres qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses
    133138                $recherche = str_replace(
    134139                        array('(',')','?','[', ']', '+', '*', '/'),
    135140                        array('\(','\)','[?]', '\[', '\]', '\+', '\*', '\/'),
    136                         $recherche);
     141                        $recherche
     142                );
    137143                $recherche_trans = translitteration($recherche);
    138144                $recherche_mod = $recherche_trans;
    139                
     145
    140146                // echapper les % et _
    141147                $q = str_replace(array('%','_'), array('\%', '\_'), trim($recherche));
    142148                // les expressions entre " " sont un mot a chercher tel quel
    143149                // -> on remplace les espaces par un _ et on enleve les guillemets
    144                 if (preg_match(',["][^"]+["],Uims',$q,$matches)){
    145                         foreach($matches as $match){
     150                if (preg_match(',["][^"]+["],Uims', $q, $matches)) {
     151                        foreach ($matches as $match) {
    146152                                // corriger le like dans le $q
    147                                 $word = preg_replace(",\s+,Uims","_",$match);
    148                                 $word = trim($word,'"');
    149                                 $q = str_replace($match,$word,$q);
     153                                $word = preg_replace(',\s+,Uims', '_', $match);
     154                                $word = trim($word, '"');
     155                                $q = str_replace($match, $word, $q);
    150156                                // corriger la regexp
    151                                 $word = preg_replace(",\s+,Uims","[\s]",$match);
    152                                 $word = trim($word,'"');
    153                                 $recherche_mod = str_replace($match,$word,$recherche_mod);
     157                                $word = preg_replace(',\s+,Uims', '[\s]', $match);
     158                                $word = trim($word, '"');
     159                                $recherche_mod = str_replace($match, $word, $recherche_mod);
    154160                        }
    155161                }
    156162                $q = sql_quote(
    157                         "%"
    158                         . preg_replace(",\s+,".$u, "%", $q)
    159                         . "%"
     163                        '%'
     164                        . preg_replace(',\s+,' . $u, '%', $q)
     165                        . '%'
    160166                );
    161167
    162                 $preg = '/'.preg_replace(",\s+,".$u, ".+", trim($recherche_mod)).'/' . $options['preg_flags'];
    163 
     168                $preg = '/'.preg_replace(',\s+,' . $u, '.+', trim($recherche_mod)).'/' . $options['preg_flags'];
    164169        } else {
    165170                $methode = 'REGEXP';
     
    170175        // permet de matcher en SQL meme si on est sensible aux accents (SQLite)
    171176        $q_t = $q;
    172         for($i = 0;$i<spip_strlen($q);$i++){
    173                 $char = spip_substr($q,$i,1);
     177        for ($i = 0; $i < spip_strlen($q); $i++) {
     178                $char = spip_substr($q, $i, 1);
    174179                if (!is_ascii($char)
    175                   AND $char_t = translitteration($char)
    176                   AND $char_t !== $char){
    177                         $q_t = str_replace($char,$is_preg?".":"_", $q_t);
     180                        and $char_t = translitteration($char)
     181                        and $char_t !== $char) {
     182                        $q_t = str_replace($char, $is_preg ? '.' : '_', $q_t);
    178183                }
    179184        }
     
    184189        // les plus frequents qui peuvent etre accentues
    185190        // (oui c'est tres dicustable...)
    186         if (isset($GLOBALS['connexions'][$options['serveur']?$options['serveur']:0]['type'])
    187           AND strncmp($GLOBALS['connexions'][$options['serveur']?$options['serveur']:0]['type'],'sqlite',6)==0){
    188                 $q_t = strtr($q,"aeuioc",$is_preg?"......":"______");
     191        if (isset($GLOBALS['connexions'][$options['serveur'] ? $options['serveur'] : 0]['type'])
     192                and strncmp($GLOBALS['connexions'][$options['serveur'] ? $options['serveur'] : 0]['type'], 'sqlite', 6) == 0) {
     193                $q_t = strtr($q, 'aeuioc', $is_preg ? '......' : '______');
    189194                // si il reste au moins un char significatif...
    190                 if (preg_match(",[^'%_.],",$q_t))
     195                if (preg_match(",[^'%_.],", $q_t)) {
    191196                        $q = $q_t;
     197                }
    192198        }
    193199
     
    204210// On peut passer les tables, ou une chaine listant les tables souhaitees
    205211// http://doc.spip.org/@recherche_en_base
    206 function recherche_en_base($recherche='', $tables=NULL, $options=array(), $serveur='') {
     212function recherche_en_base($recherche = '', $tables = null, $options = array(), $serveur = '') {
    207213        include_spip('base/abstract_sql');
    208214
     
    211217
    212218                if (is_string($tables)
    213                 AND $tables != '') {
     219                        and $tables != '') {
    214220                        $toutes = array();
    215                         foreach(explode(',', $tables) as $t)
    216                                 if (isset($liste[$t]))
     221                        foreach (explode(',', $tables) as $t) {
     222                                if (isset($liste[$t])) {
    217223                                        $toutes[$t] = $liste[$t];
     224                                }
     225                        }
    218226                        $tables = $toutes;
    219227                        unset($toutes);
    220                 } else
     228                } else {
    221229                        $tables = $liste;
    222         }
    223 
    224         if (!strlen($recherche) OR !count($tables))
     230                }
     231        }
     232
     233        if (!strlen($recherche) or !count($tables)) {
    225234                return array();
     235        }
    226236
    227237        include_spip('inc/autoriser');
    228238
    229239        // options par defaut
    230         $options = array_merge(array(
    231                 'preg_flags' => 'UimsS',
    232                 'toutvoir' => false,
    233                 'champs' => false,
    234                 'score' => false,
    235                 'matches' => false,
    236                 'jointures' => false,
    237                 'serveur' => $serveur
     240        $options = array_merge(
     241                array(
     242                        'preg_flags' => 'UimsS',
     243                        'toutvoir' => false,
     244                        'champs' => false,
     245                        'score' => false,
     246                        'matches' => false,
     247                        'jointures' => false,
     248                        'serveur' => $serveur
    238249                ),
    239250                $options
     
    244255        // Utiliser l'iterateur (DATA:recherche)
    245256        // pour recuperer les couples (id_objet, score)
    246         // Le resultat est au format { 
     257        // Le resultat est au format {
    247258        //      id1 = { 'score' => x, attrs => { } },
    248259        //      id2 = { 'score' => x, attrs => { } },
    249260        // }
    250        
     261
    251262        include_spip('inc/memoization');
    252263        include_spip('inc/recherche_to_array');
     
    254265        foreach ($tables as $table => $champs) {
    255266                # lock via memoization, si dispo
    256                 if (function_exists('cache_lock'))
     267                if (function_exists('cache_lock')) {
    257268                        cache_lock($lock = 'fulltext '.$table.' '.$recherche);
     269                }
    258270
    259271                spip_timer('rech');
     
    267279
    268280
    269                 spip_log("recherche $table ($recherche) : ".count($results[$table])." resultats ".spip_timer('rech'),'recherche');
    270 
    271                 if (isset($lock))
     281                spip_log("recherche $table ($recherche) : " . count($results[$table]) . ' resultats ' . spip_timer('rech'), 'recherche');
     282
     283                if (isset($lock)) {
    272284                        cache_unlock($lock);
     285                }
    273286        }
    274287
     
    279292// Effectue une recherche sur toutes les tables de la base de donnees
    280293// http://doc.spip.org/@remplace_en_base
    281 function remplace_en_base($recherche='', $remplace=NULL, $tables=NULL, $options=array()) {
     294function remplace_en_base($recherche = '', $remplace = null, $tables = null, $options = array()) {
    282295        include_spip('inc/modifier');
    283296
    284297        // options par defaut
    285         $options = array_merge(array(
    286                 'preg_flags' => 'UimsS',
    287                 'toutmodifier' => false
     298        $options = array_merge(
     299                array(
     300                        'preg_flags' => 'UimsS',
     301                        'toutmodifier' => false
    288302                ),
    289303                $options
     
    292306
    293307
    294         if (!is_array($tables))
     308        if (!is_array($tables)) {
    295309                $tables = liste_des_champs();
     310        }
    296311
    297312        $results = recherche_en_base($recherche, $tables, $options);
     
    303318                foreach ($r as $id => $x) {
    304319                        if ($options['toutmodifier']
    305                         OR autoriser('modifier', $table, $id)) {
     320                        or autoriser('modifier', $table, $id)) {
    306321                                $modifs = array();
    307322                                foreach ($x['champs'] as $key => $val) {
    308                                         if ($key == $_id_table) next;
     323                                        if ($key == $_id_table) {
     324                                                next;
     325                                        }
    309326                                        $repl = preg_replace($preg, $remplace, $val);
    310                                         if ($repl <> $val)
     327                                        if ($repl <> $val) {
    311328                                                $modifs[$key] = $repl;
     329                                        }
    312330                                }
    313                                 if ($modifs)
    314                                         objet_modifier_champs($table, $id,
     331                                if ($modifs) {
     332                                        objet_modifier_champs(
     333                                                $table,
     334                                                $id,
    315335                                                array(
    316336                                                        'champs' => array_keys($modifs),
    317337                                                ),
    318                                                 $modifs);
    319                         }
    320                 }
    321         }
    322 }
    323 
    324 ?>
     338                                                $modifs
     339                                        );
     340                                }
     341                        }
     342                }
     343        }
     344}
Note: See TracChangeset for help on using the changeset viewer.