Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHP and MySQL Tips and tricks, DC 2007

5,896 views

Published on

Like opening a long hidden treasure chest, this session will bring many jewels back to the programming light. We'll cover a number of lesser known PHP function and MySQL functionalities, that will help at daily tasks. They will be applied in various fields, including security, performances, standard compliance and simply fun to program.

Published in: Technology
  • Be the first to comment

PHP and MySQL Tips and tricks, DC 2007

  1. 1. PHP/MySQL tips and tricks Washington DC, USA, November 7th 2007
  2. 2. Agenda Tips and Tricks from PHP No need for anything else than standard distribution All for PHP 5 ( but lots of it is also valid in PHP 4 ) No petting the elePHPant until the end of the session
  3. 3. Who is speaking? Damien Séguy Nexen Services, Open Source hosting company PHP / MySQL expert services Redacteur en chef of www.nexen.net PHather of thousands plush Elephpants http://www.nexen.net/english.php
  4. 4. Nod when you know about it
  5. 5. PHP 5 : PHP 4 on diet? PHP 4 : 77 extensions bundled PHP 5 : 67 extensions bundled PHP 4 : 2459 functions PHP 5 : 2144 functions PHP 4 : 3 classes PHP 5 : 158 classes.... (watch for DateTime)
  6. 6. Random stuff Array <?php ( $a = range('d','a'); [0] => c shuffle($a); [1] => d [2] => b print_r($a); [3] => a ) print str_shuffle('abcdef'); Array // eabdcf ( [0] => 0 print_r(array_rand($a,3)); [1] => 1 ?> [2] => 3 )
  7. 7. Random stuff rand() and mt_rand() array_rand() : extract info from an array extract keys! shuffle() : shuffle an array before deal str_shuffle() : shuffle a string
  8. 8. Arrays combinaisons array_combine() : turn two arrays into one Inverse to array_keys() and array_values() <?php $a = array('green', 'red', 'yellow'); $b = array('avocado', 'apple', 'banana'); $c = array_combine($a, $b); Array print_r($c); ( ?> [green] => avocado [red] => apple [yellow] => banana )
  9. 9. array_combine() applied <?php $a = range('e','a'); $shuffled_a = array_combine( array_rand($a,5),  array_values($a)); // eabdcf shuffle($a); ?>
  10. 10. Arrays as SQL sort r u r u k k kr uk ar a a ua
  11. 11. Slicing array in chunks : PHP Array ( [0] => Array ( [0] => 1 [1] => 2 ) <?php [1] => Array   $array = range(1,5); (   print_r(array_chunk($array,2)); [0] => 3 [1] => 4 ?> ) [2] => Array ( [0] => 5 ) )
  12. 12. Slicing array in chunks : SQL mysql> SET @a := 1;   mysql> SELECT @a, GROUP_CONCAT(i) FROM integers GROUP BY ROUND((@a := @a + 1) / 4 , 0);   +------+ +------+-----------------+ |i | +------+ | @a | group_concat(i) | | 0| | 1| +------+-----------------+ | 2| | 2 | 0,1,2,13 | | 13 | | 4| | 6 | 4,15,6,7 | | 15 | | 6| | 12 | 11,8,9 | | 7| | 8| +------+-----------------+ | 9| 3 rows in set (0.00 sec) | 11 | +------+
  13. 13. JOIN is faster than LIMIT mysql> SELECT cols FROM TABLE LIMIT 1000, 10;
  14. 14. JOIN is faster than LIMIT mysql> CREATE TABLE `table_limit` ( `row` int(10) unsigned NOT NULL AUTO_INCREMENT, `id` int(11) unsigned DEFAULT NULL, UNIQUE KEY `id` (`id`) ); mysql> INSERT INTO table_limit SELECT 0, id FROM table ORDER BY col; mysql> SELECT col FROM table_limit JOIN table ON bl_content.id = bl_content_nav.id AND table_limit.row BETWEEN @offset AND @offset + 10
  15. 15. JOIN is faster than LIMIT
  16. 16. Arrays sorted as SQL cols Array ( array_multisort() : sort several [0] => 2 arrays at once [1] => 3 [2] => 4 Works like a ORDER BY [3] => 5 <?php ) $ar1 = array(5,4,3,2); Array $ar2 = array('a','b','c','d'); ( array_multisort($ar1, $ar2); [0] => d array_multisort($ar1, [1] => c SORT_ASC,SORT_STRING, [2] => b $ar2); [3] => a ?> )
  17. 17. GROUP BY PHP! DISTINCT : array_unique() COUNT(*) and GROUP BY : array_count_values() <?php $array = array(1, quot;heiquot;, quot;1quot;, quot;takkquot;, quot;heiquot;); print_r(array_count_values($array)); Array ?> ( [1] => 2 Hint : array_count_values() is always faster that [hei] => 2 array_unique()... [takk] => 1 )
  18. 18. Hide those loops to me! <?php  while(list($key, $val) = each($array)) {  print quot;$key => $valnquot;; } for($i = 0; $i<count($array); $i++) {  print quot;$i => {$array[$i]}nquot;; } ?>
  19. 19. Hide those loops to me! <?php $array = range(1,3); foreach($array as $id => &$value) {    $value++; Array } ( [0] => 2 ?> [1] => 3 [2] => 4 ) Declare your objects as Iterators
  20. 20. Hidden loops array_map : apply a function to all elements array_walk_recursive : same as above, and multi-dimensional array_filter : extract all elements using a custom function
  21. 21. Fast dir scans scandir(‘/tmp’, true); Include name sorting Replace opendir, readdir, closedir and a loop! glob(‘*.html’); Simply move the loop out of sight
  22. 22. Fast dir scans Array ( [0] => sess_um8rgjj10f6qvuck91rf36srj7 [1] => sess_u58rgul68305uqfe48ic467276 [2] => mysql.sock <?php [3] => .. print_r(scandir('/tmp/', 1)); [4] => . print_r(glob('/tmp/sess_*')); ) ?> Array ( [0] => /tmp/sess_um8rgjj10f6qvuck91rf36srj7 [1] => /tmp/sess_u58rgul68305uqfe48ic467276 )
  23. 23. URL <?php $url = 'http://login:pass@www.site.com/ path/file.php?a=2+&b%5B%5D= %E5%AF%B9%E4%BA%86%EF%BC%81#ee'; $d = parse_url($url); print_r($d); parse_str($d[quot;queryquot;]); var_dump($GLOBALS[quot;bquot;]); ?>
  24. 24. URL operations parse_url() Break down into details Do not make any check parse_str() Split a query string Separate and decode, as long as it can Fills up an array or $GLOBALS
  25. 25. URL ( [scheme] => http [host] => www.site.com [user] => login [pass] => pass [path] => /path/file.php [query] => a=2&b%5B%5D=%E5%AF%B9%E4%BA%86%EF%BC%81 [fragment] => ee ) array(1) { [0]=> string(9) quot; quot; }
  26. 26. URL validations scheme : list your own host : checkdnsrr() to check path : realpath() + doc root (beware of mod_rewrite) query : parse_str() beware of the second argument! don’t handle &amp;
  27. 27. URL rebuilding http_build_query() : PHP 5 only rebuild your query takes into account encoding and arrays <?php print http_build_query( array_merge($_GET , array(' de ' => ' '))); ?> +de+=%E5%AF%B9%E4%BA%86%EF%BC%81
  28. 28. URL testing <?php get_headers('http://localhost/logo.png'); ?> Array ( [0] => HTTP/1.1 200 OK [1] => Date: Mon, 12 Feb 2007 02:24:23 GMT [2] => Server: Apache/1.3.33 (Darwin) PHP/5.2.1 [3] => X-Powered-By: eZ publish [4] => Last-Modified: Fri, 30 Sep 2005 09:11:28 GMT [5] => ETag: quot;f6f2a-dbb-433d0140quot; [6] => Accept-Ranges: bytes [7] => Content-Length: 3515 [8] => Connection: close [9] => Content-Type: image/png )
  29. 29. PHP is dynamic Variables variables <?php $x = 'y'; $y = 'z'; $z = 'a'; echo $x;  // displays y echo $$x;  // displays z echo $$$x; // displays a ?>
  30. 30. PHP is crazy Crazy variables <?php $  = 'works'; $êtrânçé = 'works'; ${'Utter madness?'} = 'works'; ${''} = 'works'; ?>
  31. 31. Variables export var_export() : recreate PHP code for a variable <?php array ( 0 => 5, $array = array(5,4,3,2); 1 => 4, 2 => 3, file_put_contents('file.inc.php', 3 => 2, '<?php $x = '. ) var_export($array, true). '; ?>' ); ?>
  32. 32. Fast file exports file_put_contents($file_name, $content); accept contexts and streams Complementary to file_get_contents() fputcsv() : create CSV style files complementary to fgetcsv()
  33. 33. Assertions Include tests during execution Assertion are an option (default is on) : Most clever way than removing than echo/var_dump Common practice in other languages Programmation by contract
  34. 34. Assertions <?php assert_options(ASSERT_CALLBACK,'assert_callback'); function assert_callback($script,$line, $message){    echo 'There is something strange  in your script <b>', $script,'</b> :  line <b>', $line,'</b> :<br />'; exit; } assert('is_integer( $x );' );   assert('($x >= 0) && ($x <= 10);  //* $x must be from 0 to 10' );   echo quot;0 <= $x <= 10quot;; ?>
  35. 35. Debugging get_memory_usage() memory_limit is now on by default Better memory handling get_peak_memory_usage() sys_getloadavg() : no more need for exec(’uptime’);
  36. 36. Debugging get_included_files() get_defined_constants/functions/vars() get_declared_classes() get_debug_backtrace() function stack and their arguments file and line calling
  37. 37. Debugging array(2) { [0]=> array(4) { [quot;filequot;] => string(10) quot;/tmp/a.phpquot; [quot;linequot;] => int(10) [quot;functionquot;] => string(6) quot;a_testquot; [quot;argsquot;]=> array(1) { [0] => &string(6) quot;friendquot; } } [1]=> array(4) { [quot;filequot;] => string(10) quot;/tmp/b.phpquot; [quot;linequot;] => int(2) [quot;argsquot;] => array(1) { [0] => string(10) quot;/tmp/a.phpquot; } [quot;functionquot;] => string(12) quot;include_oncequot; } }
  38. 38. Slides http://www.nexen.net/english.php damien.seguy@nexen.net http://www.nexenservices.com/
  39. 39. Everyone loves PHP

×