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

Trucs et astuces PHP et MySQL

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Trucs et astuces PHP et MySQL

Trucs et astucesPHP & MySQL

Toute cette puissance au bout des doigtsMontréal, Québec, Canada

Page 2: Trucs et astuces PHP et MySQL

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

Page 3: Trucs et astuces PHP et MySQL

Questions?

Page 4: Trucs et astuces PHP et MySQL

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/

Page 5: Trucs et astuces PHP et MySQL

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

Page 6: Trucs et astuces PHP et MySQL

Au hasard

<?php$a = range('a','d');shuffle($a);

print_r($a);

print_r(array_rand($a,3));

print str_shuffle('abcdef');// eabdcf?>

Array( [0] => c [1] => d [2] => b [3] => a)Array( [0] => 0 [1] => 1 [2] => 3)

Page 7: Trucs et astuces PHP et MySQL

Tableaux SQL?

Array_unique : DISTINCT

array_count_values : GROUP BY

Bien plus rapide que la précédente

Page 8: Trucs et astuces PHP et MySQL

Tableaux SQL?<?php$array = array("1", "MySQL", 1, "PHP", "PHP");$array = array_count_values($array);asort($array);print_r($array);?>

Array( [1] => 2 [PHP] => 2 [MySQL] => 1)

sort r u

ksort kr uk

asort ar ua

Page 9: Trucs et astuces PHP et MySQL

Tableaux SQL

array_multisort() : tri surplusieurs tableaux en même temps

Fonctionne comme ORDER BY

<?php$ar1 = array(5,4,3,2);$ar2 = array('a','b','c','d');array_multisort($ar1, $ar2);array_multisort($ar1, SORT_ASC, SORT_INT, $ar2);

?>

Array( [0] => 2 [1] => 3 [2] => 4 [3] => 5)Array( [0] => d [1] => c [2] => b [3] => a)

Page 10: Trucs et astuces PHP et MySQL

Étranges tris?

mysql> SELECT id, ordre FROM table ORDER BY ordre ASC;+----+------------+| id | ordre |+----+------------+| 1 | premier || 2 | deuxième || 3 | troisième || 4 | quatrième |+----+------------+

Est ce que ça cloche?

Page 11: Trucs et astuces PHP et MySQL

É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

Page 12: Trucs et astuces PHP et MySQL

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

Page 13: Trucs et astuces PHP et MySQL

Variables MySQL

mysql> SELECT @total := sum(nombre) FROM statsPHP ;mysql> UPDATE statsPHP SET pourcentage = nombre / @total * 100;

<?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); ?>

Page 14: Trucs et astuces PHP et MySQL

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); ?>

Page 15: Trucs et astuces PHP et MySQL

Classementsmysql> 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)

Page 16: Trucs et astuces PHP et MySQL

Ex-aequomysql> 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 | +------+------+---------------+-----+

Page 17: Trucs et astuces PHP et MySQL

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 pasimport_request_variables(); // non plus?>

Page 18: Trucs et astuces PHP et MySQL

PHP est dynamique

Variables variables

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

echo $x;  // affiche y echo $$x;  // affiche z echo $$$x; // affiche a ?>

Page 19: Trucs et astuces PHP et MySQL

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());?>

Page 20: Trucs et astuces PHP et MySQL

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?>

Page 21: Trucs et astuces PHP et MySQL

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); ?>

Page 22: Trucs et astuces PHP et MySQL

Toute cette dynamite..

Métamoteur

Gabarits

Gestion de structures dynamiques

SOAP

Personnalisation de bibliothèques

Page 23: Trucs et astuces PHP et MySQL

Magie de l'objet

__autoload() : Juste à temps

<?php// php.ini auto_prependfunction __autoload($classe) {   include 'classes/' . $classe . '.php';}

$objet  = new MaClasse();$objet2 = new MaClasse2(); ?>

Page 24: Trucs et astuces PHP et MySQL

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(); echo $db; ?>

PHP Catchable fatal error: Object of class mysqli could not be converted to string

Page 25: Trucs et astuces PHP et MySQL

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"); } // ..... }

Page 26: Trucs et astuces PHP et MySQL

Buffer de sortie

Intercepte le contenu

Evite le bogue 'already sent'

Nettoyez : tidy

Compressez : gz

Cachez : ce sein que

<?phpob_start("ob_gzhandler");echo "Hello\n";setcookie("c", "v");ob_end_flush();?>

Page 27: Trucs et astuces PHP et MySQL

Caches simples

auto_prepend :

auto_append :

if ( filemtime( CACHE )+3600 < time()) {     include($cachefile);     exit; } ob_start();

  $content = ob_get_contents();    file_put_contents(CACHE, $contents);   ob_end_flush();

Page 28: Trucs et astuces PHP et MySQL

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

Page 29: Trucs et astuces PHP et MySQL

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

Page 30: Trucs et astuces PHP et MySQL

Variables

var_export : Crée le code pour une variable

Pratique pour les tableaux de configuration

Optimise ces tableaux

<?php

$array = array(5,4,3,2);

print var_export($array, true);

?>

array ( 0 => 5, 1 => 4, 2 => 3, 3 => 2,)

Page 31: Trucs et astuces PHP et MySQL

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

Page 32: Trucs et astuces PHP et MySQL

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; } ?>

Page 33: Trucs et astuces PHP et MySQL

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; } ?>

Page 34: Trucs et astuces PHP et MySQL

Déboguage

phpinfo()

get_defined_funcs()

get_extension_funcs()

get_defined_classes()

get_object_vars()

get_class_var()

<?phpReflection::export( new ReflectionClass('Exception'));?>Class [ <internal> class Exception ] { - Constants [0] {} - Static properties [0] { } - Static methods [0] { }

Page 35: Trucs et astuces PHP et MySQL

Débogage

get_defined_vars()

get_included_files()

__FILE__, __LINE__

__FUNCTION__, __CLASS__, __METHOD__

Page 36: Trucs et astuces PHP et MySQL

Débogage

debug_backtrace()

Affiche la pile PHP

Inclus les arguments utilisés

array(2) {[0]=>array(4) { ["file"] => string(10) "/tmp/a.php" ["line"] => int(10) ["function"] => string(6) "a_test" ["args"]=> array(1) { [0] => &string(6) "friend" }}[1]=>array(4) { ["file"] => string(10) "/tmp/b.php" ["line"] => int(2) ["args"] => array(1) { [0] => string(10) "/tmp/a.php" } ["function"] => string(12) "include_once" }}

Page 37: Trucs et astuces PHP et MySQL

Listes rapides

scandir(‘/tmp’, true);

Permet le tri sur les noms

Remplace opendir(), readdir(), closedir() et une boucle!

Glob(‘*.html’);

Page 38: Trucs et astuces PHP et MySQL

Listes rapides

<?phpprint_r(scandir('/tmp/', 1));print_r(glob('/tmp/sess_*'));?>

Array( [0] => sess_um8rgjj10f6qvuck91rf36srj7 [1] => sess_u58rgul68305uqfe48ic467276 [2] => mysql.sock [3] => .. [4] => .)Array( [0] => /tmp/sess_um8rgjj10f6qvuck91rf36srj7 [1] => /tmp/sess_u58rgul68305uqfe48ic467276)

Page 39: Trucs et astuces PHP et MySQL

URL

parse_url() : Détaille une URL

parse_string() : Découpe les paramètres

http_build_query() : Reconstruit une URL

Page 40: Trucs et astuces PHP et MySQL

URL

<?php$url = 'htp://login:[email protected]/ path/file.php?a=2 &b[]=3#ee';

$d = parse_url($url);print_r($d);

parse_str($d["query"]);var_dump($GLOBALS["b"]);

print http_build_query( array_merge($_GET , array(' de ' => '对了!')));?>

Array( [scheme] => htp [host] => www.site.com [user] => login [pass] => pass [path] => /path/file.php [query] => a=2 &b[]=3 [fragment] => ee)array(1) { [0]=> string(1) "3"}+de+=%E5%AF%B9%E4%BA%86%EF%BC%81

Page 41: Trucs et astuces PHP et MySQL

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)

Page 42: Trucs et astuces PHP et MySQL

Cette conférence

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

Page 43: Trucs et astuces PHP et MySQL
Page 44: Trucs et astuces PHP et MySQL

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);

print_r($c);?>

Array( [vert] => avocat [rouge] => pomme [jaune] => banane)