sql_alter

La fonction sql_alter() permet d’envoyer une requête de type ALTER au serveur de base de données pour modifier la structure de la base.

La fonction a 3 paramètres :

  1. $q est la requête (sans le terme "ALTER") a effectuer
  2. $serveur,
  3. $option

Note : Cette fonction prenant directement une requête au format SQL, il est prudent de bien respecter les standards SQL. Il est possible que pour des prochaines versions de SPIP, le paramètre $q accepte un tableau plus structuré en entrée pour faciliter les différents portages.

La fonction s’utilise comme suit :

sql_alter("TABLE table ADD COLUMN colonne INT");
sql_alter("TABLE table ADD colonne INT"); // COLUMN est optionnel
sql_alter("TABLE table CHANGE colonne colonne INT DEFAUT '0'");
sql_alter("TABLE table ADD INDEX colonne (colonne)");
sql_alter("TABLE table DROP INDEX colonne");
sql_alter("TABLE table DROP COLUMN colonne");
sql_alter("TABLE table DROP colonne"); // COLUMN est optionnel
sql_alter("TABLE spip_tradlang RENAME spip_tradlangs");
// possibilite de passer plusieurs actions, mais attention aux portages :
sql_alter("TABLE table DROP colonneA, DROP colonneB");

La fonction sql_alter() sert particulièrement lors de la phase de mise à jour de plugins dans les fonctions {nom}_upgrade() des différents plugins.

Exemple

Ajouter une colonne « composition » sur la table spip_articles (plugin « Composition ») :

sql_alter("TABLE spip_articles ADD composition varchar(255) DEFAULT '' NOT NULL");

Ajouter une colonne « css » sur la table « spip_menus » (plugin « Menus ») :

sql_alter("TABLE spip_menus ADD COLUMN css tinytext DEFAULT '' NOT NULL");

Le plugin « TradRub » dans sa procédure d’installation ajoute une colonne « id_trad » sur la table spip_rubriques en utilisant la fonction maj_tables() prévue, puis ajoute un index sur cette même colonne avec sql_alter() :

function tradrub_upgrade($nom_meta_base_version, $version_cible){
    $current_version = 0.0;

    if ( (!isset($GLOBALS['meta'][$nom_meta_base_version]) )
        || (($current_version = $GLOBALS['meta'][$nom_meta_base_version]) != $version_cible))
    {
        include_spip('base/tradrub');
        if ($current_version==0.0){
            include_spip('base/create');
            maj_tables('spip_rubriques');
            // index sur le nouveau champ
            sql_alter("TABLE spip_rubriques ADD INDEX (id_trad)");
            ecrire_meta($nom_meta_base_version, $current_version=$version_cible, 'non');
        }  
    }
}

Auteur Matthieu Marcillaud Publié le : Mis à jour : 20/02/12

Traductions : English, français