Trucs et astuces PHP et MySQL

10 484 vues

Publié le

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

Publié dans : Technologie
1 commentaire
9 j’aime
Statistiques
Remarques
  • 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
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
Aucun téléchargement
Vues
Nombre de vues
10 484
Sur SlideShare
0
Issues des intégrations
0
Intégrations
495
Actions
Partages
0
Téléchargements
342
Commentaires
1
J’aime
9
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

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 )

×