Posts filed under 'PHP'

Présentation PHP/MySQL pour Toulibre

Voici les fichiers de ma présentation PHP/MySQL
Télécharger : 7zip - Bzip2 - Zip

Le site de toulibre -> http://www.toulibre.org/

Add comment June 10th, 2007

Nouvelle version de phpSerial

Vous pourrez trouver la nouvelle version de phpSerial, ma classe pour lire/écrire sur le port série depuis linux ou windows (sauf que windows gère pas la lecture) en PHP sur le site PHP Classes.

8 comments June 1st, 2007

Valeur d’une exprssion en PHP

Leçon du jour : les expressions et leurs valeurs en PHP. Commençons par les conditions:

PHP:
  1. <?php
  2. // Roulette russe
  3. if (rand(1,6) == 3) {
  4.     print ("Tu est mort !");
  5. }
  6. ?>

Le principe est simple, dans un if (<expression>), l'expression est évaluée et si il s'avère être équivalente à true alors la condition est validée. En PHP, tout (à l'exception des opérateurs) a pour but de retourner une valeur : une fonction retournera une valeur, ou une variable retournera une valeur (sans parler des valeurs elles mêmes...). Donc la première chose que fait PHP (ce n'est pas tout à fait exact, mais on reviendra sur ce point plus tard) dans l'évaluation de ces expressions, c'est de chercher les valeurs. Dans l'exemple précédent, on admettra que rand(1,6) retourne la valeur 3. Le if de l'exemple ressemble donc maintenant pour le moteur PHP à

PHP:
  1. if (3 == 3) {

Maintenant intervienne les opérateurs : l'opérateur == demande la comparaison des valeurs qui lui sont à sa droite et à sa gauche pour savoir si elles sont équivalentes (c'est à dire que si les deux valeurs ne sont pas du même type elles sont converties dans le même type puis comparées), et si c'est effectivement le cas il retournera le true que le if attend pour considérer que la condition soit vraie.

Mais les opérateurs de comparaison ne sont pas les seuls opérateurs existants. À commencer par les parenthèses : si une expression se trouve entre parenthèses, alors elle est d'abord évaluée puis sa valeur est retournée. Par exemple on peut avoir (on suppose toujours que rand(1,6) retourne la valeur 3):

PHP:
  1. <?php
  2. // Roulette russe
  3. if (($num = rand(1,6)) == (1+2)) {
  4.     print ("Tu est mort !");
  5. }
  6. else {
  7.     print ("T'as du bol d'être tombé sur le numéro " . $num);
  8. }
  9. ?>

Ici encore on se retrouvera avec un

