From cf714fee44037f03f6c0898a4fbaa8f8c34bd809 Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Tue, 8 Apr 2008 21:22:59 +0000 Subject: [PATCH] savoir parler a mysql dans le cas ou il faut le charger dynamiquement (code pompe de phpMyAdmin, qui reussit mieux que SPIP a trouver mysql quand l'extension n'est pas chargee) --- ecrire/inc/install.php | 41 ++++++++++++++++++++-------- ecrire/req/mysql.php | 61 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/ecrire/inc/install.php b/ecrire/inc/install.php index 8b6d39f3ab..b0ec709d57 100644 --- a/ecrire/inc/install.php +++ b/ecrire/inc/install.php @@ -86,17 +86,24 @@ function tester_compatibilite_hebergement() { $err[] = _T('install_php_version', array('version' => $p, 'minimum' => $m)); } - if (!function_exists('mysql_query')) + // Il faut une base de donnees tout de meme ... + if (!function_exists('mysql_query') + AND !function_exists('pg_connect') + AND !function_exists('sqlite_open')) $err[] = _T('install_extension_php_obligatoire') - . " <a href='http://se.php.net/mysql'>MYSQL</a>"; + . " <a href='http://www.php.net/mysql'>MYSQL</a>" + . "| <a href='http://www.php.net/pgsql'>PostgreSQL</a>" + . "| <a href='http://www.php.net/sqlite'>SQLite</a>"; + // et il faut preg if (!function_exists('preg_match_all')) $err[] = _T('install_extension_php_obligatoire') . " <a href='http://se.php.net/pcre'>PCRE</a>"; + // et surtout pas ce mbstring.overload if ($a = @ini_get('mbstring.func_overload')) $err[] = _T('install_extension_mbstring') - . "mbstring.func_overload=$a - <a href='http://se.php.net/mb_string'>mb_string</a>.<br /><small>"; + . "mbstring.func_overload=$a - <a href='http://www.php.net/mb_string'>mb_string</a>.<br /><small>"; if ($err) { echo "<p class='verdana1 spip_large'><b>"._T('avis_attention').'</b></p><p>'._T('install_echec_annonce')."</p><ul>"; @@ -235,21 +242,33 @@ function fieldset($legend, $champs = array(), $horchamps='') { function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape) { $pg = function_exists('pg_connect'); - $mysql = function_exists('mysql_connect'); + + // demander les version dispo de mysql + if (include_spip('req/mysql')) { + $versions = spip_versions_mysql(); + $mysql = !!$versions; + } + // demander les version dispo de sqlite - include_spip('req/sqlite_generique'); - $versions = spip_versions_sqlite(); - $sqlite2 = in_array(2, $versions); - $sqlite3 = in_array(3, $versions); + if (include_spip('req/sqlite_generique')) { + $versions = spip_versions_sqlite(); + $sqlite2 = in_array(2, $versions); + $sqlite3 = in_array(3, $versions); + } - // cacher le formlaire s'il n' a qu'un serveur - // ou si l'installation est predefinie avec un serveur particulier + // ne pas cacher le formulaire s'il n'a qu'un serveur : + // ca permet de se rendre compte de ce qu'on fait ! +/* if (($pg + $mysql + $sqlite2 + $sqlite3) == 1){ if ($mysql) $server_db = 'mysql'; if ($pg) $server_db = 'pg'; if ($sqlite2) $server_db = 'sqlite2'; if ($sqlite3) $server_db = 'sqlite3'; - } elseif ($predef[0]) { + } else +*/ + + // le cacher si l'installation est predefinie avec un serveur particulier + if ($predef[0]) { $server_db = _INSTALL_SERVER_DB; } diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php index 3a7b80997d..9a3d133045 100644 --- a/ecrire/req/mysql.php +++ b/ecrire/req/mysql.php @@ -16,6 +16,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // http://doc.spip.org/@base_db_mysql_dist function req_mysql_dist($host, $port, $login, $pass, $db='', $prefixe='', $ldap='') { + load_extension('mysql'); if ($port > 0) $host = "$host:$port"; $link = mysql_connect($host, $login, $pass, true); @@ -699,4 +700,64 @@ function spip_release_lock($nom) { @mysql_query("SELECT RELEASE_LOCK(" . _q($nom) . ")"); } +// Renvoie false si on n'a pas les fonctions mysql (pour l'install) +// http://doc.spip.org/@spip_versions_mysql +function spip_versions_mysql() { + load_extension('mysql'); + return function_exists('mysql_query'); +} + +// Une fonction pour charger dynamiquement mysql.so, +// adaptee de phpMyAdmin ; c'est mieux si on n'en a pas besoin... +// http://doc.spip.org/@load_extension +function load_extension($module) { + if (extension_loaded($module)) { + return true; + } + + // A-t-on le droit de faire un dl() ; si on peut, on memorise la reponse, + // lourde a calculer, dans les meta + if (!isset($GLOBALS['meta']['dl_allowed'])) { + if (!@ini_get('safe_mode') + && @ini_get('enable_dl') + && @function_exists('dl')) { + ob_start(); + phpinfo(INFO_GENERAL); /* Only general info */ + $a = strip_tags(ob_get_contents()); + ob_end_clean(); + if (preg_match('@Thread Safety[[:space:]]*enabled@', $a)) { + if (preg_match('@Server API[[:space:]]*\(CGI\|CLI\)@', $a)) { + $GLOBALS['meta']['dl_allowed'] = true; + } else { + $GLOBALS['meta']['dl_allowed'] = false; + } + } else { + $GLOBALS['meta']['dl_allowed'] = true; + } + } else { + $GLOBALS['meta']['dl_allowed'] = false; + } + + // Attention, a l'installation le ecrire_meta() echouera ; + // d'ou cette ecriture un peu bizarre. + include_spip('inc/meta'); + ecrire_meta('dl_allowed', $GLOBALS['meta']['dl_allowed'], 'non'); + } + + if (!$GLOBALS['meta']['dl_allowed']) { + return false; + } + + /* Once we require PHP >= 4.3, we might use PHP_SHLIB_SUFFIX here */ + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $module_file = 'php_' . $module . '.dll'; + } elseif (PHP_OS=='HP-UX') { + $module_file = $module . '.sl'; + } else { + $module_file = $module . '.so'; + } + + return @dl($module_file); +} + ?> -- GitLab