Catégorie : Programmation.

Lancer une commande shell depuis PHP

Icone d'un terminal, shell.

Dans ce tutoriel nous allons voir comment exécuter une commande via le Shell à partir de PHP. Une petite recherche google vous démontrera que cette question intéresse pas mal de monde. Pourtant il existe une fonction PHP qui fait cela très bien : shell_exec.

Attention à ne pas faire n’importe quoi avec cette fonction ! Il est très important que vous relisiez vos script avant de les exécuter sous peine d’endommager votre système même si de mon expérience, j’ai constaté que les commandes les commandes qui requièrent les droits root ne sont pas exécutées.

Désactiver le safe_mode.

Pour les versions de PHP antérieures à PHP 5.3.0, il faut que le safe_mode soit désactivé. Cherchez dans votre php.ini (/etc/php5/apache2/php.ini pour Ubuntu) la ligne où il y safe_mode ou ajouter-la si elle n’existe pas.

safe_mode = Off

Redémarrez votre serveur Apache /etc/init.d/apche2 restart en tant que root et ce devrait être fonctionnel. Depuis PHP 5.3.0, cette fonctionnalité est obsolète.

Lancer une ou plusieurs commandes avec ou sans sortie.

Lancer une simple commande :

shell_exec("touch example.txt");

Si votre commande implique une sortie :

print shell_exec("ls example/");

ou encore mieux :

print "<pre>".shell_exec("ls example/")."</pre>";

Il est possible d’exécuter plusieurs commandes à la fois avec && ou en allant à la ligne :

print "<pre>".shell_exec("echo 'Test 1' > example1.txt && chmod 777 example1.txt")."</pre>";

print "<pre>".shell_exec("echo 'Test 1' > example1.txt > \n chmod 777 example1.txt")."</pre>";

print "<pre>".shell_exec("echo 'Test 1' > example1.txt >
chmod 777 example1.txt")."</pre>";

Lancer un script contenu dans un fichier.

Pour exécuter un script contenu dans un fichier, utilisez file_get_contents. Cette fonction permet de récupérer le contenu d’un fichier.

print "<pre>".shell_exec(file_get_contents("script.sh"))."</pre>";

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

Source : Documentation PHP.

PHP : Fonction pour lister le contenu d’un dossier.

Icône dossier

Voici une ch’tite fonction PHP pour lister le contenu de vos dossiers, ça sert toujours d’avoir ce genre de fonction sous la main. La fonction renvoie un tableau des éléments contenu dans le dossier.

Paramètres

$dir

C’est le chemin PHP du fichier. Attention donc au répertoire courant si vous faites des inclusion (fonction include ou require).

$prefix

Par défaut il est à false. S’il est à true. Le chemin du dossier ($dir) sera placé avant le nom du fichier ou du sous-répertoire.

$type

Définit le type de fichier à afficher :

  • Si $only == false, tous les fichiers et dossiers seront listés.
  • Si $only == "file", seuls les fichiers seront listés.
  • Si $only == "dir", seuls les dossiers seront listés.

Le code

function list_dir($dir, $prefix = false, $type = false) {
  $list = array();
  //On supprime le slash final.
  $dir = preg_replace("#(.+)(\/{1})$#isUu", "$1", $dir);
  if (is_dir($dir)) {
    if ($od = opendir($dir)) {
      while (($file = readdir($od)) !== false) {
        if ($file != ".." and $file != ".") {
          /*
          On ne tient pas compte de  .. et .
          qui sont le répertoire courant et le repertoire mère.
          */
          if (is_dir("$dir/$file") and $file != "file") {
            // Si c'est un dossier et que l'on affiche les dossiers.
            $list[] = ($prefix ? "$dir/": "").$file;
          }
          else if (is_file("$dir/$file") and $type != "dir") {
            // Si c'est un fichier et que l'on affiche les fichiers.
            $list[] = ($prefix ? "$dir/": "").$file;
          }
        }
      }
      closedir($od);
    }
  }
  return $list;
}

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

PHP : Transformer un tableau en objet.

Illustration : Tableau vers Objet

Pour une raison qui ne regarde que vous, si vous avez besoin de changer un tableau en objet voici une fonction PHP qui pourrait vous y aider. Je sais que certains préfèrent manier des objets en lieu et place des tableaux mais attention à ne pas en faire trop car il ne s’agirait pas d’alourdir votre code et son traitement juste pour une histoire de syntaxe…

function array_to_object($array) {
  $object = new stdClass;
  foreach($array as $key => $value) {
   if(is_array($value)) {
     // Si c'est un tableau multidimensionnel, on appelle de nouveau la fonction.
     $object->$key = array_to_object($value);
   } else {
     $object->$key = $value;
   }
  }
  return $object;
}

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

Date en français avec PHP sous Ubuntu

Un autre article tiré de feu blog.web-petit.com

Les dates en français pour un site en français ou multilingue, c’est essentiel. Et en PHP sous Ubuntu ce n’est pas très compliqué avec la fonction PHP strftime.

Dans la console :

sudo apt-get install language-pack-fr-base

Et au début de votre script PHP :

setlocale(LC_TIME, "fr_FR.UTF-8");

Pour une autre langue comme le finnois (oui pourquoi le finnois ? et pouquoi pas ? :-D ) remplacer fr par fi.

Pour savoir comment utiliser strftime allez à l’article correspondant dans la documentation PHP. Voilà vos belles dates sont en français.

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

Anonymous Pro : une police pour développeur.

Une police spéciale développeur ? Oui ça existe et c’est une création de Mark Simonson. C’est un designer et sur son site on peut acheter des fontes mais celle-ci, en l’occurrence la police Anonymous Pro est sous licence SIL Open Font License et elle est gratuitement téléchargeable sur son site.

Pour ma part, c’est toujours un peu déroutant de faire face à une nouvelle police (non non il ne s’agit pas des forces de l’ordre ;-) ). J’ai l’habitude de la bonne vieille monospace mais à première vue Anonymous Pro m’est agréable. Après les goûts et les couleurs ça ne se discute pas. Phrase bateau mais que voulez-vous ? Je n’ai pas trouvé mieux.