PHP:
  1. if (3 == 3) {

Viennent ensuite les opérateurs logiques, et ce sont eux qui me font mentir sur la première partie : les opérateurs logiques (and, or, xor, not, ils sont détaillés dans le manuel) interviennent dans l'ordre des opérations. En effet, si deux expressions sont de part et d'autre d'un or, par définition il suffit que l'une seule d'entre elles soit vérifiée pour que la condition soit vraie. Donc si la première expression retourne une valeur équivalente à true, PHP n'a pas besoin d'évaluer la seconde puique la condition est validée. En revance pour and et xor les deux expressions sont évaluées puisque PHP a besoin de connaître les deux valeurs.

Vous devez maintenant penser que ces système de valeurs ne marchent que dans des conditions ou autre structures de contrôle (elseif, while, for, etc). Eh bien pas du tout : ça marche n'importe où dans le code. De cette manière on peut avoir quelquechose qui ressemble à

PHP:
  1. <?php
  2. $a = ($b = 3);
  3.  
  4. // Affiche 3
  5. echo $a;
  6. ?>

(il faut avouer que ceci ne sert à rien), on peut aussi faire (plus utile cette fois)

PHP:
  1. <?php
  2. /*
  3. * Ici on regarde les valeurs d'un formulaire qui peut être
  4. * envoyé soit par POST soit par GET
  5. */
  6. $actif = ($_POST["actif"] or $_GET["actif"]);
  7. ?>

ou encore (là c'est réélement utile)

PHP:
  1. <?
  2. /*
  3. * Dans cet exemple, la fonction maFonction() est une fonction quelconque
  4. * qui retourne <i>true</i> ou <i>false</i> selon qu'elle réussisse ou non.
  5. */
  6.  
  7. // Par la méthode classique
  8. if (!maFonction()) {
  9.     trigger_error("Erreur lors de l'éxecution de ma fonction !", E_USER_WARNING);
  10. }
  11.  
  12. // Et en utilisant or
  13. maFonction() or trigger_error("Erreur lors de l'éxecution de ma fonction !", E_USER_WARNING);
  14. ?>

Petite explication sur ce dernier : PHP évalue d'abord maFonction(), qui retourne soit true soit false. Si maFonction() retourne true alors PHP n'a pas besoin d'évaluer ce qui se trouve après le or, en revanche si maFonction() retoure false PHP doit évaluer la 2ème expression.

Et tant qu'on est sur les valeurs, on pourra signaler que l'on peut forcer le type d'une valeur lors d'un assignement en spécifiant simplement le type entre parenthèses juste après l'opérateur d'assignation. Par exemple :

PHP:
  1. <?php
  2. /* On récupère l'âge depuis un formulaire, mais il est
  3. * de type string, or on le veut de type int.
  4. */
  5. $age = (int) $_POST["age"];
  6. ?>

Je concluerai sur une dernière précision à propos de la sécurité : faites très attention à utiliser l'opérateur d'égalité (===) le plus possible au profit de l'opérateur d'équivalence (==) qui entraîne la conversion des types, ce qui peut mener à des abérations de logique ou des failles de sécurité (par exemple une faille de phpBB utilisait la conversion implicite des types pour devenir administrateur en modifiant simplement son identifiant de session...)

Voici donc un petit tour des valeurs en PHP, en espérant avoir été assez clair...

Add comment March 3rd, 2007

Nomination PHP Classes

 

 

Allez... #1 et #2, on y croit :)
[réponse le 1 avril normalement... non c'est pas une blague]

EDIT : ça y est c'est fini. Je suis 2eme pour PHP Serial et dernier pour la classe de contrôle de l'afficheur (avec 0 votes ^^")
Content :)

Add comment March 1st, 2007

Listing de fichiers

Sait-on jamais, ça pourrai servir... Deux petites fonctions pour lister un répertoire, ou lister un répertoire récursivement

PHP:
  1. function ls($dir, $with_prefix = false) {
  2.     if (substr($dir, -1) !== "/") $dir .= "/";
  3.  
  4.     unset($dirs);   $dirs  = array();
  5.     unset($files)$files = array();
  6.  
  7.     if (@is_readable($dir) and @is_dir($dir)) {
  8.         if ($dh = opendir($dir)) {
  9.             while (($file = readdir($dh)) !== false) {
  10.                 if (@is_readable($dir.$file)) {
  11.                     if (is_dir($dir.$file)) $dirs[] = ($with_prefix) ? $dir.$file : $file;
  12.                     else $files[] = ($with_prefix) ? $dir.$file : $file;
  13.                 }
  14.             }
  15.             closedir($dh);
  16.         }
  17.     }
  18.     else return false;
  19.    
  20.     unset($dirs[0]);
  21.     unset($dirs[1]);
  22.    
  23.     return array($dirs, $files);
  24. }
  25.  
  26. function recursive_ls ($dir, $with_prefix = false) {
  27.     if (substr($dir, -1) !== "/") $dir .= "/";
  28.    
  29.     if (($map_elements = ls ($dir, false)) !== false) {
  30.         unset ($map); $map = array();
  31.        
  32.         if (!empty($map_elements[0])) {
  33.             foreach ($map_elements[0] as $dirname) {
  34.                 $map[($with_prefix) ? $dir.$dirname : $dirname] = recursive_ls($dir.$dirname, $with_prefix);
  35.             }
  36.         }
  37.        
  38.         if ($with_prefix and !empty($map_elements[1])) {
  39.             foreach ($map_elements[1] as $id => $value) {
  40.                 $map_elements[1][$id] = $dir . $value;
  41.             }
  42.         }
  43.        
  44.         return array_merge ($map, array_flip ($map_elements[1]));
  45.     }
  46.    
  47.     return false;
  48. }

Add comment January 27th, 2007

Classe Ping

Voici une classe PHP capable d'effectuer un ping sous Windows et sous Linux. Requiert Pear (n'importe quelle version devrait faire l'affaire). (attention: je n'ai pas testé cette classe très largement, il se peut qu'il faille l'adapter à votre système)

Télécharger la classe

Add comment January 10th, 2007

Afficheur de caisse Citizen C2202

J'ai récupéré un afficheur de caisse Citizen C2202, que j'ai programmé pour pouvoir afficher une fortune, lire mes mails et pinger mes serveur. En gros ça sert à rien, mais en tout cas c'était marrant à programmer ^^. Voici donc le code écrit à l'occasion (vous pourrez constater une classe de contrôle du port série), qui ne fonctionne que sous linux (ou peut être certains unix, mais j'ai pas testé).

Télécharger les fichiers

Vous remarquerez que la classe de contrôle de l'afficheur hérite de la classe de contrôle du port série, donc ne comptez pas utiliser l'une sans l'autre. Toutes les fonctions de l'afficheur ne sont pas implémentées (pour la simple raison que j'ai rien compris à certaines), et je ne converti pas non plus le charset vers quelquechose que l'afficheur pourrait comprendre (trop la flemme pour ça).

Et voici la documentation que le constructeur m'a fourni : Citizen C2202-PDUME

2 comments January 9th, 2007

Next Posts


Calendar

November 2008
M T W T F S S
« Oct    
 12
3456789
10111213141516
17181920212223
24252627282930

Posts by Month

Posts by Category