zoukankan      html  css  js  c++  java
  • ezSQL 数据库操作类

    http://justinvincent.com

    官网,一切尽在里面的下载帮助文件中,妙哉也!!

    ez_sql_core.php

      1 <?php
      2 
      3     /**********************************************************************
      4     *  Author: Justin Vincent (jv@vip.ie)
      5     *  Web...: http://justinvincent.com
      6     *  Name..: ezSQL
      7     *  Desc..: ezSQL Core module - database abstraction library to make
      8     *          it very easy to deal with databases. ezSQLcore can not be used by
      9     *          itself (it is designed for use by database specific modules).
     10     *
     11     */
     12 
     13     /**********************************************************************
     14     *  ezSQL Constants
     15     */
     16 
     17     define('EZSQL_VERSION','2.17');
     18     define('OBJECT','OBJECT',true);
     19     define('ARRAY_A','ARRAY_A',true);
     20     define('ARRAY_N','ARRAY_N',true);
     21 
     22     /**********************************************************************
     23     *  Core class containg common functions to manipulate query result
     24     *  sets once returned
     25     */
     26 
     27     class ezSQLcore
     28     {
     29 
     30         var $trace            = false;  // same as $debug_all
     31         var $debug_all        = false;  // same as $trace
     32         var $debug_called     = false;
     33         var $vardump_called   = false;
     34         var $show_errors      = true;
     35         var $num_queries      = 0;
     36         var $last_query       = null;
     37         var $last_error       = null;
     38         var $col_info         = null;
     39         var $captured_errors  = array();
     40         var $cache_dir        = false;
     41         var $cache_queries    = false;
     42         var $cache_inserts    = false;
     43         var $use_disk_cache   = false;
     44         var $cache_timeout    = 24; // hours
     45         var $timers           = array();
     46         var $total_query_time = 0;
     47         var $db_connect_time  = 0;
     48         var $trace_log        = array();
     49         var $use_trace_log    = false;
     50         var $sql_log_file     = false;
     51         var $do_profile       = false;
     52         var $profile_times    = array();
     53 
     54         // == TJH == default now needed for echo of debug function
     55         var $debug_echo_is_on = true;
     56 
     57         /**********************************************************************
     58         *  Constructor
     59         */
     60 
     61         function ezSQLcore()
     62         {
     63         }
     64 
     65         /**********************************************************************
     66         *  Get host and port from an "host:port" notation.
     67         *  Returns array of host and port. If port is omitted, returns $default
     68         */
     69 
     70         function get_host_port( $host, $default = false )
     71         {
     72             $port = $default;
     73             if ( false !== strpos( $host, ':' ) ) {
     74                 list( $host, $port ) = explode( ':', $host );
     75                 $port = (int) $port;
     76             }
     77             return array( $host, $port );
     78         }
     79 
     80         /**********************************************************************
     81         *  Print SQL/DB error - over-ridden by specific DB class
     82         */
     83 
     84         function register_error($err_str)
     85         {
     86             // Keep track of last error
     87             $this->last_error = $err_str;
     88 
     89             // Capture all errors to an error array no matter what happens
     90             $this->captured_errors[] = array
     91             (
     92                 'error_str' => $err_str,
     93                 'query'     => $this->last_query
     94             );
     95         }
     96 
     97         /**********************************************************************
     98         *  Turn error handling on or off..
     99         */
    100 
    101         function show_errors()
    102         {
    103             $this->show_errors = true;
    104         }
    105 
    106         function hide_errors()
    107         {
    108             $this->show_errors = false;
    109         }
    110 
    111         /**********************************************************************
    112         *  Kill cached query results
    113         */
    114 
    115         function flush()
    116         {
    117             // Get rid of these
    118             $this->last_result = null;
    119             $this->col_info = null;
    120             $this->last_query = null;
    121             $this->from_disk_cache = false;
    122         }
    123 
    124         /**********************************************************************
    125         *  Get one variable from the DB - see docs for more detail
    126         */
    127 
    128         function get_var($query=null,$x=0,$y=0)
    129         {
    130 
    131             // Log how the function was called
    132             $this->func_call = "$db->get_var("$query",$x,$y)";
    133 
    134             // If there is a query then perform it if not then use cached results..
    135             if ( $query )
    136             {
    137                 $this->query($query);
    138             }
    139 
    140             // Extract var out of cached results based x,y vals
    141             if ( $this->last_result[$y] )
    142             {
    143                 $values = array_values(get_object_vars($this->last_result[$y]));
    144             }
    145 
    146             // If there is a value return it else return null
    147             return (isset($values[$x]) && $values[$x]!=='')?$values[$x]:null;
    148         }
    149 
    150         /**********************************************************************
    151         *  Get one row from the DB - see docs for more detail
    152         */
    153 
    154         function get_row($query=null,$output=OBJECT,$y=0)
    155         {
    156 
    157             // Log how the function was called
    158             $this->func_call = "$db->get_row("$query",$output,$y)";
    159 
    160             // If there is a query then perform it if not then use cached results..
    161             if ( $query )
    162             {
    163                 $this->query($query);
    164             }
    165 
    166             // If the output is an object then return object using the row offset..
    167             if ( $output == OBJECT )
    168             {
    169                 return $this->last_result[$y]?$this->last_result[$y]:null;
    170             }
    171             // If the output is an associative array then return row as such..
    172             elseif ( $output == ARRAY_A )
    173             {
    174                 return $this->last_result[$y]?get_object_vars($this->last_result[$y]):null;
    175             }
    176             // If the output is an numerical array then return row as such..
    177             elseif ( $output == ARRAY_N )
    178             {
    179                 return $this->last_result[$y]?array_values(get_object_vars($this->last_result[$y])):null;
    180             }
    181             // If invalid output type was specified..
    182             else
    183             {
    184                 $this->show_errors ? trigger_error(" $db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N",E_USER_WARNING) : null;
    185             }
    186 
    187         }
    188 
    189         /**********************************************************************
    190         *  Function to get 1 column from the cached result set based in X index
    191         *  see docs for usage and info
    192         */
    193 
    194         function get_col($query=null,$x=0)
    195         {
    196 
    197             $new_array = array();
    198 
    199             // If there is a query then perform it if not then use cached results..
    200             if ( $query )
    201             {
    202                 $this->query($query);
    203             }
    204 
    205             // Extract the column values
    206             for ( $i=0; $i < count($this->last_result); $i++ )
    207             {
    208                 $new_array[$i] = $this->get_var(null,$x,$i);
    209             }
    210 
    211             return $new_array;
    212         }
    213 
    214 
    215         /**********************************************************************
    216         *  Return the the query as a result set - see docs for more details
    217         */
    218 
    219         function get_results($query=null, $output = OBJECT)
    220         {
    221 
    222             // Log how the function was called
    223             $this->func_call = "$db->get_results("$query", $output)";
    224 
    225             // If there is a query then perform it if not then use cached results..
    226             if ( $query )
    227             {
    228                 $this->query($query);
    229             }
    230 
    231             // Send back array of objects. Each row is an object
    232             if ( $output == OBJECT )
    233             {
    234                 return $this->last_result;
    235             }
    236             elseif ( $output == ARRAY_A || $output == ARRAY_N )
    237             {
    238                 if ( $this->last_result )
    239                 {
    240                     $i=0;
    241                     foreach( $this->last_result as $row )
    242                     {
    243 
    244                         $new_array[$i] = get_object_vars($row);
    245 
    246                         if ( $output == ARRAY_N )
    247                         {
    248                             $new_array[$i] = array_values($new_array[$i]);
    249                         }
    250 
    251                         $i++;
    252                     }
    253 
    254                     return $new_array;
    255                 }
    256                 else
    257                 {
    258                     return array();
    259                 }
    260             }
    261         }
    262 
    263 
    264         /**********************************************************************
    265         *  Function to get column meta data info pertaining to the last query
    266         * see docs for more info and usage
    267         */
    268 
    269         function get_col_info($info_type="name",$col_offset=-1)
    270         {
    271 
    272             if ( $this->col_info )
    273             {
    274                 if ( $col_offset == -1 )
    275                 {
    276                     $i=0;
    277                     foreach($this->col_info as $col )
    278                     {
    279                         $new_array[$i] = $col->{$info_type};
    280                         $i++;
    281                     }
    282                     return $new_array;
    283                 }
    284                 else
    285                 {
    286                     return $this->col_info[$col_offset]->{$info_type};
    287                 }
    288 
    289             }
    290 
    291         }
    292 
    293         /**********************************************************************
    294         *  store_cache
    295         */
    296 
    297         function store_cache($query,$is_insert)
    298         {
    299 
    300             // The would be cache file for this query
    301             $cache_file = $this->cache_dir.'/'.md5($query);
    302 
    303             // disk caching of queries
    304             if ( $this->use_disk_cache && ( $this->cache_queries && ! $is_insert ) || ( $this->cache_inserts && $is_insert ))
    305             {
    306                 if ( ! is_dir($this->cache_dir) )
    307                 {
    308                     $this->register_error("Could not open cache dir: $this->cache_dir");
    309                     $this->show_errors ? trigger_error("Could not open cache dir: $this->cache_dir",E_USER_WARNING) : null;
    310                 }
    311                 else
    312                 {
    313                     // Cache all result values
    314                     $result_cache = array
    315                     (
    316                         'col_info' => $this->col_info,
    317                         'last_result' => $this->last_result,
    318                         'num_rows' => $this->num_rows,
    319                         'return_value' => $this->num_rows,
    320                     );
    321                     file_put_contents($cache_file, serialize($result_cache));
    322                     if( file_exists($cache_file . ".updating") )
    323                         unlink($cache_file . ".updating");
    324                 }
    325             }
    326 
    327         }
    328 
    329         /**********************************************************************
    330         *  get_cache
    331         */
    332 
    333         function get_cache($query)
    334         {
    335 
    336             // The would be cache file for this query
    337             $cache_file = $this->cache_dir.'/'.md5($query);
    338 
    339             // Try to get previously cached version
    340             if ( $this->use_disk_cache && file_exists($cache_file) )
    341             {
    342                 // Only use this cache file if less than 'cache_timeout' (hours)
    343                 if ( (time() - filemtime($cache_file)) > ($this->cache_timeout*3600) &&
    344                     !(file_exists($cache_file . ".updating") && (time() - filemtime($cache_file . ".updating") < 60)) )
    345                 {
    346                     touch($cache_file . ".updating"); // Show that we in the process of updating the cache
    347                 }
    348                 else
    349                 {
    350                     $result_cache = unserialize(file_get_contents($cache_file));
    351 
    352                     $this->col_info = $result_cache['col_info'];
    353                     $this->last_result = $result_cache['last_result'];
    354                     $this->num_rows = $result_cache['num_rows'];
    355 
    356                     $this->from_disk_cache = true;
    357 
    358                     // If debug ALL queries
    359                     $this->trace || $this->debug_all ? $this->debug() : null ;
    360 
    361                     return $result_cache['return_value'];
    362                 }
    363             }
    364 
    365         }
    366 
    367         /**********************************************************************
    368         *  Dumps the contents of any input variable to screen in a nicely
    369         *  formatted and easy to understand way - any type: Object, Var or Array
    370         */
    371 
    372         function vardump($mixed='')
    373         {
    374 
    375             // Start outup buffering
    376             ob_start();
    377 
    378             echo "<p><table><tr><td bgcolor=ffffff><blockquote><font color=000090>";
    379             echo "<pre><font face=arial>";
    380 
    381             if ( ! $this->vardump_called )
    382             {
    383                 echo "<font color=800080><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Variable Dump..</b></font>
    
    ";
    384             }
    385 
    386             $var_type = gettype ($mixed);
    387             print_r(($mixed?$mixed:"<font color=red>No Value / False</font>"));
    388             echo "
    
    <b>Type:</b> " . ucfirst($var_type) . "
    ";
    389             echo "<b>Last Query</b> [$this->num_queries]<b>:</b> ".($this->last_query?$this->last_query:"NULL")."
    ";
    390             echo "<b>Last Function Call:</b> " . ($this->func_call?$this->func_call:"None")."
    ";
    391             echo "<b>Last Rows Returned:</b> ".count($this->last_result)."
    ";
    392             echo "</font></pre></font></blockquote></td></tr></table>".$this->donation();
    393             echo "
    <hr size=1 noshade color=dddddd>";
    394 
    395             // Stop output buffering and capture debug HTML
    396             $html = ob_get_contents();
    397             ob_end_clean();
    398 
    399             // Only echo output if it is turned on
    400             if ( $this->debug_echo_is_on )
    401             {
    402                 echo $html;
    403             }
    404 
    405             $this->vardump_called = true;
    406 
    407             return $html;
    408 
    409         }
    410 
    411         /**********************************************************************
    412         *  Alias for the above function
    413         */
    414 
    415         function dumpvar($mixed)
    416         {
    417             $this->vardump($mixed);
    418         }
    419 
    420         /**********************************************************************
    421         *  Displays the last query string that was sent to the database & a
    422         * table listing results (if there were any).
    423         * (abstracted into a seperate file to save server overhead).
    424         */
    425 
    426         function debug($print_to_screen=true)
    427         {
    428 
    429             // Start outup buffering
    430             ob_start();
    431 
    432             echo "<blockquote>";
    433 
    434             // Only show ezSQL credits once..
    435             if ( ! $this->debug_called )
    436             {
    437                 echo "<font color=800080 face=arial size=2><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Debug..</b></font><p>
    ";
    438             }
    439 
    440             if ( $this->last_error )
    441             {
    442                 echo "<font face=arial size=2 color=000099><b>Last Error --</b> [<font color=000000><b>$this->last_error</b></font>]<p>";
    443             }
    444 
    445             if ( $this->from_disk_cache )
    446             {
    447                 echo "<font face=arial size=2 color=000099><b>Results retrieved from disk cache</b></font><p>";
    448             }
    449 
    450             echo "<font face=arial size=2 color=000099><b>Query</b> [$this->num_queries] <b>--</b> ";
    451             echo "[<font color=000000><b>$this->last_query</b></font>]</font><p>";
    452 
    453                 echo "<font face=arial size=2 color=000099><b>Query Result..</b></font>";
    454                 echo "<blockquote>";
    455 
    456             if ( $this->col_info )
    457             {
    458 
    459                 // =====================================================
    460                 // Results top rows
    461 
    462                 echo "<table cellpadding=5 cellspacing=1 bgcolor=555555>";
    463                 echo "<tr bgcolor=eeeeee><td nowrap valign=bottom><font color=555599 face=arial size=2><b>(row)</b></font></td>";
    464 
    465 
    466                 for ( $i=0; $i < count($this->col_info); $i++ )
    467                 {
    468                     /* when selecting count(*) the maxlengh is not set, size is set instead. */
    469                     echo "<td nowrap align=left valign=top><font size=1 color=555599 face=arial>{$this->col_info[$i]->type}";
    470                     if (!isset($this->col_info[$i]->max_length))
    471                     {
    472                         echo "{$this->col_info[$i]->size}";
    473                     } else {
    474                         echo "{$this->col_info[$i]->max_length}";
    475                     }
    476                     echo "</font><br><span style='font-family: arial; font-size: 10pt; font-weight: bold;'>{$this->col_info[$i]->name}</span></td>";
    477                 }
    478 
    479                 echo "</tr>";
    480 
    481                 // ======================================================
    482                 // print main results
    483 
    484             if ( $this->last_result )
    485             {
    486 
    487                 $i=0;
    488                 foreach ( $this->get_results(null,ARRAY_N) as $one_row )
    489                 {
    490                     $i++;
    491                     echo "<tr bgcolor=ffffff><td bgcolor=eeeeee nowrap align=middle><font size=2 color=555599 face=arial>$i</font></td>";
    492 
    493                     foreach ( $one_row as $item )
    494                     {
    495                         echo "<td nowrap><font face=arial size=2>$item</font></td>";
    496                     }
    497 
    498                     echo "</tr>";
    499                 }
    500 
    501             } // if last result
    502             else
    503             {
    504                 echo "<tr bgcolor=ffffff><td colspan=".(count($this->col_info)+1)."><font face=arial size=2>No Results</font></td></tr>";
    505             }
    506 
    507             echo "</table>";
    508 
    509             } // if col_info
    510             else
    511             {
    512                 echo "<font face=arial size=2>No Results</font>";
    513             }
    514 
    515             echo "</blockquote></blockquote>".$this->donation()."<hr noshade color=dddddd size=1>";
    516 
    517             // Stop output buffering and capture debug HTML
    518             $html = ob_get_contents();
    519             ob_end_clean();
    520 
    521             // Only echo output if it is turned on
    522             if ( $this->debug_echo_is_on && $print_to_screen)
    523             {
    524                 echo $html;
    525             }
    526 
    527             $this->debug_called = true;
    528 
    529             return $html;
    530 
    531         }
    532 
    533         /**********************************************************************
    534         *  Naughty little function to ask for some remuniration!
    535         */
    536 
    537         function donation()
    538         {
    539             return "<font size=1 face=arial color=000000>If ezSQL has helped <a href="https://www.paypal.com/xclick/business=justin%40justinvincent.com&item_name=ezSQL&no_note=1&tax=0" style="color: 0000CC;">make a donation!?</a> &nbsp;&nbsp;<!--[ go on! you know you want to! ]--></font>";
    540         }
    541 
    542         /**********************************************************************
    543         *  Timer related functions
    544         */
    545 
    546         function timer_get_cur()
    547         {
    548             list($usec, $sec) = explode(" ",microtime());
    549             return ((float)$usec + (float)$sec);
    550         }
    551 
    552         function timer_start($timer_name)
    553         {
    554             $this->timers[$timer_name] = $this->timer_get_cur();
    555         }
    556 
    557         function timer_elapsed($timer_name)
    558         {
    559             return round($this->timer_get_cur() - $this->timers[$timer_name],2);
    560         }
    561 
    562         function timer_update_global($timer_name)
    563         {
    564             if ( $this->do_profile )
    565             {
    566                 $this->profile_times[] = array
    567                 (
    568                     'query' => $this->last_query,
    569                     'time' => $this->timer_elapsed($timer_name)
    570                 );
    571             }
    572 
    573             $this->total_query_time += $this->timer_elapsed($timer_name);
    574         }
    575 
    576         /**********************************************************************
    577         * Creates a SET nvp sql string from an associative array (and escapes all values)
    578         *
    579         *  Usage:
    580         *
    581         *     $db_data = array('login'=>'jv','email'=>'jv@vip.ie', 'user_id' => 1, 'created' => 'NOW()');
    582         *
    583         *     $db->query("INSERT INTO users SET ".$db->get_set($db_data));
    584         *
    585         *     ...OR...
    586         *
    587         *     $db->query("UPDATE users SET ".$db->get_set($db_data)." WHERE user_id = 1");
    588         *
    589         * Output:
    590         *
    591         *     login = 'jv', email = 'jv@vip.ie', user_id = 1, created = NOW()
    592         */
    593 
    594         function get_set($params)
    595         {
    596             if( !is_array( $params ) )
    597             {
    598                 $this->register_error( 'get_set() parameter invalid. Expected array in '.__FILE__.' on line '.__LINE__);
    599                 return;
    600             }
    601             $sql = array();
    602             foreach ( $params as $field => $val )
    603             {
    604                 if ( $val === 'true' || $val === true )
    605                     $val = 1;
    606                 if ( $val === 'false' || $val === false )
    607                     $val = 0;
    608 
    609                 switch( $val ){
    610                     case 'NOW()' :
    611                     case 'NULL' :
    612                       $sql[] = "$field = $val";
    613                         break;
    614                     default :
    615                         $sql[] = "$field = '".$this->escape( $val )."'";
    616                 }
    617             }
    618 
    619             return implode( ', ' , $sql );
    620         }
    621 
    622     }

    //ez_sql_mysql.php
      1 <?php
      2 
      3     /**********************************************************************
      4     *  Author: Justin Vincent (jv@jvmultimedia.com)
      5     *  Web...: http://twitter.com/justinvincent
      6     *  Name..: ezSQL_mysql
      7     *  Desc..: mySQL component (part of ezSQL databse abstraction library)
      8     *
      9     */
     10 
     11     /**********************************************************************
     12     *  ezSQL error strings - mySQL
     13     */
     14     
     15     global $ezsql_mysql_str;
     16 
     17     $ezsql_mysql_str = array
     18     (
     19         1 => 'Require $dbuser and $dbpassword to connect to a database server',
     20         2 => 'Error establishing mySQL database connection. Correct user/password? Correct hostname? Database server running?',
     21         3 => 'Require $dbname to select a database',
     22         4 => 'mySQL database connection is not active',
     23         5 => 'Unexpected error while trying to select database'
     24     );
     25 
     26     /**********************************************************************
     27     *  ezSQL Database specific class - mySQL
     28     */
     29 
     30     if ( ! function_exists ('mysql_connect') ) die('<b>Fatal Error:</b> ezSQL_mysql requires mySQL Lib to be compiled and or linked in to the PHP engine');
     31     if ( ! class_exists ('ezSQLcore') ) die('<b>Fatal Error:</b> ezSQL_mysql requires ezSQLcore (ez_sql_core.php) to be included/loaded before it can be used');
     32 
     33     class ezSQL_mysql extends ezSQLcore
     34     {
     35 
     36         var $dbuser = false;
     37         var $dbpassword = false;
     38         var $dbname = false;
     39         var $dbhost = false;
     40         var $encoding = false;
     41         var $rows_affected = false;
     42 
     43         /**********************************************************************
     44         *  Constructor - allow the user to perform a quick connect at the
     45         *  same time as initialising the ezSQL_mysql class
     46         */
     47 
     48         function ezSQL_mysql($dbuser='', $dbpassword='', $dbname='', $dbhost='localhost', $encoding='')
     49         {
     50             $this->dbuser = $dbuser;
     51             $this->dbpassword = $dbpassword;
     52             $this->dbname = $dbname;
     53             $this->dbhost = $dbhost;
     54             $this->encoding = $encoding;
     55         }
     56 
     57         /**********************************************************************
     58         *  Short hand way to connect to mySQL database server
     59         *  and select a mySQL database at the same time
     60         */
     61 
     62         function quick_connect($dbuser='', $dbpassword='', $dbname='', $dbhost='localhost', $encoding='')
     63         {
     64             $return_val = false;
     65             if ( ! $this->connect($dbuser, $dbpassword, $dbhost,true) ) ;
     66             else if ( ! $this->select($dbname,$encoding) ) ;
     67             else $return_val = true;
     68             return $return_val;
     69         }
     70 
     71         /**********************************************************************
     72         *  Try to connect to mySQL database server
     73         */
     74 
     75         function connect($dbuser='', $dbpassword='', $dbhost='localhost')
     76         {
     77             global $ezsql_mysql_str; $return_val = false;
     78             
     79             // Keep track of how long the DB takes to connect
     80             $this->timer_start('db_connect_time');
     81 
     82             // Must have a user and a password
     83             if ( ! $dbuser )
     84             {
     85                 $this->register_error($ezsql_mysql_str[1].' in '.__FILE__.' on line '.__LINE__);
     86                 $this->show_errors ? trigger_error($ezsql_mysql_str[1],E_USER_WARNING) : null;
     87             }
     88             // Try to establish the server database handle
     89             else if ( ! $this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword,true,131074) )
     90             {
     91                 $this->register_error($ezsql_mysql_str[2].' in '.__FILE__.' on line '.__LINE__);
     92                 $this->show_errors ? trigger_error($ezsql_mysql_str[2],E_USER_WARNING) : null;
     93             }
     94             else
     95             {
     96                 $this->dbuser = $dbuser;
     97                 $this->dbpassword = $dbpassword;
     98                 $this->dbhost = $dbhost;
     99                 $return_val = true;
    100             }
    101 
    102             return $return_val;
    103         }
    104 
    105         /**********************************************************************
    106         *  Try to select a mySQL database
    107         */
    108 
    109         function select($dbname='', $encoding='')
    110         {
    111             global $ezsql_mysql_str; $return_val = false;
    112 
    113             // Must have a database name
    114             if ( ! $dbname )
    115             {
    116                 $this->register_error($ezsql_mysql_str[3].' in '.__FILE__.' on line '.__LINE__);
    117                 $this->show_errors ? trigger_error($ezsql_mysql_str[3],E_USER_WARNING) : null;
    118             }
    119 
    120             // Must have an active database connection
    121             else if ( ! $this->dbh )
    122             {
    123                 $this->register_error($ezsql_mysql_str[4].' in '.__FILE__.' on line '.__LINE__);
    124                 $this->show_errors ? trigger_error($ezsql_mysql_str[4],E_USER_WARNING) : null;
    125             }
    126 
    127             // Try to connect to the database
    128             else if ( !@mysql_select_db($dbname,$this->dbh) )
    129             {
    130                 // Try to get error supplied by mysql if not use our own
    131                 if ( !$str = @mysql_error($this->dbh))
    132                       $str = $ezsql_mysql_str[5];
    133 
    134                 $this->register_error($str.' in '.__FILE__.' on line '.__LINE__);
    135                 $this->show_errors ? trigger_error($str,E_USER_WARNING) : null;
    136             }
    137             else
    138             {
    139                 $this->dbname = $dbname;
    140                 if ( $encoding == '') $encoding = $this->encoding;
    141                 if($encoding!='')
    142                 {
    143                     $encoding = strtolower(str_replace("-","",$encoding));
    144                     $charsets = array();
    145                     $result = mysql_query("SHOW CHARACTER SET");
    146                     while($row = mysql_fetch_array($result,MYSQL_ASSOC))
    147                     {
    148                         $charsets[] = $row["Charset"];
    149                     }
    150                     if(in_array($encoding,$charsets)){
    151                         mysql_query("SET NAMES '".$encoding."'");                        
    152                     }
    153                 }
    154                 
    155                 $return_val = true;
    156             }
    157 
    158             return $return_val;
    159         }
    160 
    161         /**********************************************************************
    162         *  Format a mySQL string correctly for safe mySQL insert
    163         *  (no mater if magic quotes are on or not)
    164         */
    165 
    166         function escape($str)
    167         {
    168             // If there is no existing database connection then try to connect
    169             if ( ! isset($this->dbh) || ! $this->dbh )
    170             {
    171                 $this->connect($this->dbuser, $this->dbpassword, $this->dbhost);
    172                 $this->select($this->dbname, $this->encoding);
    173             }
    174 
    175             return mysql_real_escape_string(stripslashes($str));
    176         }
    177 
    178         /**********************************************************************
    179         *  Return mySQL specific system date syntax
    180         *  i.e. Oracle: SYSDATE Mysql: NOW()
    181         */
    182 
    183         function sysdate()
    184         {
    185             return 'NOW()';
    186         }
    187 
    188         /**********************************************************************
    189         *  Perform mySQL query and try to detirmin result value
    190         */
    191 
    192         function query($query)
    193         {
    194 
    195             // This keeps the connection alive for very long running scripts
    196             if ( $this->num_queries >= 500 )
    197             {
    198                 $this->num_queries = 0;
    199                 $this->disconnect();
    200                 $this->quick_connect($this->dbuser,$this->dbpassword,$this->dbname,$this->dbhost,$this->encoding);
    201             }
    202 
    203             // Initialise return
    204             $return_val = 0;
    205 
    206             // Flush cached values..
    207             $this->flush();
    208 
    209             // For reg expressions
    210             $query = trim($query);
    211 
    212             // Log how the function was called
    213             $this->func_call = "$db->query("$query")";
    214 
    215             // Keep track of the last query for debug..
    216             $this->last_query = $query;
    217 
    218             // Count how many queries there have been
    219             $this->num_queries++;
    220             
    221             // Start timer
    222             $this->timer_start($this->num_queries);
    223 
    224             // Use core file cache function
    225             if ( $cache = $this->get_cache($query) )
    226             {
    227                 // Keep tack of how long all queries have taken
    228                 $this->timer_update_global($this->num_queries);
    229 
    230                 // Trace all queries
    231                 if ( $this->use_trace_log )
    232                 {
    233                     $this->trace_log[] = $this->debug(false);
    234                 }
    235                 
    236                 return $cache;
    237             }
    238 
    239             // If there is no existing database connection then try to connect
    240             if ( ! isset($this->dbh) || ! $this->dbh )
    241             {
    242                 $this->connect($this->dbuser, $this->dbpassword, $this->dbhost);
    243                 $this->select($this->dbname,$this->encoding);
    244                 // No existing connection at this point means the server is unreachable
    245                 if ( ! isset($this->dbh) || ! $this->dbh )
    246                     return false;
    247             }
    248 
    249             // Perform the query via std mysql_query function..
    250             $this->result = @mysql_query($query,$this->dbh);
    251 
    252             // If there is an error then take note of it..
    253             if ( $str = @mysql_error($this->dbh) )
    254             {
    255                 $this->register_error($str);
    256                 $this->show_errors ? trigger_error($str,E_USER_WARNING) : null;
    257                 return false;
    258             }
    259 
    260             // Query was an insert, delete, update, replace
    261             if ( preg_match("/^(insert|delete|update|replace|truncate|drop|create|alter|set|lock|unlock)s+/i",$query) )
    262             {
    263                 $is_insert = true;
    264                 $this->rows_affected = @mysql_affected_rows($this->dbh);
    265 
    266                 // Take note of the insert_id
    267                 if ( preg_match("/^(insert|replace)s+/i",$query) )
    268                 {
    269                     $this->insert_id = @mysql_insert_id($this->dbh);
    270                 }
    271 
    272                 // Return number fo rows affected
    273                 $return_val = $this->rows_affected;
    274             }
    275             // Query was a select
    276             else
    277             {
    278                 $is_insert = false;
    279 
    280                 // Take note of column info
    281                 $i=0;
    282                 while ($i < @mysql_num_fields($this->result))
    283                 {
    284                     $this->col_info[$i] = @mysql_fetch_field($this->result);
    285                     $i++;
    286                 }
    287 
    288                 // Store Query Results
    289                 $num_rows=0;
    290                 while ( $row = @mysql_fetch_object($this->result) )
    291                 {
    292                     // Store relults as an objects within main array
    293                     $this->last_result[$num_rows] = $row;
    294                     $num_rows++;
    295                 }
    296 
    297                 @mysql_free_result($this->result);
    298 
    299                 // Log number of rows the query returned
    300                 $this->num_rows = $num_rows;
    301 
    302                 // Return number of rows selected
    303                 $return_val = $this->num_rows;
    304             }
    305 
    306             // disk caching of queries
    307             $this->store_cache($query,$is_insert);
    308 
    309             // If debug ALL queries
    310             $this->trace || $this->debug_all ? $this->debug() : null ;
    311 
    312             // Keep tack of how long all queries have taken
    313             $this->timer_update_global($this->num_queries);
    314 
    315             // Trace all queries
    316             if ( $this->use_trace_log )
    317             {
    318                 $this->trace_log[] = $this->debug(false);
    319             }
    320 
    321             return $return_val;
    322 
    323         }
    324         
    325         /**********************************************************************
    326         *  Close the active mySQL connection
    327         */
    328 
    329         function disconnect()
    330         {
    331             @mysql_close($this->dbh);    
    332         }
    333 
    334     }
    335   

    //disk_cache_example.php

     1 <?php
     2 
     3     // Standard ezSQL Libs
     4     include_once "../shared/ez_sql_core.php";
     5     include_once "ez_sql_mysql.php";
     6 
     7     // Initialise singleton
     8     $db = new ezSQL_mysql('db_user', 'db_pass', 'db_name');
     9 
    10     // Cache expiry
    11     $db->cache_timeout = 24; // Note: this is hours
    12 
    13     // Specify a cache dir. Path is taken from calling script
    14     $db->cache_dir = 'ezsql_cache';
    15 
    16     // (1. You must create this dir. first!)
    17     // (2. Might need to do chmod 775)
    18 
    19     // Global override setting to turn disc caching off
    20     // (but not on)
    21     $db->use_disk_cache = true;
    22 
    23     // By wrapping up queries you can ensure that the default
    24     // is NOT to cache unless specified
    25     $db->cache_queries = true;
    26 
    27         // At last.. a query!
    28         $db->get_results("SHOW TABLES");
    29         $db->debug();
    30 
    31         // Select * from use
    32         $db->get_results("SELECT * FROM User");
    33         $db->debug();
    34 
    35     // This ensures only the above querys are cached
    36     $db->cache_queries = false;
    37 
    38     // This query is NOT cached
    39     $db->get_results("SELECT * FROM User LIMIT 0,1");
    40     $db->debug();
    41 
    42 /*
    43 
    44     Of course, if you want to cache EVERYTHING just do..
    45 
    46     $db = new ezSQL_mysql('db_user', 'db_pass', 'db_name');
    47     $db->use_disk_cache = true;
    48     $db->cache_queries = true;
    49     $db->cache_timeout = 24;
    50 
    51 */
    52 
    53 ?>

    //ez_sql_core_202console.php

      1 <?php
      2 // =================================================================
      3 // == TJH ==  To provide optional return value as opposed to simple echo 
      4 // == TJH ==  of the $db->vardump  and   $db->debug  functions
      5 
      6 // == TJH ==  Helpful for assigning the output to a var for handling in situations like template
      7 // == TJH ==  engines where you want the debugging output rendered in a particular location.
      8 
      9 // == TJH ==  This latest version 0.2 alpha includes a modification that allows
     10 // == TJH ==  the original dump and debug behaviours to be maintained by default
     11 // == TJH ==  and hopefully be backward compatible with previous ezSQL versions 
     12 
     13 // == TJH ==  USAGE:     $ezdump = print_r($db->vardump($result),true);        
     14 // == TJH ==  USAGE:     $ezconsole = print_r($db->console,true);        
     15 // =================================================================
     16 
     17     /**********************************************************************
     18     *  Author: Justin Vincent (jv@jvmultimedia.com)
     19     *  Web...: http://twitter.com/justinvincent
     20     *  Name..: ezSQL
     21     *  Desc..: ezSQL Core module - database abstraction library to make
     22     *          it very easy to deal with databases.
     23     *
     24     */
     25 
     26     /**********************************************************************
     27     *  ezSQL Constants
     28     */
     29 
     30     define('EZSQL_VERSION','2.02-console');
     31     define('OBJECT','OBJECT',true);
     32     define('ARRAY_A','ARRAY_A',true);
     33     define('ARRAY_N','ARRAY_N',true);
     34     define('EZSQL_CORE_ERROR','ezSQLcore can not be used by itself (it is designed for use by database specific modules).');
     35 
     36 
     37     /**********************************************************************
     38     *  Core class containg common functions to manipulate query result
     39     *  sets once returned
     40     */
     41 
     42     class ezSQLcore
     43     {
     44 
     45         var $trace           = false;  // same as $debug_all
     46         var $debug_all       = false;  // same as $trace
     47         // === TJH === 
     48         var $debug_echo = true;        // == TJH ==  // default now needed for echo of debug function
     49         var $debug_called    = false;
     50         var $vardump_called  = false;
     51         var $show_errors     = true;
     52         var $num_queries     = 0;
     53         var $last_query      = null;
     54         var $last_error      = null;
     55         var $col_info        = null;
     56         var $captured_errors = array();
     57         var $cache_dir       = false;
     58         var $cache_queries   = false;
     59         var $cache_inserts   = false;
     60         var $use_disk_cache  = false;
     61         var $cache_timeout   = 24; // hours
     62 
     63         /**********************************************************************
     64         *  Constructor
     65         */
     66 
     67         function ezSQLcore()
     68         {
     69         }
     70 
     71         /**********************************************************************
     72         *  Connect to DB - over-ridden by specific DB class
     73         */
     74 
     75         function connect()
     76         {
     77             die(EZSQL_CORE_ERROR);
     78         }
     79 
     80         /**********************************************************************
     81         *  Select DB - over-ridden by specific DB class
     82         */
     83 
     84         function select()
     85         {
     86             die(EZSQL_CORE_ERROR);
     87         }
     88 
     89         /**********************************************************************
     90         *  Basic Query    - over-ridden by specific DB class
     91         */
     92 
     93         function query()
     94         {
     95             die(EZSQL_CORE_ERROR);
     96         }
     97 
     98         /**********************************************************************
     99         *  Format a string correctly for safe insert - over-ridden by specific
    100         *  DB class
    101         */
    102 
    103         function escape()
    104         {
    105             die(EZSQL_CORE_ERROR);
    106         }
    107 
    108         /**********************************************************************
    109         *  Return database specific system date syntax
    110         *  i.e. Oracle: SYSDATE Mysql: NOW()
    111         */
    112 
    113         function sysdate()
    114         {
    115             die(EZSQL_CORE_ERROR);
    116         }
    117 
    118         /**********************************************************************
    119         *  Print SQL/DB error - over-ridden by specific DB class
    120         */
    121 
    122         function register_error($err_str)
    123         {
    124             // Keep track of last error
    125             $this->last_error = $err_str;
    126 
    127             // Capture all errors to an error array no matter what happens
    128             $this->captured_errors[] = array
    129             (
    130                 'error_str' => $err_str,
    131                 'query'     => $this->last_query
    132             );
    133         }
    134 
    135         /**********************************************************************
    136         *  Turn error handling on or off..
    137         */
    138 
    139         function show_errors()
    140         {
    141             $this->show_errors = true;
    142         }
    143 
    144         function hide_errors()
    145         {
    146             $this->show_errors = false;
    147         }
    148 
    149         /**********************************************************************
    150         *  Kill cached query results
    151         */
    152 
    153         function flush()
    154         {
    155             // Get rid of these
    156             $this->last_result = null;
    157             $this->col_info = null;
    158             $this->last_query = null;
    159             $this->from_disk_cache = false;
    160         }
    161 
    162         /**********************************************************************
    163         *  Get one variable from the DB - see docs for more detail
    164         */
    165 
    166         function get_var($query=null,$x=0,$y=0)
    167         {
    168 
    169             // Log how the function was called
    170             $this->func_call = "$db->get_var("$query",$x,$y)";
    171 
    172             // If there is a query then perform it if not then use cached results..
    173             if ( $query )
    174             {
    175                 $this->query($query);
    176             }
    177 
    178             // Extract var out of cached results based x,y vals
    179             if ( $this->last_result[$y] )
    180             {
    181                 $values = array_values(get_object_vars($this->last_result[$y]));
    182             }
    183 
    184             // If there is a value return it else return null
    185             return (isset($values[$x]) && $values[$x]!=='')?$values[$x]:null;
    186         }
    187 
    188         /**********************************************************************
    189         *  Get one row from the DB - see docs for more detail
    190         */
    191 
    192         function get_row($query=null,$output=OBJECT,$y=0)
    193         {
    194 
    195             // Log how the function was called
    196             $this->func_call = "$db->get_row("$query",$output,$y)";
    197 
    198             // If there is a query then perform it if not then use cached results..
    199             if ( $query )
    200             {
    201                 $this->query($query);
    202             }
    203 
    204             // If the output is an object then return object using the row offset..
    205             if ( $output == OBJECT )
    206             {
    207                 return $this->last_result[$y]?$this->last_result[$y]:null;
    208             }
    209             // If the output is an associative array then return row as such..
    210             elseif ( $output == ARRAY_A )
    211             {
    212                 return $this->last_result[$y]?get_object_vars($this->last_result[$y]):null;
    213             }
    214             // If the output is an numerical array then return row as such..
    215             elseif ( $output == ARRAY_N )
    216             {
    217                 return $this->last_result[$y]?array_values(get_object_vars($this->last_result[$y])):null;
    218             }
    219             // If invalid output type was specified..
    220             else
    221             {
    222                 $this->print_error(" $db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N");
    223             }
    224 
    225         }
    226 
    227         /**********************************************************************
    228         *  Function to get 1 column from the cached result set based in X index
    229         *  see docs for usage and info
    230         */
    231 
    232         function get_col($query=null,$x=0)
    233         {
    234 
    235             // If there is a query then perform it if not then use cached results..
    236             if ( $query )
    237             {
    238                 $this->query($query);
    239             }
    240 
    241             // Extract the column values
    242             for ( $i=0; $i < count($this->last_result); $i++ )
    243             {
    244                 $new_array[$i] = $this->get_var(null,$x,$i);
    245             }
    246 
    247             return $new_array;
    248         }
    249 
    250 
    251         /**********************************************************************
    252         *  Return the the query as a result set - see docs for more details
    253         */
    254 
    255         function get_results($query=null, $output = OBJECT)
    256         {
    257 
    258             // Log how the function was called
    259             $this->func_call = "$db->get_results("$query", $output)";
    260 
    261             // If there is a query then perform it if not then use cached results..
    262             if ( $query )
    263             {
    264                 $this->query($query);
    265             }
    266 
    267             // Send back array of objects. Each row is an object
    268             if ( $output == OBJECT )
    269             {
    270                 return $this->last_result;
    271             }
    272             elseif ( $output == ARRAY_A || $output == ARRAY_N )
    273             {
    274                 if ( $this->last_result )
    275                 {
    276                     $i=0;
    277                     foreach( $this->last_result as $row )
    278                     {
    279 
    280                         $new_array[$i] = get_object_vars($row);
    281 
    282                         if ( $output == ARRAY_N )
    283                         {
    284                             $new_array[$i] = array_values($new_array[$i]);
    285                         }
    286 
    287                         $i++;
    288                     }
    289 
    290                     return $new_array;
    291                 }
    292                 else
    293                 {
    294                     return array();
    295                 }
    296             }
    297         }
    298 
    299 
    300         /**********************************************************************
    301         *  Function to get column meta data info pertaining to the last query
    302         * see docs for more info and usage
    303         */
    304 
    305         function get_col_info($info_type="name",$col_offset=-1)
    306         {
    307 
    308             if ( $this->col_info )
    309             {
    310                 if ( $col_offset == -1 )
    311                 {
    312                     $i=0;
    313                     foreach($this->col_info as $col )
    314                     {
    315                         $new_array[$i] = $col->{$info_type};
    316                         $i++;
    317                     }
    318                     return $new_array;
    319                 }
    320                 else
    321                 {
    322                     return $this->col_info[$col_offset]->{$info_type};
    323                 }
    324 
    325             }
    326 
    327         }
    328 
    329         /**********************************************************************
    330         *  store_cache
    331         */
    332 
    333         function store_cache($query,$is_insert)
    334         {
    335 
    336             // The would be cache file for this query
    337             $cache_file = $this->cache_dir.'/'.md5($query);
    338 
    339             // disk caching of queries
    340             if ( $this->use_disk_cache && ( $this->cache_queries && ! $is_insert ) || ( $this->cache_inserts && $is_insert ))
    341             {
    342                 if ( ! is_dir($this->cache_dir) )
    343                 {
    344                     $this->register_error("Could not open cache dir: $this->cache_dir");
    345                     $this->show_errors ? trigger_error("Could not open cache dir: $this->cache_dir",E_USER_WARNING) : null;
    346                 }
    347                 else
    348                 {
    349                     // Cache all result values
    350                     $result_cache = array
    351                     (
    352                         'col_info' => $this->col_info,
    353                         'last_result' => $this->last_result,
    354                         'num_rows' => $this->num_rows,
    355                         'return_value' => $this->num_rows,
    356                     );
    357                     error_log ( serialize($result_cache), 3, $cache_file);
    358                 }
    359             }
    360 
    361         }
    362 
    363         /**********************************************************************
    364         *  get_cache
    365         */
    366 
    367         function get_cache($query)
    368         {
    369 
    370             // The would be cache file for this query
    371             $cache_file = $this->cache_dir.'/'.md5($query);
    372 
    373             // Try to get previously cached version
    374             if ( $this->use_disk_cache && file_exists($cache_file) )
    375             {
    376                 // Only use this cache file if less than 'cache_timeout' (hours)
    377                 if ( (time() - filemtime($cache_file)) > ($this->cache_timeout*3600) )
    378                 {
    379                     unlink($cache_file);
    380                 }
    381                 else
    382                 {
    383                     $result_cache = unserialize(file_get_contents($cache_file));
    384 
    385                     $this->col_info = $result_cache['col_info'];
    386                     $this->last_result = $result_cache['last_result'];
    387                     $this->num_rows = $result_cache['num_rows'];
    388 
    389                     $this->from_disk_cache = true;
    390 
    391                     // If debug ALL queries
    392                     $this->trace || $this->debug_all ? $this->debug() : null ;
    393 
    394                     return $result_cache['return_value'];
    395                 }
    396             }
    397 
    398         }
    399 
    400         /**********************************************************************
    401         *  Dumps the contents of any input variable to screen in a nicely
    402         *  formatted and easy to understand way - any type: Object, Var or Array
    403         */
    404 
    405         // === TJH ===  This is hacked to OPTIONALLY generate a "$return_var"                                                                  
    406         // === TJH ===   must also set $db->debug_echo = false; in your script to override default behaviour                        
    407         // === TJH ===   instead of a simple "echo" to the current screen (DEFAULT)                                                            
    408         // === TJH ===    USAGE:     $ezdebug = print_r($db->vardump($result),true);        
    409 
    410         function vardump($mixed='')
    411         {
    412             $return_var .=   "<p><table><tr><td bgcolor=ffffff><blockquote><font color=000090>";
    413             $return_var .=   "<pre><font face=arial>";
    414 
    415             if ( ! $this->vardump_called )
    416             {
    417                 $return_var .=   "<font color=800080><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Variable Dump..</b></font>
    
    ";
    418             }
    419 
    420             $var_type = gettype ($mixed);
    421             $return_var .=  print_r(($mixed?$mixed:"<font color=red>No Value / False</font>"),true);
    422             $return_var .=   "
    
    <b>Type:</b> " . ucfirst($var_type) . "
    ";
    423             $return_var .=   "<b>Last Query</b> [$this->num_queries]<b>:</b> ".($this->last_query?$this->last_query:"NULL")."
    ";
    424             $return_var .=   "<b>Last Function Call:</b> " . ($this->func_call?$this->func_call:"None")."
    ";
    425             $return_var .=   "<b>Last Rows Returned:</b> ".count($this->last_result)."
    ";
    426             $return_var .=   "</font></pre></font></blockquote></td></tr></table>".$this->donation();
    427             $return_var .=   "
    <hr size=1 noshade color=dddddd>";
    428 
    429             $this->vardump_called = true;
    430             if($this->debug_echo){
    431             echo $return_var;
    432             }
    433 
    434             return $return_var;
    435         }
    436 
    437         /**********************************************************************
    438         *  Alias for the above function
    439         */
    440 
    441         function dumpvar($mixed)
    442         {
    443             $this->vardump($mixed);
    444         }
    445 
    446         /**********************************************************************
    447         *  Displays the last query string that was sent to the database & a
    448         * table listing results (if there were any).
    449         * (abstracted into a seperate file to save server overhead).
    450         */
    451 
    452         // === TJH ===  The debug() function is now hacked to OPTIOANLLY create a return result             
    453         // === TJH ===  that can be called as a variable, just changed all "echo"s to "$this->console .= "        
    454         // === TJH ===  this is accessed with "$db->console" obviously                                                         
    455         // === TJH ===  n.b. you must also set $db->debug_echo = false; to override default behaviour        
    456 
    457         function debug($debug_echo)     // === TJH ===   set a default for function to be able to switch "echo" on/off
    458         {
    459                     
    460             //$this->console .=  "<blockquote>"; // === TJH == commented out to change output formatting slightly
    461             // Only show ezSQL credits once..
    462             if ( ! $this->debug_called )
    463             {
    464                 $this->console .=  "<font color=800080 face=arial size=2><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Debug..</b></font><p>
    ";
    465             }
    466 
    467             if ( $this->last_error )
    468             {
    469                 $this->console .=  "<font face=arial size=2 color=000099><b>Last Error --</b> [<font color=000000><b>$this->last_error</b></font>]<p>";
    470             }
    471 
    472             if ( $this->from_disk_cache )
    473             {
    474                 $this->console .=  "<font face=arial size=2 color=000099><b>Results retrieved from disk cache</b></font><p>";
    475             }
    476 
    477             $this->console .=  "<font face=arial size=2 color=000099><b>Query</b> [$this->num_queries] <b>--</b> ";
    478             $this->console .=  "[<font color=000000><b>$this->last_query</b></font>]</font><p>";
    479 
    480             $this->console .=  "<font face=arial size=2 color=000099><b>Query Result..</b></font>";
    481             $this->console .=  "<blockquote>";
    482 
    483             if ( $this->col_info )
    484             {
    485 
    486                 // =====================================================
    487                 // Results top rows
    488 
    489                 $this->console .=  "<table cellpadding=5 cellspacing=1 bgcolor=555555>";
    490                 $this->console .=  "<tr bgcolor=eeeeee><td nowrap valign=bottom><font color=555599 face=arial size=2><b>(row)</b></font></td>";
    491 
    492 
    493                 for ( $i=0; $i < count($this->col_info); $i++ )
    494                 {
    495                 $this->console .=  "<td nowrap align=left valign=top><font size=1 color=555599 face=arial>{$this->col_info[$i]->type} {$this->col_info[$i]->max_length}</font><br><span style='font-family: arial; font-size: 10pt; font-weight: bold;'>{$this->col_info[$i]->name}</span></td>";
    496                 }
    497 
    498                 $this->console .=  "</tr>";
    499 
    500                 // ======================================================
    501                 // print main results
    502 
    503             if ( $this->last_result )
    504             {
    505 
    506                 $i=0;
    507                 foreach ( $this->get_results(null,ARRAY_N) as $one_row )
    508                 {
    509                 $i++;
    510                 $this->console .=  "<tr bgcolor=ffffff><td bgcolor=eeeeee nowrap align=middle><font size=2 color=555599 face=arial>$i</font></td>";
    511 
    512                     foreach ( $one_row as $item )
    513                     {
    514                     $this->console .=  "<td nowrap><font face=arial size=2>$item</font></td>";
    515                     }
    516 
    517                     $this->console .=  "</tr>";
    518                 }
    519 
    520             } // if last result
    521             else
    522             {
    523                 $this->console .=  "<tr bgcolor=ffffff><td colspan=".(count($this->col_info)+1)."><font face=arial size=2>No Results</font></td></tr>";
    524             }
    525 
    526             $this->console .=  "</table>";
    527 
    528             } // if col_info
    529             else
    530             {
    531             $this->console .=  "<font face=arial size=2>No Results</font>";
    532             }
    533 
    534             $this->console .=  "</blockquote></blockquote>";
    535             $this->console .=  $this->donation();
    536             $this->console .=  "<hr noshade color=dddddd size=1>";
    537 
    538             // == TJH ==  more -- to try to make backward compatible with a default param that defaults to echo 
    539             if($this->debug_echo){
    540             echo $this->console;
    541             }
    542         
    543             $this->debug_called = true;
    544         //echo "Something tested";   // == TJH == just some breadcrumbs for testing
    545         }
    546 
    547 
    548 
    549         /**********************************************************************
    550         *  Naughty little function to ask for some remuniration!
    551         */
    552 
    553         function donation()
    554         {
    555             return "<font size=1 face=arial color=000000>If ezSQL has helped <a href="https://www.paypal.com/xclick/business=justin%40justinvincent.com&item_name=ezSQL&no_note=1&tax=0" style="color: 0000CC;">make a donation!?</a> &nbsp;&nbsp;<!--[ go on! you know you want to! ]--></font>";
    556         }
    557 
    558     }
    559 
    560 ?>

    //ez_sql_core_2.1_debughack_0.2alpha.php

      1 <?php
      2 // =================================================================
      3 // == TJH ==  To provide optional return value as opposed to simple echo 
      4 // == TJH ==  of the $db->vardump  and   $db->debug  functions
      5 
      6 // == TJH ==  Helpful for assigning the output to a var for handling in situations like template
      7 // == TJH ==  engines where you want the debugging output rendered in a particular location.
      8 
      9 // == TJH ==  This latest version 0.2 alpha includes a modification that allows
     10 // == TJH ==  the original dump and debug behaviours to be maintained by default
     11 // == TJH ==  and hopefully be backward compatible with previous ezSQL versions 
     12 
     13 // == TJH ==  USAGE:     $ezdump = print_r($db->vardump($result),true);        
     14 // == TJH ==  USAGE:     $ezconsole = print_r($db->console,true);        
     15   
     16 // ===========   n.b. for TBS template engine users  ==============================
     17 // === TJH ===  This is hacked to enable an ezSQL pop-up debug console    from a TBS template page    
     18 // === TJH ===  The following steps need to be taken:                
     19 
     20 // === TJH ===      (1) Set $db->debug_all = true; // in your .php file
     21 // === TJH ===           and $db->debug_echo = false; // in your .php file
     22 
     23 // === TJH ===       (2) Add the following javascript to top of your html    
     24 /*
     25 <ezdebugconsole>
     26     [onload_1;block=ezdebugconsole;when [var.db.debug_all]=1]
     27     <SCRIPT LANGUAGE="JavaScript">
     28     if(self.name == ''){var title = 'Console';}
     29     else{var title = 'Console_' + self.name;}
     30     newWindow = window.open("",title.value,"width=550,height=650,resizable,scrollbars=yes");
     31     newWindow.document.write("<HTML><HEAD><TITLE>ezSQL Debug [var..script_name;htmlconv=js]</TITLE></HEAD><BODY bgcolor=#e8e8e8>");
     32 //    newWindow.document.write("<b>Debug for [var..script_name;htmlconv=js]</b><BR />");
     33     newWindow.document.write("<table border=0 width='100%'>");
     34     newWindow.document.write("[var.ezdebug;htmlconv=js]");
     35     newWindow.document.write("</body>
    </html>
    ");
     36     </script>
     37 </ezdebugconsole>
     38 */    
     39 
     40 // === TJH ===      (3) debug data is called with $db->console         
     41 // === TJH ===          Use something like                     
     42 // === TJH ===          $ezdebug = print_r($db->console,true);        
     43 // === TJH ===          to stuff the debug data into a PHP var        
     44 // === TJH ===                                                      
     45 // === TJH ===  n.b. Don't forget to slurp the slug of javascript     
     46 // === TJH ===       at the top of the .html template page            
     47 // === TJH ===       you'll need to hack it if you're going to        
     48 // === TJH ===       use it other than with TBS tempalte engine.    
     49 // === TJH ===                                                      
     50 // === TJH ===  Search this file for "TJH" comments to find changes    
     51 // === TJH ===  You can contact TJH via http://tomhenry.us/            
     52 // =================================================================
     53 
     54     /**********************************************************************
     55     *  Author: Justin Vincent (jv@jvmultimedia.com)
     56     *  Web...: http://twitter.com/justinvincent
     57     *  Name..: ezSQL
     58     *  Desc..: ezSQL Core module - database abstraction library to make
     59     *          it very easy to deal with databases.
     60     *
     61     */
     62 
     63     /**********************************************************************
     64     *  ezSQL Constants
     65     */
     66 
     67     define('EZSQL_VERSION','2.1-console');  // === TJH === added an identifying  flag to the version number
     68     define('OBJECT','OBJECT',true);
     69     define('ARRAY_A','ARRAY_A',true);
     70     define('ARRAY_N','ARRAY_N',true);
     71     define('EZSQL_CORE_ERROR','ezSQLcore can not be used by itself (it is designed for use by database specific modules).');
     72 
     73 
     74     /**********************************************************************
     75     *  Core class containg common functions to manipulate query result
     76     *  sets once returned
     77     */
     78 
     79     class ezSQLcore
     80     {
     81 
     82         var $trace           = false;  // same as $debug_all
     83         var $debug_all       = false;  // same as $trace
     84         
     85         // === TJH === 
     86         var $debug_echo = true;        // == TJH ==  // default now needed for echo of debug function
     87         
     88         var $debug_called    = false;
     89         var $vardump_called  = false;
     90         var $show_errors     = true;
     91         var $num_queries     = 0;
     92         var $last_query      = null;
     93         var $last_error      = null;
     94         var $col_info        = null;
     95         var $captured_errors = array();
     96 
     97         /**********************************************************************
     98         *  Constructor
     99         */
    100 
    101         function ezSQLcore()
    102         {
    103         }
    104 
    105         /**********************************************************************
    106         *  Connect to DB - over-ridden by specific DB class
    107         */
    108 
    109         function connect()
    110         {
    111             die(EZSQL_CORE_ERROR);
    112         }
    113 
    114         /**********************************************************************
    115         *  Select DB - over-ridden by specific DB class
    116         */
    117 
    118         function select()
    119         {
    120             die(EZSQL_CORE_ERROR);
    121         }
    122 
    123         /**********************************************************************
    124         *  Basic Query    - over-ridden by specific DB class
    125         */
    126 
    127         function query()
    128         {
    129             die(EZSQL_CORE_ERROR);
    130         }
    131 
    132         /**********************************************************************
    133         *  Format a string correctly for safe insert - over-ridden by specific
    134         *  DB class
    135         */
    136 
    137         function escape()
    138         {
    139             die(EZSQL_CORE_ERROR);
    140         }
    141 
    142         /**********************************************************************
    143         *  Return database specific system date syntax
    144         *  i.e. Oracle: SYSDATE Mysql: NOW()
    145         */
    146 
    147         function sysdate()
    148         {
    149             die(EZSQL_CORE_ERROR);
    150         }
    151 
    152         /**********************************************************************
    153         *  Print SQL/DB error - over-ridden by specific DB class
    154         */
    155 
    156         function register_error($err_str)
    157         {
    158             // Keep track of last error
    159             $this->last_error = $err_str;
    160 
    161             // Capture all errors to an error array no matter what happens
    162             $this->captured_errors[] = array
    163             (
    164                 'error_str' => $err_str,
    165                 'query'     => $this->last_query
    166             );
    167         }
    168 
    169         /**********************************************************************
    170         *  Turn error handling on or off..
    171         */
    172 
    173         function show_errors()
    174         {
    175             $this->show_errors = true;
    176         }
    177 
    178         function hide_errors()
    179         {
    180             $this->show_errors = false;
    181         }
    182 
    183         /**********************************************************************
    184         *  Kill cached query results
    185         */
    186 
    187         function flush()
    188         {
    189             // Get rid of these
    190             $this->last_result = null;
    191             $this->col_info = null;
    192             $this->last_query = null;
    193             $this->from_disk_cache = false;
    194         }
    195 
    196         /**********************************************************************
    197         *  Get one variable from the DB - see docs for more detail
    198         */
    199 
    200         function get_var($query=null,$x=0,$y=0)
    201         {
    202 
    203             // Log how the function was called
    204             $this->func_call = "$db->get_var("$query",$x,$y)";
    205 
    206             // If there is a query then perform it if not then use cached results..
    207             if ( $query )
    208             {
    209                 $this->query($query);
    210             }
    211 
    212             // Extract var out of cached results based x,y vals
    213             if ( $this->last_result[$y] )
    214             {
    215                 $values = array_values(get_object_vars($this->last_result[$y]));
    216             }
    217 
    218             // If there is a value return it else return null
    219             return (isset($values[$x]) && $values[$x]!=='')?$values[$x]:null;
    220         }
    221 
    222         /**********************************************************************
    223         *  Get one row from the DB - see docs for more detail
    224         */
    225 
    226         function get_row($query=null,$output=OBJECT,$y=0)
    227         {
    228 
    229             // Log how the function was called
    230             $this->func_call = "$db->get_row("$query",$output,$y)";
    231 
    232             // If there is a query then perform it if not then use cached results..
    233             if ( $query )
    234             {
    235                 $this->query($query);
    236             }
    237 
    238             // If the output is an object then return object using the row offset..
    239             if ( $output == OBJECT )
    240             {
    241                 return $this->last_result[$y]?$this->last_result[$y]:null;
    242             }
    243             // If the output is an associative array then return row as such..
    244             elseif ( $output == ARRAY_A )
    245             {
    246                 return $this->last_result[$y]?get_object_vars($this->last_result[$y]):null;
    247             }
    248             // If the output is an numerical array then return row as such..
    249             elseif ( $output == ARRAY_N )
    250             {
    251                 return $this->last_result[$y]?array_values(get_object_vars($this->last_result[$y])):null;
    252             }
    253             // If invalid output type was specified..
    254             else
    255             {
    256                 $this->print_error(" $db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N");
    257             }
    258 
    259         }
    260 
    261         /**********************************************************************
    262         *  Function to get 1 column from the cached result set based in X index
    263         *  see docs for usage and info
    264         */
    265 
    266         function get_col($query=null,$x=0)
    267         {
    268 
    269             // If there is a query then perform it if not then use cached results..
    270             if ( $query )
    271             {
    272                 $this->query($query);
    273             }
    274 
    275             // Extract the column values
    276             for ( $i=0; $i < count($this->last_result); $i++ )
    277             {
    278                 $new_array[$i] = $this->get_var(null,$x,$i);
    279             }
    280 
    281             return $new_array;
    282         }
    283 
    284 
    285         /**********************************************************************
    286         *  Return the the query as a result set - see docs for more details
    287         */
    288 
    289         function get_results($query=null, $output = OBJECT)
    290         {
    291 
    292             // Log how the function was called
    293             $this->func_call = "$db->get_results("$query", $output)";
    294 
    295             // If there is a query then perform it if not then use cached results..
    296             if ( $query )
    297             {
    298                 $this->query($query);
    299             }
    300 
    301             // Send back array of objects. Each row is an object
    302             if ( $output == OBJECT )
    303             {
    304                 return $this->last_result;
    305             }
    306             elseif ( $output == ARRAY_A || $output == ARRAY_N )
    307             {
    308                 if ( $this->last_result )
    309                 {
    310                     $i=0;
    311                     foreach( $this->last_result as $row )
    312                     {
    313 
    314                         $new_array[$i] = get_object_vars($row);
    315 
    316                         if ( $output == ARRAY_N )
    317                         {
    318                             $new_array[$i] = array_values($new_array[$i]);
    319                         }
    320 
    321                         $i++;
    322                     }
    323 
    324                     return $new_array;
    325                 }
    326                 else
    327                 {
    328                     return array();
    329                 }
    330             }
    331         }
    332 
    333 
    334         /**********************************************************************
    335         *  Function to get column meta data info pertaining to the last query
    336         * see docs for more info and usage
    337         */
    338 
    339         function get_col_info($info_type="name",$col_offset=-1)
    340         {
    341 
    342             if ( $this->col_info )
    343             {
    344                 if ( $col_offset == -1 )
    345                 {
    346                     $i=0;
    347                     foreach($this->col_info as $col )
    348                     {
    349                         $new_array[$i] = $col->{$info_type};
    350                         $i++;
    351                     }
    352                     return $new_array;
    353                 }
    354                 else
    355                 {
    356                     return $this->col_info[$col_offset]->{$info_type};
    357                 }
    358 
    359             }
    360 
    361         }
    362 
    363 
    364         /**********************************************************************
    365         *  Dumps the contents of any input variable to screen in a nicely
    366         *  formatted and easy to understand way - any type: Object, Var or Array
    367         */
    368         // === TJH ===  This is hacked to OPTIONALLY generate a "$return_var"                                                                  
    369         // === TJH ===   must also set $db->debug_echo = false; in your script to override default behaviour                        
    370         // === TJH ===   instead of a simple "echo" to the current screen (DEFAULT)                                                            
    371         // === TJH ===    USAGE:     $ezdebug = print_r($db->vardump($result),true);        
    372         function vardump($mixed='')
    373         {
    374             $return_var .=   "<p><table><tr><td bgcolor=ffffff><blockquote><font color=000090>";
    375             $return_var .=   "<pre><font face=arial>";
    376 
    377             if ( ! $this->vardump_called )
    378             {
    379                 $return_var .=   "<font color=800080><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Variable Dump..</b></font>
    
    ";
    380             }
    381 
    382             $var_type = gettype ($mixed);
    383             $return_var .=  print_r(($mixed?$mixed:"<font color=red>No Value / False</font>"),true);
    384             $return_var .=   "
    
    <b>Type:</b> " . ucfirst($var_type) . "
    ";
    385             $return_var .=   "<b>Last Query</b> [$this->num_queries]<b>:</b> ".($this->last_query?$this->last_query:"NULL")."
    ";
    386             $return_var .=   "<b>Last Function Call:</b> " . ($this->func_call?$this->func_call:"None")."
    ";
    387             $return_var .=   "<b>Last Rows Returned:</b> ".count($this->last_result)."
    ";
    388             $return_var .=   "</font></pre></font></blockquote></td></tr></table>".$this->donation();
    389             $return_var .=   "
    <hr size=1 noshade color=dddddd>";
    390 
    391             $this->vardump_called = true;
    392 
    393             if($this->debug_echo){
    394             echo $return_var;
    395             }
    396 
    397             return $return_var;
    398         }
    399 
    400         /**********************************************************************
    401         *  Alias for the above function
    402         */
    403 
    404         function dumpvar($mixed)
    405         {
    406             $this->vardump($mixed);
    407         }
    408 
    409         /**********************************************************************
    410         *  Displays the last query string that was sent to the database & a
    411         * table listing results (if there were any).
    412         * (abstracted into a seperate file to save server overhead).
    413         */
    414 
    415         // === TJH ===  The debug() function is now hacked to OPTIOANLLY create a return result             
    416         // === TJH ===  that can be called as a variable, just changed all "echo"s to "$this->console .= "        
    417         // === TJH ===  this is accessed with "$db->console" obviously                                                         
    418         // === TJH ===  n.b. you must also set $db->debug_echo = false; to override default behaviour        
    419 
    420         function debug($debug_echo)     // === TJH ===   set a default for function to be able to switch "echo" on/off
    421         {
    422                     
    423             //$this->console .=  "<blockquote>"; // === TJH == commented out to change output formatting slightly
    424 
    425             // Only show ezSQL credits once..
    426             if ( ! $this->debug_called )
    427             {
    428                 $this->console .=  "<font color=800080 face=arial size=2><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Debug..</b></font><p>
    ";
    429             }
    430 
    431             if ( $this->last_error )
    432             {
    433                 $this->console .=  "<font face=arial size=2 color=000099><b>Last Error --</b> [<font color=000000><b>$this->last_error</b></font>]<p>";
    434             }
    435 
    436             if ( $this->from_disk_cache )
    437             {
    438                 $this->console .=  "<font face=arial size=2 color=000099><b>Results retrieved from disk cache</b></font><p>";
    439             }
    440 
    441             $this->console .=  "<font face=arial size=2 color=000099><b>Query</b> [$this->num_queries] <b>--</b> ";
    442             $this->console .=  "[<font color=000000><b>$this->last_query</b></font>]</font><p>";
    443 
    444             $this->console .=  "<font face=arial size=2 color=000099><b>Query Result..</b></font>";
    445             $this->console .=  "<blockquote>";
    446 
    447             if ( $this->col_info )
    448             {
    449 
    450                 // =====================================================
    451                 // Results top rows
    452 
    453                 $this->console .=  "<table cellpadding=5 cellspacing=1 bgcolor=555555>";
    454                 $this->console .=  "<tr bgcolor=eeeeee><td nowrap valign=bottom><font color=555599 face=arial size=2><b>(row)</b></font></td>";
    455 
    456 
    457                 for ( $i=0; $i < count($this->col_info); $i++ )
    458                 {
    459                 $this->console .=  "<td nowrap align=left valign=top><font size=1 color=555599 face=arial>{$this->col_info[$i]->type} {$this->col_info[$i]->max_length}</font><br><span style='font-family: arial; font-size: 10pt; font-weight: bold;'>{$this->col_info[$i]->name}</span></td>";
    460                 }
    461 
    462                 $this->console .=  "</tr>";
    463 
    464                 // ======================================================
    465                 // print main results
    466 
    467             if ( $this->last_result )
    468             {
    469 
    470                 $i=0;
    471                 foreach ( $this->get_results(null,ARRAY_N) as $one_row )
    472                 {
    473                 $i++;
    474                 $this->console .=  "<tr bgcolor=ffffff><td bgcolor=eeeeee nowrap align=middle><font size=2 color=555599 face=arial>$i</font></td>";
    475 
    476                     foreach ( $one_row as $item )
    477                     {
    478                     $this->console .=  "<td nowrap><font face=arial size=2>$item</font></td>";
    479                     }
    480 
    481                     $this->console .=  "</tr>";
    482                 }
    483 
    484             } // if last result
    485             else
    486             {
    487                 $this->console .=  "<tr bgcolor=ffffff><td colspan=".(count($this->col_info)+1)."><font face=arial size=2>No Results</font></td></tr>";
    488             }
    489 
    490             $this->console .=  "</table>";
    491 
    492             } // if col_info
    493             else
    494             {
    495             $this->console .=  "<font face=arial size=2>No Results</font>";
    496             }
    497 
    498             $this->console .=  "</blockquote></blockquote>";
    499             $this->console .=  $this->donation();
    500             $this->console .=  "<hr noshade color=dddddd size=1>";
    501 
    502             // == TJH ==  more -- to try to make backward compatible with a default param that defaults to echo 
    503             if($this->debug_echo){
    504             echo $this->console;
    505             }
    506         
    507             $this->debug_called = true;
    508         //echo "Something tested";   // == TJH == just some breadcrumbs for testing
    509         }
    510 
    511 
    512 
    513         /**********************************************************************
    514         *  Naughty little function to ask for some remuniration!
    515         */
    516 
    517         function donation()
    518         {
    519             return "<font size=1 face=arial color=000000>If ezSQL has helped <a href="https://www.paypal.com/xclick/business=justin%40justinvincent.com&item_name=ezSQL&no_note=1&tax=0" style="color: 0000CC;">make a donation!?</a> &nbsp;&nbsp;<!--[ go on! you know you want to! ]--></font>";
    520         }
    521 
    522     }
    523 
    524 ?>

    readme_debughack_0.2alpha.txt

    // =================================================================
    // =================================================================
    // == TJH == ezSQL Debug Console version 0.2-alpha ===============================
    // =================================================================
    // =================================================================
    // == TJH == To provide optional return value as opposed to simple echo
    // == TJH == of the $db->vardump and $db->debug functions

    // == TJH == Helpful for assigning the output to a var for handling in situations like template
    // == TJH == engines where you want the debugging output rendered in a particular location.

    // == TJH == This latest version 0.2 alpha includes a modification that allows
    // == TJH == the original dump and debug behaviours to be maintained by default
    // == TJH == and hopefully be backward compatible with previous ezSQL versions

    // == TJH == n.b. set $db->debug_all = true; // in your .php file
    // == TJH == and $db->debug_echo = false; // in your .php file

    // == TJH == USAGE: $ezdump = print_r($db->vardump($result),true);
    // == TJH == USAGE: $ezdebug = print_r($db->console,true);
    // =================================================================
    // =================================================================

    // =================================================================
    // =========== n.b. for TBS template engine users ==============================
    // === TJH === This is hacked to enable an ezSQL pop-up debug console from a TBS template page
    // === TJH === The following steps need to be taken:

    // === TJH === (1) Set $db->debug_all = true; // in your .php file
    // === TJH === and $db->debug_echo = false; // in your .php file

    // === TJH === (2) Add the following javascript to top of your html
    /*
    <ezdebugconsole>
    [onload_1;block=ezdebugconsole;when [var.db.debug_all]=1]
    <SCRIPT LANGUAGE="JavaScript">
    if(self.name == ''){var title = 'Console';}
    else{var title = 'Console_' + self.name;}
    newWindow = window.open("",title.value,"width=550,height=650,resizable,scrollbars=yes");
    newWindow.document.write("<HTML><HEAD><TITLE>ezSQL Debug [var..script_name;htmlconv=js]</TITLE></HEAD><BODY bgcolor=#e8e8e8>");
    // newWindow.document.write("<b>Debug for [var..script_name;htmlconv=js]</b><BR />");
    newWindow.document.write("<table border=0 width='100%'>");
    newWindow.document.write("[var.ezdebug;htmlconv=js]");
    newWindow.document.write("</body> </html> ");
    </script>
    </ezdebugconsole>
    */

    // === TJH === (3) debug data is called with $db->console
    // === TJH === Use something like
    // === TJH === $ezdebug = print_r($db->console,true);
    // === TJH === to stuff the debug data into a PHP var
    // === TJH ===
    // === TJH === n.b. Don't forget to slurp the slug of javascript
    // === TJH === at the top of the .html template page
    // === TJH === you'll need to hack it if you're going to
    // === TJH === use it other than with TBS tempalte engine.
    // === TJH ===
    // === TJH === Search this file for "TJH" comments to find changes
    // === TJH === You can contact TJH via http://tomhenry.us/
    // =================================================================

  • 相关阅读:
    简洁又漂亮的单网页404页源码(html格式404源码)
    运行bee run之后出现的错误以及解决方法
    window beego 安装出现的错误
    golang gin框架 使用swagger生成api文档
    go语言切片作为函数参数
    Go中函数接收器不能改变接收者的地址
    docker 删除none镜像
    redis下载安装
    git切换分支
    angular自定义验证器添加入模板驱动表单
  • 原文地址:https://www.cnblogs.com/lin3615/p/3800243.html
Copyright © 2011-2022 走看看