Outre le côté jolitude « joliesse » il est à noter que Mark Simonson a fait en sorte que pour les caractères qui se ressemblent dans certaines polices ce ne soit pas le cas dans la fonte « Anonymous Pro » comme les 0, O,o,l ou encore 1.

J’ai appliqué cette police sur le module syntaxhighlighter du site. Donc si vous l’avez installé, elle s’affichera sur les bouts de codes publiés dans les articles du site.

Je vous laisse admirer une ch’tite capture d’écran du fichier index.php du thème WordPresss du site. Tout ça sous Gedit avec le thème que j’utilise : Oblivion.

Anonymous Pro

Connexion à MySQL avec PDO

Pour ceux qui comme moi pensent que la Programmation Orientée Objet est l’avenir du genre humain indispensable en programmation et notamment en PHP, voici un article sur comment se connecter à MySQL avec PDO.

PDO peut être utilisé en lieu et place des fonctions MySQL de PHP (mysql_connect, mysql_ query, etc…) mais aussi à la place de MySQLI. PDO contrairement à ces deux-là n’est pas exclusif à MySQL et vous permettra de vous adapter plus facilement à un autre type de SGBD

D’abord il faut savoir savoir que PDO signifie PHP Data Objects et comme vous l’aurez deviné puisqu’il s’agit de MySQL, cela sert à établir une connexion à une base de données et à interagir avec elle. PDO est une extension PHP et la classe utilisée se nomme PDO. Je sais trop compliqué comme nom. ;-)

On peut se connecter à plusieurs types de SGBD comme Microsoft SQL Server (blasphème je sais :-) ), Oracle, PostGreSQL…. Et surtout celui qui nous intéresse : MySQL.

Connexion à la base de données

$host = "localhost";
$dsn = "mysql:host=".$host.";dbname=".$nom_base_de_donnees;
$user = "user";
$pass = "password";
$connection = new PDO($dsn, $user, $pass);
// Si la base de données est en UTF-8.
$this->exec("SET NAMES 'utf8'");

Méthode query : récupérer des données.

$query = $connection->query("SELECT id, name FROM users");
// En renseignant PDO::FETCH_OBJ, les données récupérées seront retournées dans un objet.
while ($user = $query->fetch(PDO::FETCH_OBJ)) {
  echo "L'utilisateur n°".$user->id." s'appelle ".$user->name;
}

Méthode exec : exécuter une requête SQL.

$connection->exec("INSERT INTO users (id, name) VALUES (45, 'toto45')");
$connection->exec("DELETE FROM users WHERE id = 1");

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !