Étiquette : base de données

[PHP] Modifier une chaîne de caractères sur tout un serveur de BDD

Nous sommes en 2017 et ce script est dépassé (bien que toujours fonctionnel). Utilisez maintenant mysqli ou PDO, ou bien l’excellent outil clé en main Search Replace DB de Interconnecit.

Il y a quelques temps, ma société à complètement revu l’adressage IP du réseau.

J’ai donc rencontré des soucis avec tous mes sites WordPress et Prestashop, qui stockent l’URL dans la base de données.

Voici donc un petit script PHP/MySQL qui va modifier dans chaque table de chaque base une chaîne de caractères.

Il s’agit d’un script sans messages d’erreurs et non commenté, mais cela ne pose pas vraiment de soucis car il est directement exécutable : changez simplement les données en constantes (« define »).

Je vous suggère vivement de conserver la connexion, certes obsolète, avec mysql_connect au cas où vous avez des base de données en mysql simple (avec mysqli_connect, celles-ci ne seront pas prises en compte).

 

define('_DB_HOST_', 'localhost');
define('_DB_USER_', 'root');
define('_DB_PASS_', '');
define('_OLD_IP_', '192.168.200.155');
define('_NEW_IP_', '172.16.200.155');

$connect = mysql_connect(_DB_HOST_, _DB_USER_, _DB_PASS_);

$databases =  mysql_query("SHOW databases");
while($database = mysql_fetch_object($databases)) {
	mysql_select_db($database->Database, $connect);
	$tables = mysql_query("SHOW tables");
	if(mysql_num_rows($tables) > 0) {
		while($table = mysql_fetch_object($tables)) {
			$fieldName = 'Tables_in_'.$database->Database;
			$tableName = $table->$fieldName;
			$columns = mysql_query("SHOW columns FROM ".$tableName);
			if(mysql_num_rows($columns) > 0) {
				while($column = mysql_fetch_object($columns)) {
				    $fields = mysql_query("UPDATE ".$tableName." SET ".$column->Field." = REPLACE(".$column->Field.", '"._OLD_IP_."', '"._NEW_IP_."')");
					if(mysql_affected_rows() > 0) {
						echo '<p>Modification dans '.$database->Database.' » '.$tableName.' » '. $column->Field.'</p>';
					}
				}
			}
		}
	}
}

 

Vous pouvez bien sûr adapter le script à une seule base de données par exemple, en créant l’objet $database avec vos données et en supprimant le « while » associé.

 

Changer de base de données dans un module

Il y a peu, j’ai du développer un site qui récupérait des infos dans une autre base de données sous Joomla!. J’ai longtemps cherché comment indiquer à Joomla! les nouvelles informations de connexion, jusqu’à trouver le fameux Graal, que voici :

$option = array();
$option['driver']   = 'mysql'; 
$option['host']     = $alt_host;
$option['user']     = $alt_user;
$option['password'] = $alt_password;
$option['database'] = $alt_databse;
$option['prefix']   = $alt_prefix;

$db = & JDatabase::getInstance($option);

Je vous conseille fortement l’utilisation de variables comme dans l’exemple ci-dessus, ou de constantes si vous ne savez pas comment les utiliser.

Ceci vous permettra de stocker ces informations dans le fichier configuration natif de Joomla!.

Cette astuce est valable sur la version 2.5 de Joomla!, et sauf preuve du contraire sur la version 3 qui est sortie récemment.