PHP, Ligne de commande, MySQL – Utiliser des scripts php en ligne de commande


Utiliser du PHP en ligne de commande peut présenter un intérêt si vous avez besoin d’un langage de scripting plus sophistiqué que le bash shell qui reste forcément assez limité. Vous faites d’un certaine façon d’une pierre deux coups dans la mesure où tous les script PHP que vous développez et votre pratique du PHP sont disponibles plus seulement dans une simple page web via un navigateur. Le recours à PHP permet d’étendre considérablement les possibilités qui vous sont offertes dans des taches ardus si elles étaient à concevoir avec à votre disposition du bash shell uniquement.

Prenons un cas concret qui consiste à effectuer la migration de contenu d’une Base De Données (BDD) de type MySQL d’un site géré grâce à un CMS inconnu vers la BDD d’un site sous WordPress.

Déterminer la localisation et la version de PHP

On va procéder à cette opération en local sous MAMP, qui contient en se connectant à la fois via la console au client MySQL et en exécutant nos scripts PHP dans un autre onglet de la console.

Les commandes ci-dessous permettent de déterminer le shebang au début du script de sorte que cela indique au système que ce fichier doit être interprété comme du PHP.

Les différentes commandes nécessaires à déterminer la version l’emplacement de php

which php
whereis php
type -a php
php -v

Voilà donc ce qu’il faudra placer à l’en-tête de votre script

	#!/usr/bin/php

Lancer le script en ligne de commande

Ensuite, il reste à rendre exécutable votre fichier PHP par la commande suivante nom_du_fichier_contenant_votre_script.php.

chmod +x /le/chemin/vers/votre/fichier/nom_du_fichier_contenant_votre_script.php

Vous n’aurez plus qu’ensuite à lancer votre script de la manière suivante :

/le/chemin/vers/votre/fichier/nom_du_fichier_contenant_votre_script.php

Se connecter à une BDD sous MAMP

Vous pouvez vous connecter au client MySQL de MAMP à l’aide de la commande suivante :
/Applications/MAMP/Library/bin/mysql -u root -p
Pour tester votre requête, vous pourrez passer directement votre requête dans la client MySQL, cela est toujours utile avant de la lancer votre script en ligne de commande.

Le contenu PHP du script nom_du_fichier_contenant_votre_script.php

	#!/usr/bin/php
	<?php 
 
	echo "nnnnnn";
		echo "--- LAUNCH ---";
	echo "nnnnnn";
 
			$username = "root";
			/* Sous MAMP le pwd est root */
			$password = "root";
			/* C'est le moyen de se connceter en mode à la base de données en mode php Cli */
			$hostname = ":/Applications/MAMP/tmp/mysql/mysql.sock"; 
 
 
			//connection to the database
			$dbhandle = mysql_connect($hostname, $username, $password)
			  or die("Unable to connect to MySQL");
			// echo "Connected to MySQL";
				// echo "nn";
 
			//select a database to work with
			$selected = mysql_select_db("db_source",$dbhandle)
			  or die("Could not select db_source");
 
			//execute the SQL query and return records
 
 
 
			$result = mysql_query(" SELECT * FROM posts WHERE user_id = 101 AND status = 'publish' "); // FROM TCMES
			$post_author = '3'; // The id for coming for the wp_users
			$db_name = 'db_destination';
			$file = '/le/chemin/vers/votre/fichier/dump_sql_vers_wordpress.sql';
 
			while ($row = mysql_fetch_array($result)) {
				/* VALUES */
				$output = "";
				$output .= "
				INSERT INTO ".$db_name.".wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count) VALUES";
				/* ID */
				$output .=  "('".trim($row{'id'})."', ";
				/* post_author */
				$output .=  "'".trim($post_author)."',";
				/* post_date */
				$output .=  "'".trim($row{'created_at'})."',";
				/* post_date_gmt */
				$output .=  "'".trim($row{'created_at'})."',";
				/* post_content */
				$output .=  "'".addslashes(trim($row{'body'}))."',";
				/* post_title */
				$output .=  "'".addslashes(trim($row{'title'}))."',";
				/* post_excerpt */
				$output .=  "'',";
				/* post_status */
				$output .=  "'publish',";
				/* comment_status */
				$output .=  "'open',";
				/* ping_status */
				$output .=  "'open',";
				/* post_password */
				$output .=  "'',";
				/* post_name (slug) */
				$output .=  "'".trim($row{'nicetitle'})."',";
				/* to_ping */
				$output .=  "'',";
				/* pinged */
				$output .=  "'',";
				/* post_modified */
				$output .=  "'".trim($row{'updated_at'})."',";
				/* post_modified_gmt */
				$output .=  "'".trim($row{'updated_at'})."',";
				/* post_content_filtered */
				$output .=  "'',";
				/* post_parent */
				$output .=  "'0',"; 
				/* guid */
				$output .=  "'',";
				/* menu_order */
				$output .=  "'0',";
				/* post_type */
				$output .=  "'post',";
				/* post_mime_type */
				$output .=  "'',";
				/* comment_count */
				$output .=  "'".trim($row{'total_comments'})."'";
				/* END */
				$output .=  ");";
				$output .=  "n";
 
 
				/* INJECT */
				$handle = fopen($file, 'a'); 
				fwrite($handle, $output );
				fclose($handle);
				/* // INJECT */
			}
			echo "nnnnnn";
			echo "--- DONE ---";
			echo "nnnnnn";
 
	?>

La structure de la table MySQL “source” inclus dans la BDD

 
	CREATE TABLE `posts` (
	  `id` INT(11) NOT NULL AUTO_INCREMENT,
	  `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
	  `updated_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
	  `title` VARCHAR(255) NOT NULL DEFAULT '',
	  `nicetitle` VARCHAR(255) NOT NULL DEFAULT '',
	  `body` text NOT NULL,
	  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
	  `user_id` INT(11) NOT NULL DEFAULT '0',
	  `status` VARCHAR(11) NOT NULL DEFAULT '0',
	  `last_comment_date` datetime DEFAULT NULL,
	  `total_comments` INT(11) DEFAULT '0',
	  `blocked` tinyint(1) DEFAULT '0',
	  `unique_id` VARCHAR(255) DEFAULT NULL,
	  `imported_feed_id` INT(11) DEFAULT NULL,
	  PRIMARY KEY (`id`),
	  UNIQUE KEY `unique_id` (`unique_id`),
	  UNIQUE KEY `unique_id_2` (`unique_id`),
	  KEY `nicetitle` (`nicetitle`),
	  KEY `user_id` (`user_id`),
	  KEY `date` (`date`),
	  KEY `status` (`status`),
	  FULLTEXT KEY `searching` (`title`,`body`)
	) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

En savoir plus