Carnet Wiki

MultiBase

Version 3 — Décembre 2006 — lns-bzn-49f-81-56-166-2

Déclarer une table SPIP ou non SPIP d’un autre serveur MYSQL

[Erreur...3][Erreur...4][Erreur...5]qui va ramener le nombre d’entrées de la table CATALOGUE du server « site-pas-mal-non-plus ».

[Erreur...7][Erreur...8][Erreur...9]Ce fichier sera lu à l’exécution de la première boucle référençant ce serveur, et ne sera plus lu par la suite ; on peut donc y placer l’ouverture de la connexion.

Si le site annexe est sous un Spip de même numéro de version, cela doit suffire car la description des tables dans le inc_serialbase du serveur principal servira à interroger celles du serveur distant.

En revanche, si l’on veut en plus accéder à des tables spécifiques, il faut les ajouter à la globale $tables_principales, par exemple comme je le disais tout à l’heure ainsi :

$spip_title = array(
        "id"        => "bigint(21) NOT NULL",
        "title"        => "text NOT NULL"
);
$spip_title_key = array(
        "PRIMARY KEY"                => "id"
);
$GLOBALS['tables_principales']['title']= array('field' => &$spip_title, 'key' => &$spip_title_key);

[Erreur...13]Ce qui ne marche pas encore :

— -

[Erreur...16]Bonne expérimentation à tous,

Déclarer une table d’une autre base MySQL

(Phil.Martin@inrialpes.fr)

-  J’ai sur le même serveur MySQL une autre base appelée « basilic ».

[Erreur...21][Erreur...22][Erreur...23]- Créer le fichier /ecrire/inc_connect-basilic.php3 :

<?php
if (defined("_ECRIRE_INC_CONNECT_BASILIC")) return;
define("_ECRIRE_INC_CONNECT_BASILIC", "1");

@mysql_connect('mon_serveur','','mon_login','mon_mot_de_passe');
@mysql_select_db("basilic");

function spip_basilic_fetch($res, $serveur) {
 return spip_fetch_array ($res, $serveur);
}

function spip_basilic_count($res, $serveur) {
 return spip_num_rows ($res, $serveur);
}

[Erreur...28][Erreur...29]- Le fichier ##inc-compilo-api.php3## nécessite une modification (pour la version du 9 Mai 2005) :

[Erreur...31]{{{Déclarer une table d’une autre base MySQL SPIP 1.9}}}

Il y a un bug dans la version stable de la 1.9 il faut appliquer le correctif disponible ici : [->http://trac.rezo.net/trac/spip/changeset/6834]

[Erreur...34]                                           
$mabase_matable = array (
                                                        "numero" => "INT(11) NOT NULL",
                                                        "prenom" => "CHAR(20)",
                                                        "nom" => "CHAR(20)"
                                                        );                                                       
$mabase_matable_key = array (
                                                        "PRIMARY KEY" => "numero"
                                                        );
$tables_des_serveurs_sql['mabase']['matable'] = array('field' => &$mabase_matable, 'key' => &$mabase_matable_key);

Créer inc_connect-mabase.php dans le dossier ecrire

<?php
if (defined("_ECRIRE_INC_CONNECT_mabase")) return;
define("_ECRIRE_INC_CONNECT_mabase", "1");

@mysql_connect('localhost','login','password');
@mysql_select_db("mabase");


function spip_mabase_fetch($res) {
 return spip_fetch_array($res);
}

function spip_mabase_count($res) {
 return spip_num_rows($res);
}

function spip_mabase_free($res) {
 return spip_free_result($res);
}

function spip_mabase_select($select, $from, $where,
                  $groupby, $orderby, $limit,
                  $sousrequete, $having,
                  $table, $id, $serveur) {
 return spip_mysql_select ($select, $from, $where,
                  $groupby, $orderby, $limit,
                  $sousrequete, $having,
                  $table, $id, $serveur);
}
?>

Example de boucles possibles après ça :

<BOUCLE_example(mabase:MATABLE){numero>50}
#NUMERO #PRENOM #NOM
</BOUCLE_example>

Multi serveur

Depuis la SVN7259, la connexion à plusieurs serveurs est clarifiée. On contrôle exactement comment on lance la requête. Il faut ajouter au fameux fichier ecrire/inc_connect-mabase.php les fonctions base_mabase et spip_query_mabase comme suit :

<?php
  if (defined("_ECRIRE_INC_CONNECT_MABASE")) return;
define("_ECRIRE_INC_CONNECT_MABASE", "1");

global $spip_mabase_link, $spip_mabase_db;	// pour connexions multiples

[Erreur...46][Erreur...47]// http://doc.spip.org/@spip_query_db
function spip_query_mabase($query) {

	$query = traite_query($query);

	$start = ($GLOBALS['mysql_profile'] AND (($GLOBALS['connect_statut'] == '0minirezo') OR ($GLOBALS['auteur_session']['statut'] == '0minirezo'))) ? microtime() : 0;

	return spip_mysql_trace($query, 
				$start,
		  mysql_query($query, $GLOBALS['spip_mabase_link']));
}

// http://doc.spip.org/@spip_abstract_select
function spip_mabase_select($select, $from, $where,
                  $groupby, $orderby, $limit,
                  $sousrequete, $having,
                  $table, $id, $serveur) {

[Erreur...53]	     return $res;

}

// http://doc.spip.org/@spip_abstract_fetch
function spip_mabase_fetch($res) {
  return spip_fetch_array($res);
}

[Erreur...57]// http://doc.spip.org/@spip_abstract_free
function spip_mabase_free($res) {
  return spip_free_result($res);
}

[Erreur...59]// http://doc.spip.org/@spip_abstract_showtable
function spip_mabase_showtable($res) {
  return spip_mysql_showtable($res);
}

?>

[Erreur...62][Erreur...63]