0
PHP/MySQL tips and tricks
  Washington DC, USA, November 7th 2007
Agenda

  Tips and Tricks from PHP
     No need for anything else than standard distribution
     All for PHP 5
     ( but...
Who is speaking?

    Damien Séguy
       Nexen Services, Open Source hosting company
       PHP / MySQL expert services
 ...
Nod when you know about it
PHP 5 : PHP 4 on diet?



PHP 4 : 77 extensions bundled   PHP 5 : 67 extensions bundled
PHP 4 : 2459 functions          PH...
Random stuff

                               Array
<?php                          (
$a = range('d','a');               [0] ...
Random stuff


  rand() and mt_rand()
  array_rand() : extract info from an array
    extract keys!

  shuffle() : shuffle an a...
Arrays combinaisons

       array_combine() : turn two arrays into one
         Inverse to array_keys() and array_values()...
array_combine() applied


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

$shuffled_a = array_combine(
    array_rand($a,5), 
    array_values...
Arrays as SQL


     sort       r    u


                r    u


      k     k   kr   uk

                ar
      a     ...
Slicing array in chunks : PHP
                                    Array
                                    (
            ...
Slicing array in chunks : SQL

mysql> SET @a := 1;
 
mysql> SELECT @a, GROUP_CONCAT(i) FROM integers
        GROUP BY ROUN...
JOIN is faster than LIMIT




mysql> SELECT cols FROM TABLE LIMIT 1000, 10;
JOIN is faster than LIMIT

mysql> CREATE TABLE `table_limit` (
  `row` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id` in...
JOIN is faster than LIMIT
Arrays sorted as SQL cols

                                        Array
                                        (
     ar...
GROUP BY PHP!


      DISTINCT : array_unique()
      COUNT(*) and GROUP BY : array_count_values()
<?php
   $array = array...
Hide those loops to me!


<?php
 while(list($key, $val) = each($array)) {
 print quot;$key => $valnquot;;
}

for($i = 0; $...
Hide those loops to me!



<?php
$array = range(1,3);
foreach($array as $id => &$value) {
   $value++;               Array...
Hidden loops




  array_map : apply a function to all elements
  array_walk_recursive : same as above, and multi-dimensio...
Fast dir scans



   scandir(‘/tmp’, true);
     Include name sorting

     Replace opendir, readdir, closedir and a loop!...
Fast dir scans

Array
(
    [0]   =>   sess_um8rgjj10f6qvuck91rf36srj7
    [1]   =>   sess_u58rgul68305uqfe48ic467276
    ...
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...
URL operations


  parse_url()
    Break down into details

    Do not make any check

  parse_str()
    Split a query str...
URL

(
    [scheme] => http
    [host] => www.site.com
    [user] => login
    [pass] => pass
    [path] => /path/file.php...
URL validations


   scheme : list your own
   host : checkdnsrr() to check
   path : realpath() + doc root (beware of mod...
URL rebuilding

     http_build_query() : PHP 5 only
          rebuild your query

          takes into account encoding a...
URL testing

 <?php
    get_headers('http://localhost/logo.png');
 ?>

     Array
     (
         [0]   =>   HTTP/1.1 200 ...
PHP is dynamic

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

      echo $x;  // disp...
PHP is crazy

    Crazy variables


    <?php
      $    = 'works';
      $êtrânçé = 'works';
      ${'Utter madness?'} = ...
Variables export

      var_export() : recreate PHP code for a variable

  <?php
                                         ...
Fast file exports



   file_put_contents($file_name, $content);
     accept contexts and streams

     Complementary to file_...
Assertions


     Include tests during execution
     Assertion are an option (default is on) :
     Most clever way than ...
Assertions

<?php
assert_options(ASSERT_CALLBACK,'assert_callback');
function assert_callback($script,$line, $message){
  ...
Debugging



  get_memory_usage()
    memory_limit is now on by default

    Better memory handling

  get_peak_memory_usa...
Debugging


  get_included_files()
  get_defined_constants/functions/vars()
  get_declared_classes()
  get_debug_backtrace()...
Debugging

   array(2) {
   [0]=>
   array(4) {
       [quot;filequot;] => string(10) quot;/tmp/a.phpquot;
       [quot;li...
Slides

  http://www.nexen.net/english.php
  damien.seguy@nexen.net
  http://www.nexenservices.com/
Everyone
  loves
  PHP
Upcoming SlideShare
Loading in...5
×

PHP and MySQL Tips and tricks, DC 2007

5,399

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
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,399
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
164
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "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
  1. A particular slide catching your eye?

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

×