Trucs et astuces
   PHP & MySQL
Toute cette puissance au bout des doigts
       Montréal, Québec, Canada
Agenda
 Trucs et astuces PHP et MySQL

 Issus des distributions

 Rien de spécial

 Encore valide en PHP 4 (mais passez en...
Questions?
Qui parle?

  Damien Séguy

    PHP Québec, AFUP

    Expert PHP et MySQL :
    sécurité, audit

    Auteur des documentat...
Au hasard
rand() et mt_rand()

array_rand() : extrait des lignes d'un tableau

 Extrait les clés!

shuffle() : mélange un j...
Au hasard
                               Array
<?php                          (
$a = range('a','d');               [0]   =...
Tableaux SQL?

 Array_unique : DISTINCT

 array_count_values : GROUP BY

  Bien plus rapide que la précédente
Tableaux SQL?
 <?php
 $array = array("1", "MySQL", 1, "PHP", "PHP");
 $array = array_count_values($array);
 asort($array);...
Tableaux SQL
                                      Array
                                      (
      array_multisort() :...
Étranges tris?

  Est ce que ça cloche?
 mysql> SELECT id, ordre FROM table
        ORDER BY ordre ASC;
 +----+-----------...
Étranges tris
 mysql> CREATE TABLE `test` (
        `id` tinyint unsigned,
        `ordre` enum(‘premier’,’deuxième’,
    ...
Variables MySQL
Disponibles depuis la pré-histoire

Gérée au niveau des connexions

 Détruites à la déconnexion

 Pas de c...
Variables MySQL
<?php
$requete = "SELECT sum(nombre) FROM statsPHP";
$res = mysqli_query($mid, $requete);
$ligne = mysqli_...
Sécurité SQL
<?php
$requete = "SELECT droits FROM utilisateurs 
            WHERE login = '".
    mysqli_real_escape_strin...
Classements
mysql> SET @rank := 0;
mysql> SELECT @rank := @rank + 1 AS rank,
       country, php FROM statsPHP ORDER BY ph...
Ex-aequo
mysql> SET @num := 0, @rank := 0, @prev := NULL;
mysql> SELECT @num := @num + 1 AS row,
  @rank := if(@prev != ph...
Variables en masse
    Compact() et extract()
<?php
$requete = "SELECT *  FROM table 
            WHERE login = @login";
$...
PHP est dynamique

  Variables variables
  <?php
    $x = 'y';
    $y = 'z';
    $z = 'a';

    echo $x;  // affiche y
   ...
constantes variables

    Une seule définition

    Accès dynamique à une valeur constante

<?php
  define ("CONSTANTE", 'P...
Fonctions variables
<?php
 $fonc = 'foo'; $foo = 'bar'; $classe = 'bb';

 $fonc($foo);            // vaut foo('bar');
 cal...
Variables en masse
    Compact() et extract()

<?php 
 $x = 'a'; $y = 'b'; 
 $z = compact('x','y');   
// $z = array('x'=>...
Toute cette dynamite..
 Métamoteur

   Gabarits

 Gestion de structures dynamiques

   SOAP

 Personnalisation de biblioth...
Magie de l'objet

  __autoload() : Juste à temps
  <?php
  // php.ini auto_prepend
  function __autoload($classe) {
     i...
Magie de l'objet
           __toString() :

            transforme un objet en chaîne

            toArray(), __toInteger(...
Magie de l'objet
      __sleep() et __wakeup()

          Stocke un objet en session

          Avant serialize()

class d...
Buffer de sortie
 Intercepte le contenu

   Evite le bogue 'already sent'

   Nettoyez : tidy
                      <?php
...
Caches simples

  auto_prepend :

    if ( filemtime( CACHE )+3600 < time()) {
        include($cachefile);     exit;
    ...
Connexions HTTP

 PHP Enregistre l'état de la connexion

   0 Normal; 1 Annulé; 2 expiré

 ignore_user_abort() évite les i...
Register_shutdown

  Semblable au __destruct()

  Fonction exécutée à l'extinction du script

  Fermeture des ressources

...
Variables
 var_export : Crée le code pour une variable

 Pratique pour les tableaux de configuration

      Optimise ces ta...
Assertions
 tests dans les scripts

 assertion sont gérées par directive

  Par défaut, activé

  Facile à supprimer echo/...
Assertions

<?php 
  assert_options(ASSERT_CALLBACK,'assert_callback');
  function carre_naturel($x) {
   assert('is_integ...
Assertions

<?php

   function assert_callback($script,$line, $message){
    echo 'Un problème est survenu dans le script
...
Déboguage
phpinfo()

get_defined_funcs()

 get_extension_funcs()

get_defined_classes()
                     <?php
         ...
Débogage

get_defined_vars()

get_included_files()

__FILE__, __LINE__

__FUNCTION__, __CLASS__, __METHOD__
Débogage             array(2) {
                     [0]=>
                     array(4) {
                         ["file...
Listes rapides

 scandir(‘/tmp’, true);

   Permet le tri sur les noms

   Remplace opendir(), readdir(), closedir() et
  ...
Listes rapides
Array
(
    [0]   =>   sess_um8rgjj10f6qvuck91rf36srj7
    [1]   =>   sess_u58rgul68305uqfe48ic467276
    [...
URL


parse_url() : Détaille une URL

parse_string() : Découpe les paramètres

http_build_query() : Reconstruit une URL
URL
                                Array
                                (
                                     [scheme] ...
URL
<?php
   get_headers('http://localhost/logo.png', false);
?>
     Array
     (
         [0] => HTTP/1.1 200 OK
       ...
Cette conférence


  http://www.nexen.net/conferences.php
Tableaux

   array_combine :
   combine deux tableaux en un seul
<?php
$a = array('vert', 'rouge', 'jaune');
$b = array('a...
Trucs et astuces PHP et MySQL
Upcoming SlideShare
Loading in...5
×

Trucs et astuces PHP et MySQL

9,234

Published on

Un voyage dans les fonctions moins connues de PHP et MySQL, avec un souci de résoudre des problèmes courants et communs.

Published in: Technology
1 Comment
7 Likes
Statistics
Notes
  • thanq its really nice and useful to me in thinking about invention comes along with think of that.... really nice function.... tanq for this.....
    Sharika
    http://financeadded.com http://traveltreble.com
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
9,234
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
274
Comments
1
Likes
7
Embeds 0
No embeds

No notes for slide

Trucs et astuces PHP et MySQL

  1. 1. Trucs et astuces PHP & MySQL Toute cette puissance au bout des doigts Montréal, Québec, Canada
  2. 2. Agenda Trucs et astuces PHP et MySQL Issus des distributions Rien de spécial Encore valide en PHP 4 (mais passez en 5!) Le mois de la fonction PHP
  3. 3. Questions?
  4. 4. Qui parle? Damien Séguy PHP Québec, AFUP Expert PHP et MySQL : sécurité, audit Auteur des documentations rédacteur en chef http://www.nexen.net/
  5. 5. Au hasard rand() et mt_rand() array_rand() : extrait des lignes d'un tableau Extrait les clés! shuffle() : mélange un jeu de cartes str_shuffle : Mélange une chaîne
  6. 6. Au hasard Array <?php ( $a = range('a','d'); [0] => c shuffle($a); [1] => d [2] => b print_r($a); [3] => a ) print_r(array_rand($a,3)); Array ( print str_shuffle('abcdef'); [0] => 0 // eabdcf [1] => 1 ?> [2] => 3 )
  7. 7. Tableaux SQL? Array_unique : DISTINCT array_count_values : GROUP BY Bien plus rapide que la précédente
  8. 8. Tableaux SQL? <?php $array = array("1", "MySQL", 1, "PHP", "PHP"); $array = array_count_values($array); asort($array); print_r($array); ?> Array sort r u ( [1] => 2 [PHP] => 2 ksort kr uk [MySQL] => 1 ) asort ar ua
  9. 9. Tableaux SQL Array ( array_multisort() : tri sur [0] => 2 plusieurs tableaux en même [1] => 3 temps [2] => 4 [3] => 5 Fonctionne comme ORDER BY ) Array <?php ( $ar1 = array(5,4,3,2); [0] => d $ar2 = array('a','b','c','d'); [1] => c array_multisort($ar1, $ar2); [2] => b array_multisort($ar1, SORT_ASC, SORT_INT, [3] => a $ar2); ) ?>
  10. 10. Étranges tris? Est ce que ça cloche? mysql> SELECT id, ordre FROM table ORDER BY ordre ASC; +----+------------+ | id | ordre | +----+------------+ | 1 | premier | | 2 | deuxième | | 3 | troisième | | 4 | quatrième | +----+------------+
  11. 11. Étranges tris mysql> CREATE TABLE `test` ( `id` tinyint unsigned, `ordre` enum(‘premier’,’deuxième’, ’troisième’,’quatrième’), ) ENGINE=MYISAM; Enum est une chaîne et un nombre Utilisé en interne comme entier Affiché par défaut comme une chaîne
  12. 12. Variables MySQL Disponibles depuis la pré-histoire Gérée au niveau des connexions Détruites à la déconnexion Pas de concurrence Stockage local de scalaires Permet de se passer de PHP
  13. 13. Variables MySQL <?php $requete = "SELECT sum(nombre) FROM statsPHP"; $res = mysqli_query($mid, $requete); $ligne = mysqli_fetch_row($res); mysqli_free_result($res); $requete = "UPDATE statsPHP  SET pourcentage = nombre / ".$ligne." * 100;"; mysqli_query($mid, $requete); ?> mysql> SELECT @total := sum(nombre) FROM statsPHP ; mysql> UPDATE statsPHP SET pourcentage = nombre / @total * 100;
  14. 14. Sécurité SQL <?php $requete = "SELECT droits FROM utilisateurs  WHERE login = '". mysqli_real_escape_string($mid, $_POST["login"])."'"; $res = mysqli_query($mid, $requete); $droits = mysqli_fetch_row($res); ?> <?php $requete = "SET @login :=  '".mysqli_real_escape_string($mid, $_POST["login"])."'"; $res = mysqli_query($mid, $requete); $requete = "SELECT droits FROM utilisateurs WHERE login = @login"; $res = mysqli_query($mid, $requete); $droits = mysqli_fetch_row($res); ?>
  15. 15. Classements mysql> SET @rank := 0; mysql> SELECT @rank := @rank + 1 AS rank, country, php FROM statsPHP ORDER BY php; +------+---------------+-----+ | rank | country | php | +------+---------------+-----+ | 1| F. Polynesia | 67 | | 2| Turk&Caicos | 55 | | 3| France | 41 | | 4| USA | 31 | | 5| Canada | 31 | | 7| Greenland | 17 | | 8| Israel | 17 | +------+---------------+-----+ 8 rows in set (0.00 sec)
  16. 16. Ex-aequo mysql> SET @num := 0, @rank := 0, @prev := NULL; mysql> SELECT @num := @num + 1 AS row, @rank := if(@prev != php, @num, @rank) AS rank, country, @prev := php AS php FROM statsPHP ORDER BY php; +------+------+---------------+-----+ | row | rank | country | php | +------+------+---------------+-----+ | 1| 1| Polynésie Fr. | 67 | | 2| 2| Turk & Caicos | 55 | | 3| 3| France | 41 | | 4| 4| USA | 31 | | 5| 4| Canada | 31 | | 6| 6| Groënland | 17 | | 7| 6| Israel | 17 | +------+------+---------------+-----+
  17. 17. Variables en masse Compact() et extract() <?php $requete = "SELECT *  FROM table  WHERE login = @login"; $res = mysqli_query($mid, $requete); $resultat = mysqli_fetch_row($res); extract($resultat); // $colonne1 = 'valeur'; $colonne2 = 'valeur' extract($_GET); // ne l'utilisez pas import_request_variables(); // non plus ?>
  18. 18. PHP est dynamique Variables variables <?php $x = 'y'; $y = 'z'; $z = 'a'; echo $x;  // affiche y echo $$x;  // affiche z echo $$$x; // affiche a ?>
  19. 19. constantes variables Une seule définition Accès dynamique à une valeur constante <?php   define ("CONSTANTE", 'PHP Québec');   echo CONSTANTE;   echo constant("CONSTANTE");  print_r(get_defined_constants()); ?>
  20. 20. Fonctions variables <?php  $fonc = 'foo'; $foo = 'bar'; $classe = 'bb';  $fonc($foo);  // vaut foo('bar'); call_user_func($fonc, $foo);// idem  call_user_func(array($classe, $fonc), $foo);  // $bb->fonc('bar'); // bb::fonc('bar'); $classe->$fonc($foo); // idem ?>
  21. 21. Variables en masse Compact() et extract() <?php   $x = 'a'; $y = 'b';   $z = compact('x','y');    // $z = array('x'=> 'a', 'y' => 'b');  $r = call_user_func_array('fonc', $z);  // vaut fonc($x, $y) ou fonc('a', 'b'); extract($r);  // $x = 'c'; $y = 'd'; $t = 'e'; list($x, $y, $t) = array_values($r); ?>
  22. 22. Toute cette dynamite.. Métamoteur Gabarits Gestion de structures dynamiques SOAP Personnalisation de bibliothèques
  23. 23. Magie de l'objet __autoload() : Juste à temps <?php // php.ini auto_prepend function __autoload($classe) {    include 'classes/' . $classe . '.php'; } $objet  = new MaClasse(); $objet2 = new MaClasse2(); ?>
  24. 24. Magie de l'objet __toString() : transforme un objet en chaîne toArray(), __toInteger()? <?php class db {   function __toString() {    return "La connexion à ".$this->hote." est ". (is_null($this->mid ? 'active' : 'inactive' ).""; } } $db = new db(); PHP Catchable fatal error: Object of class mysqli echo $db; could not be converted to string ?>
  25. 25. Magie de l'objet __sleep() et __wakeup() Stocke un objet en session Avant serialize() class db { // .....  function __sleep() {   unset($this->mid); }  function __wakeup() {   $this->mid = new mysqli("host", "user", "secret", "base"); } // ..... }
  26. 26. Buffer de sortie Intercepte le contenu Evite le bogue 'already sent' Nettoyez : tidy <?php ob_start("ob_gzhandler"); Compressez : gz echo "Hello "; setcookie("c", "v"); Cachez : ce sein que ob_end_flush(); ?>
  27. 27. Caches simples auto_prepend : if ( filemtime( CACHE )+3600 < time()) {     include($cachefile);     exit; } ob_start(); auto_append :   $content = ob_get_contents();    file_put_contents(CACHE, $contents);   ob_end_flush();
  28. 28. Connexions HTTP PHP Enregistre l'état de la connexion 0 Normal; 1 Annulé; 2 expiré ignore_user_abort() évite les interruptions connexion_status() surveille l'état
  29. 29. Register_shutdown Semblable au __destruct() Fonction exécutée à l'extinction du script Fermeture des ressources Plus pratique que ignore_user_abort pour une bibliothèque
  30. 30. Variables var_export : Crée le code pour une variable Pratique pour les tableaux de configuration Optimise ces tableaux <?php array ( 0 => 5, $array = array(5,4,3,2); 1 => 4, 2 => 3, print var_export($array, true); 3 => 2, ) ?>
  31. 31. Assertions tests dans les scripts assertion sont gérées par directive Par défaut, activé Facile à supprimer echo/var_dump Développement par contrat
  32. 32. Assertions <?php  assert_options(ASSERT_CALLBACK,'assert_callback'); function carre_naturel($x) {    assert('is_integer( $x );' );    assert('$x < 0');    assert('$x > sqrt(PHP_INT_MAX)   //* $x doit être plus petit' );   return $x * $x; } ?>
  33. 33. Assertions <?php function assert_callback($script,$line, $message){     echo 'Un problème est survenu dans le script   <b>', $script,'</b>, à la ligne <b>', $line, '</b> : <br />' . $message; exit; } ?>
  34. 34. Déboguage phpinfo() get_defined_funcs() get_extension_funcs() get_defined_classes() <?php Reflection::export( get_object_vars() new ReflectionClass('Exception')); ?> Class [ <internal> class Exception ] { get_class_var() - Constants [0] {} - Static properties [0] { } - Static methods [0] { }
  35. 35. Débogage get_defined_vars() get_included_files() __FILE__, __LINE__ __FUNCTION__, __CLASS__, __METHOD__
  36. 36. Débogage array(2) { [0]=> array(4) { ["file"] => string(10) "/tmp/a.php" ["line"] => int(10) ["function"] => string(6) "a_test" ["args"]=> array(1) { debug_backtrace() [0] => &string(6) "friend" } } Affiche la pile PHP [1]=> array(4) { ["file"] => string(10) "/tmp/b.php" Inclus les ["line"] => int(2) ["args"] => arguments utilisés array(1) { [0] => string(10) "/tmp/a.php" } ["function"] => string(12) "include_once" } }
  37. 37. Listes rapides scandir(‘/tmp’, true); Permet le tri sur les noms Remplace opendir(), readdir(), closedir() et une boucle! Glob(‘*.html’);
  38. 38. Listes rapides Array ( [0] => sess_um8rgjj10f6qvuck91rf36srj7 [1] => sess_u58rgul68305uqfe48ic467276 [2] => mysql.sock [3] => .. <?php [4] => . print_r(scandir('/tmp/', 1)); ) print_r(glob('/tmp/sess_*')); Array ?> ( [0] => /tmp/sess_um8rgjj10f6qvuck91rf36srj7 [1] => /tmp/sess_u58rgul68305uqfe48ic467276 )
  39. 39. URL parse_url() : Détaille une URL parse_string() : Découpe les paramètres http_build_query() : Reconstruit une URL
  40. 40. URL Array ( [scheme] => htp <?php [host] => www.site.com $url = [user] => login 'htp://login:pass@www.site.com/ [pass] => pass path/file.php?a=2 &b[]=3#ee'; [path] => /path/file.php $d = parse_url($url); [query] => a=2 &b[]=3 print_r($d); [fragment] => ee parse_str($d["query"]); ) var_dump($GLOBALS["b"]); array(1) { [0]=> print http_build_query( array_merge($_GET , string(1) "3" array(' de ' => ' '))); } ?> +de+=%E5%AF%B9%E4%BA%86%EF% BC%81
  41. 41. URL <?php get_headers('http://localhost/logo.png', false); ?> Array ( [0] => HTTP/1.1 200 OK [Date] => Fri, 09 Mar 2007 21:09:52 GMT [Server] => Apache/1.3.33 (Darwin) PHP/5.2.1 [X-Powered-By] => PHP/5.2.1 [En_plus] => non [Set-Cookie] => Array ( [0] => a=a [1] => a=b ) [Connection] => close [Content-Type] => text/html )
  42. 42. Cette conférence http://www.nexen.net/conferences.php
  43. 43. Tableaux array_combine : combine deux tableaux en un seul <?php $a = array('vert', 'rouge', 'jaune'); $b = array('avocat', 'pomme', 'banane'); $c = array_combine($a, $b); Array print_r($c); ( ?> [vert] => avocat [rouge] => pomme [jaune] => banane )
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×