ezSQL 数据库操作类
http://justinvincent.com
官网,一切尽在里面的下载帮助文件中,妙哉也!!
ez_sql_core.php
<?php /**********************************************************************
* Author: Justin Vincent (jv@vip.ie)
* Web...: http://justinvincent.com
* Name..: ezSQL
* Desc..: ezSQL Core module - database abstraction library to make
* it very easy to deal with databases. ezSQLcore can not be used by
* itself (it is designed for use by database specific modules).
*
*/ /**********************************************************************
* ezSQL Constants
*/ define('EZSQL_VERSION','2.17');
define('OBJECT','OBJECT',true);
define('ARRAY_A','ARRAY_A',true);
define('ARRAY_N','ARRAY_N',true); /**********************************************************************
* Core class containg common functions to manipulate query result
* sets once returned
*/ class ezSQLcore
{ var $trace = false; // same as $debug_all
var $debug_all = false; // same as $trace
var $debug_called = false;
var $vardump_called = false;
var $show_errors = true;
var $num_queries = 0;
var $last_query = null;
var $last_error = null;
var $col_info = null;
var $captured_errors = array();
var $cache_dir = false;
var $cache_queries = false;
var $cache_inserts = false;
var $use_disk_cache = false;
var $cache_timeout = 24; // hours
var $timers = array();
var $total_query_time = 0;
var $db_connect_time = 0;
var $trace_log = array();
var $use_trace_log = false;
var $sql_log_file = false;
var $do_profile = false;
var $profile_times = array(); // == TJH == default now needed for echo of debug function
var $debug_echo_is_on = true; /**********************************************************************
* Constructor
*/ function ezSQLcore()
{
} /**********************************************************************
* Get host and port from an "host:port" notation.
* Returns array of host and port. If port is omitted, returns $default
*/ function get_host_port( $host, $default = false )
{
$port = $default;
if ( false !== strpos( $host, ':' ) ) {
list( $host, $port ) = explode( ':', $host );
$port = (int) $port;
}
return array( $host, $port );
} /**********************************************************************
* Print SQL/DB error - over-ridden by specific DB class
*/ function register_error($err_str)
{
// Keep track of last error
$this->last_error = $err_str; // Capture all errors to an error array no matter what happens
$this->captured_errors[] = array
(
'error_str' => $err_str,
'query' => $this->last_query
);
} /**********************************************************************
* Turn error handling on or off..
*/ function show_errors()
{
$this->show_errors = true;
} function hide_errors()
{
$this->show_errors = false;
} /**********************************************************************
* Kill cached query results
*/ function flush()
{
// Get rid of these
$this->last_result = null;
$this->col_info = null;
$this->last_query = null;
$this->from_disk_cache = false;
} /**********************************************************************
* Get one variable from the DB - see docs for more detail
*/ function get_var($query=null,$x=0,$y=0)
{ // Log how the function was called
$this->func_call = "\$db->get_var(\"$query\",$x,$y)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Extract var out of cached results based x,y vals
if ( $this->last_result[$y] )
{
$values = array_values(get_object_vars($this->last_result[$y]));
} // If there is a value return it else return null
return (isset($values[$x]) && $values[$x]!=='')?$values[$x]:null;
} /**********************************************************************
* Get one row from the DB - see docs for more detail
*/ function get_row($query=null,$output=OBJECT,$y=0)
{ // Log how the function was called
$this->func_call = "\$db->get_row(\"$query\",$output,$y)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // If the output is an object then return object using the row offset..
if ( $output == OBJECT )
{
return $this->last_result[$y]?$this->last_result[$y]:null;
}
// If the output is an associative array then return row as such..
elseif ( $output == ARRAY_A )
{
return $this->last_result[$y]?get_object_vars($this->last_result[$y]):null;
}
// If the output is an numerical array then return row as such..
elseif ( $output == ARRAY_N )
{
return $this->last_result[$y]?array_values(get_object_vars($this->last_result[$y])):null;
}
// If invalid output type was specified..
else
{
$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;
} } /**********************************************************************
* Function to get 1 column from the cached result set based in X index
* see docs for usage and info
*/ function get_col($query=null,$x=0)
{ $new_array = array(); // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Extract the column values
for ( $i=0; $i < count($this->last_result); $i++ )
{
$new_array[$i] = $this->get_var(null,$x,$i);
} return $new_array;
} /**********************************************************************
* Return the the query as a result set - see docs for more details
*/ function get_results($query=null, $output = OBJECT)
{ // Log how the function was called
$this->func_call = "\$db->get_results(\"$query\", $output)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Send back array of objects. Each row is an object
if ( $output == OBJECT )
{
return $this->last_result;
}
elseif ( $output == ARRAY_A || $output == ARRAY_N )
{
if ( $this->last_result )
{
$i=0;
foreach( $this->last_result as $row )
{ $new_array[$i] = get_object_vars($row); if ( $output == ARRAY_N )
{
$new_array[$i] = array_values($new_array[$i]);
} $i++;
} return $new_array;
}
else
{
return array();
}
}
} /**********************************************************************
* Function to get column meta data info pertaining to the last query
* see docs for more info and usage
*/ function get_col_info($info_type="name",$col_offset=-1)
{ if ( $this->col_info )
{
if ( $col_offset == -1 )
{
$i=0;
foreach($this->col_info as $col )
{
$new_array[$i] = $col->{$info_type};
$i++;
}
return $new_array;
}
else
{
return $this->col_info[$col_offset]->{$info_type};
} } } /**********************************************************************
* store_cache
*/ function store_cache($query,$is_insert)
{ // The would be cache file for this query
$cache_file = $this->cache_dir.'/'.md5($query); // disk caching of queries
if ( $this->use_disk_cache && ( $this->cache_queries && ! $is_insert ) || ( $this->cache_inserts && $is_insert ))
{
if ( ! is_dir($this->cache_dir) )
{
$this->register_error("Could not open cache dir: $this->cache_dir");
$this->show_errors ? trigger_error("Could not open cache dir: $this->cache_dir",E_USER_WARNING) : null;
}
else
{
// Cache all result values
$result_cache = array
(
'col_info' => $this->col_info,
'last_result' => $this->last_result,
'num_rows' => $this->num_rows,
'return_value' => $this->num_rows,
);
file_put_contents($cache_file, serialize($result_cache));
if( file_exists($cache_file . ".updating") )
unlink($cache_file . ".updating");
}
} } /**********************************************************************
* get_cache
*/ function get_cache($query)
{ // The would be cache file for this query
$cache_file = $this->cache_dir.'/'.md5($query); // Try to get previously cached version
if ( $this->use_disk_cache && file_exists($cache_file) )
{
// Only use this cache file if less than 'cache_timeout' (hours)
if ( (time() - filemtime($cache_file)) > ($this->cache_timeout*3600) &&
!(file_exists($cache_file . ".updating") && (time() - filemtime($cache_file . ".updating") < 60)) )
{
touch($cache_file . ".updating"); // Show that we in the process of updating the cache
}
else
{
$result_cache = unserialize(file_get_contents($cache_file)); $this->col_info = $result_cache['col_info'];
$this->last_result = $result_cache['last_result'];
$this->num_rows = $result_cache['num_rows']; $this->from_disk_cache = true; // If debug ALL queries
$this->trace || $this->debug_all ? $this->debug() : null ; return $result_cache['return_value'];
}
} } /**********************************************************************
* Dumps the contents of any input variable to screen in a nicely
* formatted and easy to understand way - any type: Object, Var or Array
*/ function vardump($mixed='')
{ // Start outup buffering
ob_start(); echo "<p><table><tr><td bgcolor=ffffff><blockquote><font color=000090>";
echo "<pre><font face=arial>"; if ( ! $this->vardump_called )
{
echo "<font color=800080><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Variable Dump..</b></font>\n\n";
} $var_type = gettype ($mixed);
print_r(($mixed?$mixed:"<font color=red>No Value / False</font>"));
echo "\n\n<b>Type:</b> " . ucfirst($var_type) . "\n";
echo "<b>Last Query</b> [$this->num_queries]<b>:</b> ".($this->last_query?$this->last_query:"NULL")."\n";
echo "<b>Last Function Call:</b> " . ($this->func_call?$this->func_call:"None")."\n";
echo "<b>Last Rows Returned:</b> ".count($this->last_result)."\n";
echo "</font></pre></font></blockquote></td></tr></table>".$this->donation();
echo "\n<hr size=1 noshade color=dddddd>"; // Stop output buffering and capture debug HTML
$html = ob_get_contents();
ob_end_clean(); // Only echo output if it is turned on
if ( $this->debug_echo_is_on )
{
echo $html;
} $this->vardump_called = true; return $html; } /**********************************************************************
* Alias for the above function
*/ function dumpvar($mixed)
{
$this->vardump($mixed);
} /**********************************************************************
* Displays the last query string that was sent to the database & a
* table listing results (if there were any).
* (abstracted into a seperate file to save server overhead).
*/ function debug($print_to_screen=true)
{ // Start outup buffering
ob_start(); echo "<blockquote>"; // Only show ezSQL credits once..
if ( ! $this->debug_called )
{
echo "<font color=800080 face=arial size=2><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Debug..</b></font><p>\n";
} if ( $this->last_error )
{
echo "<font face=arial size=2 color=000099><b>Last Error --</b> [<font color=000000><b>$this->last_error</b></font>]<p>";
} if ( $this->from_disk_cache )
{
echo "<font face=arial size=2 color=000099><b>Results retrieved from disk cache</b></font><p>";
} echo "<font face=arial size=2 color=000099><b>Query</b> [$this->num_queries] <b>--</b> ";
echo "[<font color=000000><b>$this->last_query</b></font>]</font><p>"; echo "<font face=arial size=2 color=000099><b>Query Result..</b></font>";
echo "<blockquote>"; if ( $this->col_info )
{ // =====================================================
// Results top rows echo "<table cellpadding=5 cellspacing=1 bgcolor=555555>";
echo "<tr bgcolor=eeeeee><td nowrap valign=bottom><font color=555599 face=arial size=2><b>(row)</b></font></td>"; for ( $i=0; $i < count($this->col_info); $i++ )
{
/* when selecting count(*) the maxlengh is not set, size is set instead. */
echo "<td nowrap align=left valign=top><font size=1 color=555599 face=arial>{$this->col_info[$i]->type}";
if (!isset($this->col_info[$i]->max_length))
{
echo "{$this->col_info[$i]->size}";
} else {
echo "{$this->col_info[$i]->max_length}";
}
echo "</font><br><span style='font-family: arial; font-size: 10pt; font-weight: bold;'>{$this->col_info[$i]->name}</span></td>";
} echo "</tr>"; // ======================================================
// print main results if ( $this->last_result )
{ $i=0;
foreach ( $this->get_results(null,ARRAY_N) as $one_row )
{
$i++;
echo "<tr bgcolor=ffffff><td bgcolor=eeeeee nowrap align=middle><font size=2 color=555599 face=arial>$i</font></td>"; foreach ( $one_row as $item )
{
echo "<td nowrap><font face=arial size=2>$item</font></td>";
} echo "</tr>";
} } // if last result
else
{
echo "<tr bgcolor=ffffff><td colspan=".(count($this->col_info)+1)."><font face=arial size=2>No Results</font></td></tr>";
} echo "</table>"; } // if col_info
else
{
echo "<font face=arial size=2>No Results</font>";
} echo "</blockquote></blockquote>".$this->donation()."<hr noshade color=dddddd size=1>"; // Stop output buffering and capture debug HTML
$html = ob_get_contents();
ob_end_clean(); // Only echo output if it is turned on
if ( $this->debug_echo_is_on && $print_to_screen)
{
echo $html;
} $this->debug_called = true; return $html; } /**********************************************************************
* Naughty little function to ask for some remuniration!
*/ function donation()
{
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> <!--[ go on! you know you want to! ]--></font>";
} /**********************************************************************
* Timer related functions
*/ function timer_get_cur()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
} function timer_start($timer_name)
{
$this->timers[$timer_name] = $this->timer_get_cur();
} function timer_elapsed($timer_name)
{
return round($this->timer_get_cur() - $this->timers[$timer_name],2);
} function timer_update_global($timer_name)
{
if ( $this->do_profile )
{
$this->profile_times[] = array
(
'query' => $this->last_query,
'time' => $this->timer_elapsed($timer_name)
);
} $this->total_query_time += $this->timer_elapsed($timer_name);
} /**********************************************************************
* Creates a SET nvp sql string from an associative array (and escapes all values)
*
* Usage:
*
* $db_data = array('login'=>'jv','email'=>'jv@vip.ie', 'user_id' => 1, 'created' => 'NOW()');
*
* $db->query("INSERT INTO users SET ".$db->get_set($db_data));
*
* ...OR...
*
* $db->query("UPDATE users SET ".$db->get_set($db_data)." WHERE user_id = 1");
*
* Output:
*
* login = 'jv', email = 'jv@vip.ie', user_id = 1, created = NOW()
*/ function get_set($params)
{
if( !is_array( $params ) )
{
$this->register_error( 'get_set() parameter invalid. Expected array in '.__FILE__.' on line '.__LINE__);
return;
}
$sql = array();
foreach ( $params as $field => $val )
{
if ( $val === 'true' || $val === true )
$val = 1;
if ( $val === 'false' || $val === false )
$val = 0; switch( $val ){
case 'NOW()' :
case 'NULL' :
$sql[] = "$field = $val";
break;
default :
$sql[] = "$field = '".$this->escape( $val )."'";
}
} return implode( ', ' , $sql );
} }
//ez_sql_mysql.php
<?php /**********************************************************************
* Author: Justin Vincent (jv@jvmultimedia.com)
* Web...: http://twitter.com/justinvincent
* Name..: ezSQL_mysql
* Desc..: mySQL component (part of ezSQL databse abstraction library)
*
*/ /**********************************************************************
* ezSQL error strings - mySQL
*/ global $ezsql_mysql_str; $ezsql_mysql_str = array
(
1 => 'Require $dbuser and $dbpassword to connect to a database server',
2 => 'Error establishing mySQL database connection. Correct user/password? Correct hostname? Database server running?',
3 => 'Require $dbname to select a database',
4 => 'mySQL database connection is not active',
5 => 'Unexpected error while trying to select database'
); /**********************************************************************
* ezSQL Database specific class - mySQL
*/ 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');
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'); class ezSQL_mysql extends ezSQLcore
{ var $dbuser = false;
var $dbpassword = false;
var $dbname = false;
var $dbhost = false;
var $encoding = false;
var $rows_affected = false; /**********************************************************************
* Constructor - allow the user to perform a quick connect at the
* same time as initialising the ezSQL_mysql class
*/ function ezSQL_mysql($dbuser='', $dbpassword='', $dbname='', $dbhost='localhost', $encoding='')
{
$this->dbuser = $dbuser;
$this->dbpassword = $dbpassword;
$this->dbname = $dbname;
$this->dbhost = $dbhost;
$this->encoding = $encoding;
} /**********************************************************************
* Short hand way to connect to mySQL database server
* and select a mySQL database at the same time
*/ function quick_connect($dbuser='', $dbpassword='', $dbname='', $dbhost='localhost', $encoding='')
{
$return_val = false;
if ( ! $this->connect($dbuser, $dbpassword, $dbhost,true) ) ;
else if ( ! $this->select($dbname,$encoding) ) ;
else $return_val = true;
return $return_val;
} /**********************************************************************
* Try to connect to mySQL database server
*/ function connect($dbuser='', $dbpassword='', $dbhost='localhost')
{
global $ezsql_mysql_str; $return_val = false; // Keep track of how long the DB takes to connect
$this->timer_start('db_connect_time'); // Must have a user and a password
if ( ! $dbuser )
{
$this->register_error($ezsql_mysql_str[1].' in '.__FILE__.' on line '.__LINE__);
$this->show_errors ? trigger_error($ezsql_mysql_str[1],E_USER_WARNING) : null;
}
// Try to establish the server database handle
else if ( ! $this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword,true,131074) )
{
$this->register_error($ezsql_mysql_str[2].' in '.__FILE__.' on line '.__LINE__);
$this->show_errors ? trigger_error($ezsql_mysql_str[2],E_USER_WARNING) : null;
}
else
{
$this->dbuser = $dbuser;
$this->dbpassword = $dbpassword;
$this->dbhost = $dbhost;
$return_val = true;
} return $return_val;
} /**********************************************************************
* Try to select a mySQL database
*/ function select($dbname='', $encoding='')
{
global $ezsql_mysql_str; $return_val = false; // Must have a database name
if ( ! $dbname )
{
$this->register_error($ezsql_mysql_str[3].' in '.__FILE__.' on line '.__LINE__);
$this->show_errors ? trigger_error($ezsql_mysql_str[3],E_USER_WARNING) : null;
} // Must have an active database connection
else if ( ! $this->dbh )
{
$this->register_error($ezsql_mysql_str[4].' in '.__FILE__.' on line '.__LINE__);
$this->show_errors ? trigger_error($ezsql_mysql_str[4],E_USER_WARNING) : null;
} // Try to connect to the database
else if ( !@mysql_select_db($dbname,$this->dbh) )
{
// Try to get error supplied by mysql if not use our own
if ( !$str = @mysql_error($this->dbh))
$str = $ezsql_mysql_str[5]; $this->register_error($str.' in '.__FILE__.' on line '.__LINE__);
$this->show_errors ? trigger_error($str,E_USER_WARNING) : null;
}
else
{
$this->dbname = $dbname;
if ( $encoding == '') $encoding = $this->encoding;
if($encoding!='')
{
$encoding = strtolower(str_replace("-","",$encoding));
$charsets = array();
$result = mysql_query("SHOW CHARACTER SET");
while($row = mysql_fetch_array($result,MYSQL_ASSOC))
{
$charsets[] = $row["Charset"];
}
if(in_array($encoding,$charsets)){
mysql_query("SET NAMES '".$encoding."'");
}
} $return_val = true;
} return $return_val;
} /**********************************************************************
* Format a mySQL string correctly for safe mySQL insert
* (no mater if magic quotes are on or not)
*/ function escape($str)
{
// If there is no existing database connection then try to connect
if ( ! isset($this->dbh) || ! $this->dbh )
{
$this->connect($this->dbuser, $this->dbpassword, $this->dbhost);
$this->select($this->dbname, $this->encoding);
} return mysql_real_escape_string(stripslashes($str));
} /**********************************************************************
* Return mySQL specific system date syntax
* i.e. Oracle: SYSDATE Mysql: NOW()
*/ function sysdate()
{
return 'NOW()';
} /**********************************************************************
* Perform mySQL query and try to detirmin result value
*/ function query($query)
{ // This keeps the connection alive for very long running scripts
if ( $this->num_queries >= 500 )
{
$this->num_queries = 0;
$this->disconnect();
$this->quick_connect($this->dbuser,$this->dbpassword,$this->dbname,$this->dbhost,$this->encoding);
} // Initialise return
$return_val = 0; // Flush cached values..
$this->flush(); // For reg expressions
$query = trim($query); // Log how the function was called
$this->func_call = "\$db->query(\"$query\")"; // Keep track of the last query for debug..
$this->last_query = $query; // Count how many queries there have been
$this->num_queries++; // Start timer
$this->timer_start($this->num_queries); // Use core file cache function
if ( $cache = $this->get_cache($query) )
{
// Keep tack of how long all queries have taken
$this->timer_update_global($this->num_queries); // Trace all queries
if ( $this->use_trace_log )
{
$this->trace_log[] = $this->debug(false);
} return $cache;
} // If there is no existing database connection then try to connect
if ( ! isset($this->dbh) || ! $this->dbh )
{
$this->connect($this->dbuser, $this->dbpassword, $this->dbhost);
$this->select($this->dbname,$this->encoding);
// No existing connection at this point means the server is unreachable
if ( ! isset($this->dbh) || ! $this->dbh )
return false;
} // Perform the query via std mysql_query function..
$this->result = @mysql_query($query,$this->dbh); // If there is an error then take note of it..
if ( $str = @mysql_error($this->dbh) )
{
$this->register_error($str);
$this->show_errors ? trigger_error($str,E_USER_WARNING) : null;
return false;
} // Query was an insert, delete, update, replace
if ( preg_match("/^(insert|delete|update|replace|truncate|drop|create|alter|set|lock|unlock)\s+/i",$query) )
{
$is_insert = true;
$this->rows_affected = @mysql_affected_rows($this->dbh); // Take note of the insert_id
if ( preg_match("/^(insert|replace)\s+/i",$query) )
{
$this->insert_id = @mysql_insert_id($this->dbh);
} // Return number fo rows affected
$return_val = $this->rows_affected;
}
// Query was a select
else
{
$is_insert = false; // Take note of column info
$i=0;
while ($i < @mysql_num_fields($this->result))
{
$this->col_info[$i] = @mysql_fetch_field($this->result);
$i++;
} // Store Query Results
$num_rows=0;
while ( $row = @mysql_fetch_object($this->result) )
{
// Store relults as an objects within main array
$this->last_result[$num_rows] = $row;
$num_rows++;
} @mysql_free_result($this->result); // Log number of rows the query returned
$this->num_rows = $num_rows; // Return number of rows selected
$return_val = $this->num_rows;
} // disk caching of queries
$this->store_cache($query,$is_insert); // If debug ALL queries
$this->trace || $this->debug_all ? $this->debug() : null ; // Keep tack of how long all queries have taken
$this->timer_update_global($this->num_queries); // Trace all queries
if ( $this->use_trace_log )
{
$this->trace_log[] = $this->debug(false);
} return $return_val; } /**********************************************************************
* Close the active mySQL connection
*/ function disconnect()
{
@mysql_close($this->dbh);
} }
//disk_cache_example.php
<?php // Standard ezSQL Libs
include_once "../shared/ez_sql_core.php";
include_once "ez_sql_mysql.php"; // Initialise singleton
$db = new ezSQL_mysql('db_user', 'db_pass', 'db_name'); // Cache expiry
$db->cache_timeout = 24; // Note: this is hours // Specify a cache dir. Path is taken from calling script
$db->cache_dir = 'ezsql_cache'; // (1. You must create this dir. first!)
// (2. Might need to do chmod 775) // Global override setting to turn disc caching off
// (but not on)
$db->use_disk_cache = true; // By wrapping up queries you can ensure that the default
// is NOT to cache unless specified
$db->cache_queries = true; // At last.. a query!
$db->get_results("SHOW TABLES");
$db->debug(); // Select * from use
$db->get_results("SELECT * FROM User");
$db->debug(); // This ensures only the above querys are cached
$db->cache_queries = false; // This query is NOT cached
$db->get_results("SELECT * FROM User LIMIT 0,1");
$db->debug(); /* Of course, if you want to cache EVERYTHING just do.. $db = new ezSQL_mysql('db_user', 'db_pass', 'db_name');
$db->use_disk_cache = true;
$db->cache_queries = true;
$db->cache_timeout = 24; */ ?>
//ez_sql_core_202console.php
<?php
// =================================================================
// == 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 == USAGE: $ezdump = print_r($db->vardump($result),true);
// == TJH == USAGE: $ezconsole = print_r($db->console,true);
// ================================================================= /**********************************************************************
* Author: Justin Vincent (jv@jvmultimedia.com)
* Web...: http://twitter.com/justinvincent
* Name..: ezSQL
* Desc..: ezSQL Core module - database abstraction library to make
* it very easy to deal with databases.
*
*/ /**********************************************************************
* ezSQL Constants
*/ define('EZSQL_VERSION','2.02-console');
define('OBJECT','OBJECT',true);
define('ARRAY_A','ARRAY_A',true);
define('ARRAY_N','ARRAY_N',true);
define('EZSQL_CORE_ERROR','ezSQLcore can not be used by itself (it is designed for use by database specific modules).'); /**********************************************************************
* Core class containg common functions to manipulate query result
* sets once returned
*/ class ezSQLcore
{ var $trace = false; // same as $debug_all
var $debug_all = false; // same as $trace
// === TJH ===
var $debug_echo = true; // == TJH == // default now needed for echo of debug function
var $debug_called = false;
var $vardump_called = false;
var $show_errors = true;
var $num_queries = 0;
var $last_query = null;
var $last_error = null;
var $col_info = null;
var $captured_errors = array();
var $cache_dir = false;
var $cache_queries = false;
var $cache_inserts = false;
var $use_disk_cache = false;
var $cache_timeout = 24; // hours /**********************************************************************
* Constructor
*/ function ezSQLcore()
{
} /**********************************************************************
* Connect to DB - over-ridden by specific DB class
*/ function connect()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Select DB - over-ridden by specific DB class
*/ function select()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Basic Query - over-ridden by specific DB class
*/ function query()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Format a string correctly for safe insert - over-ridden by specific
* DB class
*/ function escape()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Return database specific system date syntax
* i.e. Oracle: SYSDATE Mysql: NOW()
*/ function sysdate()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Print SQL/DB error - over-ridden by specific DB class
*/ function register_error($err_str)
{
// Keep track of last error
$this->last_error = $err_str; // Capture all errors to an error array no matter what happens
$this->captured_errors[] = array
(
'error_str' => $err_str,
'query' => $this->last_query
);
} /**********************************************************************
* Turn error handling on or off..
*/ function show_errors()
{
$this->show_errors = true;
} function hide_errors()
{
$this->show_errors = false;
} /**********************************************************************
* Kill cached query results
*/ function flush()
{
// Get rid of these
$this->last_result = null;
$this->col_info = null;
$this->last_query = null;
$this->from_disk_cache = false;
} /**********************************************************************
* Get one variable from the DB - see docs for more detail
*/ function get_var($query=null,$x=0,$y=0)
{ // Log how the function was called
$this->func_call = "\$db->get_var(\"$query\",$x,$y)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Extract var out of cached results based x,y vals
if ( $this->last_result[$y] )
{
$values = array_values(get_object_vars($this->last_result[$y]));
} // If there is a value return it else return null
return (isset($values[$x]) && $values[$x]!=='')?$values[$x]:null;
} /**********************************************************************
* Get one row from the DB - see docs for more detail
*/ function get_row($query=null,$output=OBJECT,$y=0)
{ // Log how the function was called
$this->func_call = "\$db->get_row(\"$query\",$output,$y)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // If the output is an object then return object using the row offset..
if ( $output == OBJECT )
{
return $this->last_result[$y]?$this->last_result[$y]:null;
}
// If the output is an associative array then return row as such..
elseif ( $output == ARRAY_A )
{
return $this->last_result[$y]?get_object_vars($this->last_result[$y]):null;
}
// If the output is an numerical array then return row as such..
elseif ( $output == ARRAY_N )
{
return $this->last_result[$y]?array_values(get_object_vars($this->last_result[$y])):null;
}
// If invalid output type was specified..
else
{
$this->print_error(" \$db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N");
} } /**********************************************************************
* Function to get 1 column from the cached result set based in X index
* see docs for usage and info
*/ function get_col($query=null,$x=0)
{ // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Extract the column values
for ( $i=0; $i < count($this->last_result); $i++ )
{
$new_array[$i] = $this->get_var(null,$x,$i);
} return $new_array;
} /**********************************************************************
* Return the the query as a result set - see docs for more details
*/ function get_results($query=null, $output = OBJECT)
{ // Log how the function was called
$this->func_call = "\$db->get_results(\"$query\", $output)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Send back array of objects. Each row is an object
if ( $output == OBJECT )
{
return $this->last_result;
}
elseif ( $output == ARRAY_A || $output == ARRAY_N )
{
if ( $this->last_result )
{
$i=0;
foreach( $this->last_result as $row )
{ $new_array[$i] = get_object_vars($row); if ( $output == ARRAY_N )
{
$new_array[$i] = array_values($new_array[$i]);
} $i++;
} return $new_array;
}
else
{
return array();
}
}
} /**********************************************************************
* Function to get column meta data info pertaining to the last query
* see docs for more info and usage
*/ function get_col_info($info_type="name",$col_offset=-1)
{ if ( $this->col_info )
{
if ( $col_offset == -1 )
{
$i=0;
foreach($this->col_info as $col )
{
$new_array[$i] = $col->{$info_type};
$i++;
}
return $new_array;
}
else
{
return $this->col_info[$col_offset]->{$info_type};
} } } /**********************************************************************
* store_cache
*/ function store_cache($query,$is_insert)
{ // The would be cache file for this query
$cache_file = $this->cache_dir.'/'.md5($query); // disk caching of queries
if ( $this->use_disk_cache && ( $this->cache_queries && ! $is_insert ) || ( $this->cache_inserts && $is_insert ))
{
if ( ! is_dir($this->cache_dir) )
{
$this->register_error("Could not open cache dir: $this->cache_dir");
$this->show_errors ? trigger_error("Could not open cache dir: $this->cache_dir",E_USER_WARNING) : null;
}
else
{
// Cache all result values
$result_cache = array
(
'col_info' => $this->col_info,
'last_result' => $this->last_result,
'num_rows' => $this->num_rows,
'return_value' => $this->num_rows,
);
error_log ( serialize($result_cache), 3, $cache_file);
}
} } /**********************************************************************
* get_cache
*/ function get_cache($query)
{ // The would be cache file for this query
$cache_file = $this->cache_dir.'/'.md5($query); // Try to get previously cached version
if ( $this->use_disk_cache && file_exists($cache_file) )
{
// Only use this cache file if less than 'cache_timeout' (hours)
if ( (time() - filemtime($cache_file)) > ($this->cache_timeout*3600) )
{
unlink($cache_file);
}
else
{
$result_cache = unserialize(file_get_contents($cache_file)); $this->col_info = $result_cache['col_info'];
$this->last_result = $result_cache['last_result'];
$this->num_rows = $result_cache['num_rows']; $this->from_disk_cache = true; // If debug ALL queries
$this->trace || $this->debug_all ? $this->debug() : null ; return $result_cache['return_value'];
}
} } /**********************************************************************
* Dumps the contents of any input variable to screen in a nicely
* formatted and easy to understand way - any type: Object, Var or Array
*/ // === TJH === This is hacked to OPTIONALLY generate a "$return_var"
// === TJH === must also set $db->debug_echo = false; in your script to override default behaviour
// === TJH === instead of a simple "echo" to the current screen (DEFAULT)
// === TJH === USAGE: $ezdebug = print_r($db->vardump($result),true); function vardump($mixed='')
{
$return_var .= "<p><table><tr><td bgcolor=ffffff><blockquote><font color=000090>";
$return_var .= "<pre><font face=arial>"; if ( ! $this->vardump_called )
{
$return_var .= "<font color=800080><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Variable Dump..</b></font>\n\n";
} $var_type = gettype ($mixed);
$return_var .= print_r(($mixed?$mixed:"<font color=red>No Value / False</font>"),true);
$return_var .= "\n\n<b>Type:</b> " . ucfirst($var_type) . "\n";
$return_var .= "<b>Last Query</b> [$this->num_queries]<b>:</b> ".($this->last_query?$this->last_query:"NULL")."\n";
$return_var .= "<b>Last Function Call:</b> " . ($this->func_call?$this->func_call:"None")."\n";
$return_var .= "<b>Last Rows Returned:</b> ".count($this->last_result)."\n";
$return_var .= "</font></pre></font></blockquote></td></tr></table>".$this->donation();
$return_var .= "\n<hr size=1 noshade color=dddddd>"; $this->vardump_called = true;
if($this->debug_echo){
echo $return_var;
} return $return_var;
} /**********************************************************************
* Alias for the above function
*/ function dumpvar($mixed)
{
$this->vardump($mixed);
} /**********************************************************************
* Displays the last query string that was sent to the database & a
* table listing results (if there were any).
* (abstracted into a seperate file to save server overhead).
*/ // === TJH === The debug() function is now hacked to OPTIOANLLY create a return result
// === TJH === that can be called as a variable, just changed all "echo"s to "$this->console .= "
// === TJH === this is accessed with "$db->console" obviously
// === TJH === n.b. you must also set $db->debug_echo = false; to override default behaviour function debug($debug_echo) // === TJH === set a default for function to be able to switch "echo" on/off
{ //$this->console .= "<blockquote>"; // === TJH == commented out to change output formatting slightly
// Only show ezSQL credits once..
if ( ! $this->debug_called )
{
$this->console .= "<font color=800080 face=arial size=2><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Debug..</b></font><p>\n";
} if ( $this->last_error )
{
$this->console .= "<font face=arial size=2 color=000099><b>Last Error --</b> [<font color=000000><b>$this->last_error</b></font>]<p>";
} if ( $this->from_disk_cache )
{
$this->console .= "<font face=arial size=2 color=000099><b>Results retrieved from disk cache</b></font><p>";
} $this->console .= "<font face=arial size=2 color=000099><b>Query</b> [$this->num_queries] <b>--</b> ";
$this->console .= "[<font color=000000><b>$this->last_query</b></font>]</font><p>"; $this->console .= "<font face=arial size=2 color=000099><b>Query Result..</b></font>";
$this->console .= "<blockquote>"; if ( $this->col_info )
{ // =====================================================
// Results top rows $this->console .= "<table cellpadding=5 cellspacing=1 bgcolor=555555>";
$this->console .= "<tr bgcolor=eeeeee><td nowrap valign=bottom><font color=555599 face=arial size=2><b>(row)</b></font></td>"; for ( $i=0; $i < count($this->col_info); $i++ )
{
$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>";
} $this->console .= "</tr>"; // ======================================================
// print main results if ( $this->last_result )
{ $i=0;
foreach ( $this->get_results(null,ARRAY_N) as $one_row )
{
$i++;
$this->console .= "<tr bgcolor=ffffff><td bgcolor=eeeeee nowrap align=middle><font size=2 color=555599 face=arial>$i</font></td>"; foreach ( $one_row as $item )
{
$this->console .= "<td nowrap><font face=arial size=2>$item</font></td>";
} $this->console .= "</tr>";
} } // if last result
else
{
$this->console .= "<tr bgcolor=ffffff><td colspan=".(count($this->col_info)+1)."><font face=arial size=2>No Results</font></td></tr>";
} $this->console .= "</table>"; } // if col_info
else
{
$this->console .= "<font face=arial size=2>No Results</font>";
} $this->console .= "</blockquote></blockquote>";
$this->console .= $this->donation();
$this->console .= "<hr noshade color=dddddd size=1>"; // == TJH == more -- to try to make backward compatible with a default param that defaults to echo
if($this->debug_echo){
echo $this->console;
} $this->debug_called = true;
//echo "Something tested"; // == TJH == just some breadcrumbs for testing
} /**********************************************************************
* Naughty little function to ask for some remuniration!
*/ function donation()
{
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> <!--[ go on! you know you want to! ]--></font>";
} } ?>
//ez_sql_core_2.1_debughack_0.2alpha.php
<?php
// =================================================================
// == 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 == USAGE: $ezdump = print_r($db->vardump($result),true);
// == TJH == USAGE: $ezconsole = 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>\n</html>\n");
</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/
// ================================================================= /**********************************************************************
* Author: Justin Vincent (jv@jvmultimedia.com)
* Web...: http://twitter.com/justinvincent
* Name..: ezSQL
* Desc..: ezSQL Core module - database abstraction library to make
* it very easy to deal with databases.
*
*/ /**********************************************************************
* ezSQL Constants
*/ define('EZSQL_VERSION','2.1-console'); // === TJH === added an identifying flag to the version number
define('OBJECT','OBJECT',true);
define('ARRAY_A','ARRAY_A',true);
define('ARRAY_N','ARRAY_N',true);
define('EZSQL_CORE_ERROR','ezSQLcore can not be used by itself (it is designed for use by database specific modules).'); /**********************************************************************
* Core class containg common functions to manipulate query result
* sets once returned
*/ class ezSQLcore
{ var $trace = false; // same as $debug_all
var $debug_all = false; // same as $trace // === TJH ===
var $debug_echo = true; // == TJH == // default now needed for echo of debug function var $debug_called = false;
var $vardump_called = false;
var $show_errors = true;
var $num_queries = 0;
var $last_query = null;
var $last_error = null;
var $col_info = null;
var $captured_errors = array(); /**********************************************************************
* Constructor
*/ function ezSQLcore()
{
} /**********************************************************************
* Connect to DB - over-ridden by specific DB class
*/ function connect()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Select DB - over-ridden by specific DB class
*/ function select()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Basic Query - over-ridden by specific DB class
*/ function query()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Format a string correctly for safe insert - over-ridden by specific
* DB class
*/ function escape()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Return database specific system date syntax
* i.e. Oracle: SYSDATE Mysql: NOW()
*/ function sysdate()
{
die(EZSQL_CORE_ERROR);
} /**********************************************************************
* Print SQL/DB error - over-ridden by specific DB class
*/ function register_error($err_str)
{
// Keep track of last error
$this->last_error = $err_str; // Capture all errors to an error array no matter what happens
$this->captured_errors[] = array
(
'error_str' => $err_str,
'query' => $this->last_query
);
} /**********************************************************************
* Turn error handling on or off..
*/ function show_errors()
{
$this->show_errors = true;
} function hide_errors()
{
$this->show_errors = false;
} /**********************************************************************
* Kill cached query results
*/ function flush()
{
// Get rid of these
$this->last_result = null;
$this->col_info = null;
$this->last_query = null;
$this->from_disk_cache = false;
} /**********************************************************************
* Get one variable from the DB - see docs for more detail
*/ function get_var($query=null,$x=0,$y=0)
{ // Log how the function was called
$this->func_call = "\$db->get_var(\"$query\",$x,$y)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Extract var out of cached results based x,y vals
if ( $this->last_result[$y] )
{
$values = array_values(get_object_vars($this->last_result[$y]));
} // If there is a value return it else return null
return (isset($values[$x]) && $values[$x]!=='')?$values[$x]:null;
} /**********************************************************************
* Get one row from the DB - see docs for more detail
*/ function get_row($query=null,$output=OBJECT,$y=0)
{ // Log how the function was called
$this->func_call = "\$db->get_row(\"$query\",$output,$y)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // If the output is an object then return object using the row offset..
if ( $output == OBJECT )
{
return $this->last_result[$y]?$this->last_result[$y]:null;
}
// If the output is an associative array then return row as such..
elseif ( $output == ARRAY_A )
{
return $this->last_result[$y]?get_object_vars($this->last_result[$y]):null;
}
// If the output is an numerical array then return row as such..
elseif ( $output == ARRAY_N )
{
return $this->last_result[$y]?array_values(get_object_vars($this->last_result[$y])):null;
}
// If invalid output type was specified..
else
{
$this->print_error(" \$db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N");
} } /**********************************************************************
* Function to get 1 column from the cached result set based in X index
* see docs for usage and info
*/ function get_col($query=null,$x=0)
{ // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Extract the column values
for ( $i=0; $i < count($this->last_result); $i++ )
{
$new_array[$i] = $this->get_var(null,$x,$i);
} return $new_array;
} /**********************************************************************
* Return the the query as a result set - see docs for more details
*/ function get_results($query=null, $output = OBJECT)
{ // Log how the function was called
$this->func_call = "\$db->get_results(\"$query\", $output)"; // If there is a query then perform it if not then use cached results..
if ( $query )
{
$this->query($query);
} // Send back array of objects. Each row is an object
if ( $output == OBJECT )
{
return $this->last_result;
}
elseif ( $output == ARRAY_A || $output == ARRAY_N )
{
if ( $this->last_result )
{
$i=0;
foreach( $this->last_result as $row )
{ $new_array[$i] = get_object_vars($row); if ( $output == ARRAY_N )
{
$new_array[$i] = array_values($new_array[$i]);
} $i++;
} return $new_array;
}
else
{
return array();
}
}
} /**********************************************************************
* Function to get column meta data info pertaining to the last query
* see docs for more info and usage
*/ function get_col_info($info_type="name",$col_offset=-1)
{ if ( $this->col_info )
{
if ( $col_offset == -1 )
{
$i=0;
foreach($this->col_info as $col )
{
$new_array[$i] = $col->{$info_type};
$i++;
}
return $new_array;
}
else
{
return $this->col_info[$col_offset]->{$info_type};
} } } /**********************************************************************
* Dumps the contents of any input variable to screen in a nicely
* formatted and easy to understand way - any type: Object, Var or Array
*/
// === TJH === This is hacked to OPTIONALLY generate a "$return_var"
// === TJH === must also set $db->debug_echo = false; in your script to override default behaviour
// === TJH === instead of a simple "echo" to the current screen (DEFAULT)
// === TJH === USAGE: $ezdebug = print_r($db->vardump($result),true);
function vardump($mixed='')
{
$return_var .= "<p><table><tr><td bgcolor=ffffff><blockquote><font color=000090>";
$return_var .= "<pre><font face=arial>"; if ( ! $this->vardump_called )
{
$return_var .= "<font color=800080><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Variable Dump..</b></font>\n\n";
} $var_type = gettype ($mixed);
$return_var .= print_r(($mixed?$mixed:"<font color=red>No Value / False</font>"),true);
$return_var .= "\n\n<b>Type:</b> " . ucfirst($var_type) . "\n";
$return_var .= "<b>Last Query</b> [$this->num_queries]<b>:</b> ".($this->last_query?$this->last_query:"NULL")."\n";
$return_var .= "<b>Last Function Call:</b> " . ($this->func_call?$this->func_call:"None")."\n";
$return_var .= "<b>Last Rows Returned:</b> ".count($this->last_result)."\n";
$return_var .= "</font></pre></font></blockquote></td></tr></table>".$this->donation();
$return_var .= "\n<hr size=1 noshade color=dddddd>"; $this->vardump_called = true; if($this->debug_echo){
echo $return_var;
} return $return_var;
} /**********************************************************************
* Alias for the above function
*/ function dumpvar($mixed)
{
$this->vardump($mixed);
} /**********************************************************************
* Displays the last query string that was sent to the database & a
* table listing results (if there were any).
* (abstracted into a seperate file to save server overhead).
*/ // === TJH === The debug() function is now hacked to OPTIOANLLY create a return result
// === TJH === that can be called as a variable, just changed all "echo"s to "$this->console .= "
// === TJH === this is accessed with "$db->console" obviously
// === TJH === n.b. you must also set $db->debug_echo = false; to override default behaviour function debug($debug_echo) // === TJH === set a default for function to be able to switch "echo" on/off
{ //$this->console .= "<blockquote>"; // === TJH == commented out to change output formatting slightly // Only show ezSQL credits once..
if ( ! $this->debug_called )
{
$this->console .= "<font color=800080 face=arial size=2><b>ezSQL</b> (v".EZSQL_VERSION.") <b>Debug..</b></font><p>\n";
} if ( $this->last_error )
{
$this->console .= "<font face=arial size=2 color=000099><b>Last Error --</b> [<font color=000000><b>$this->last_error</b></font>]<p>";
} if ( $this->from_disk_cache )
{
$this->console .= "<font face=arial size=2 color=000099><b>Results retrieved from disk cache</b></font><p>";
} $this->console .= "<font face=arial size=2 color=000099><b>Query</b> [$this->num_queries] <b>--</b> ";
$this->console .= "[<font color=000000><b>$this->last_query</b></font>]</font><p>"; $this->console .= "<font face=arial size=2 color=000099><b>Query Result..</b></font>";
$this->console .= "<blockquote>"; if ( $this->col_info )
{ // =====================================================
// Results top rows $this->console .= "<table cellpadding=5 cellspacing=1 bgcolor=555555>";
$this->console .= "<tr bgcolor=eeeeee><td nowrap valign=bottom><font color=555599 face=arial size=2><b>(row)</b></font></td>"; for ( $i=0; $i < count($this->col_info); $i++ )
{
$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>";
} $this->console .= "</tr>"; // ======================================================
// print main results if ( $this->last_result )
{ $i=0;
foreach ( $this->get_results(null,ARRAY_N) as $one_row )
{
$i++;
$this->console .= "<tr bgcolor=ffffff><td bgcolor=eeeeee nowrap align=middle><font size=2 color=555599 face=arial>$i</font></td>"; foreach ( $one_row as $item )
{
$this->console .= "<td nowrap><font face=arial size=2>$item</font></td>";
} $this->console .= "</tr>";
} } // if last result
else
{
$this->console .= "<tr bgcolor=ffffff><td colspan=".(count($this->col_info)+1)."><font face=arial size=2>No Results</font></td></tr>";
} $this->console .= "</table>"; } // if col_info
else
{
$this->console .= "<font face=arial size=2>No Results</font>";
} $this->console .= "</blockquote></blockquote>";
$this->console .= $this->donation();
$this->console .= "<hr noshade color=dddddd size=1>"; // == TJH == more -- to try to make backward compatible with a default param that defaults to echo
if($this->debug_echo){
echo $this->console;
} $this->debug_called = true;
//echo "Something tested"; // == TJH == just some breadcrumbs for testing
} /**********************************************************************
* Naughty little function to ask for some remuniration!
*/ function donation()
{
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> <!--[ go on! you know you want to! ]--></font>";
} } ?>
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>\n</html>\n");
</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/
// =================================================================
ezSQL 数据库操作类的更多相关文章
- PHP简单爬虫 基于QueryList采集库 和 ezsql数据库操作类
QueryList是一个基于phpQuery的PHP通用列表采集类,得益于phpQuery,让使用QueryList几乎没有任何学习成本,只要会CSS3选择器就可以轻松使用QueryList了,它让P ...
- 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...
- PHP 数据库操作类:ezSQL
EZSQL类介绍: 下载地址:http://www.jb51.net/codes/26393.htmlezsql是一个小型的快速的数据库操作类,可以让你很容易地用PHP操作各种数据库( MySQL.o ...
- Android打造属于自己的数据库操作类。
1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...
- 通用数据库操作类,前端easyui-datagrid,form
实现功能: 左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...
- php : mysql数据库操作类演示
设计目标: 1,该类一实例化,就可以自动连接上mysql数据库: 2,该类可以单独去设定要使用的连接编码(set names XXX) 3,该类可以单独去设定要使用的数据库(use XXX): 4,可 ...
- php MySQL数据库操作类源代码
php MySQL数据库操作类源代码: <?php class MySQL{ private $host; //服务器地址 private $name; //登录账号 private $pwd; ...
- 一个基于PDO的数据库操作类(新) 一个PDO事务实例
<?php /* * 作者:胡睿 * 日期:2011/03/19 * 电邮:hooray0905@foxmail.com * * 20110319 * 常用数据库操作,如:增删改查,获取单条记录 ...
- ecshop数据库操作类
ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现. 好处:实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小. 当网站需要做me ...
随机推荐
- 从a站点跳转到b站点,通过url的参数判断是否让该用户选择身份
一.问题的由来 问题是这样子给出来,今天产品那边跟我说,在a网站跳转到b网站时,让用户有一个选择身份的弹窗.因为公司有两个不同站点,你无论在a或者b网站注册后,都可以随便登录这两个站点,进入之后都会有 ...
- [ES6] 23. Rest Parameters & Spread Parameters
Rest Parameters: In ES5, when you don't know how many paramters will be passed in, you can use argum ...
- velocity-字母序号 list
版权声明:本文为博主原创文章,未经博主允许不得转载. [需求] 遍历一个list,同时需要在每个item前面显示字母序号,例如A,B,C,D [代码] #set($zimu = ["A&qu ...
- Windows 自己主动关机命令 shuntdown
以下介绍一个在Windows XP下实现定时关机的简单方法. 一 .倒计时关机: 指定系统在10分钟后自己主动关闭:点击“開始→执行”,输入命令“Shutdown -s -t 60”(注意: ...
- 我们应该如何去了解JavaScript引擎的工作原理 系列
http://www.nowamagic.net/librarys/veda/detail/1579
- HDU1010(bfs)
#include <stdio.h>#include <iostream>#include <string.h>#include <stdlib.h>u ...
- Java开发之I/O读取文件实例详解
在java开发或者android开发中,读取文件是不可避免的,以下对java开发中读取文件做了归纳和详解: 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 pa ...
- Java并发——显示锁
Java提供一系列的显示锁类,均位于java.util.concurrent.locks包中. 锁的分类: 排他锁,共享锁 排他锁又被称为独占锁,即读写互斥.写写互斥.读读互斥. Java的ReadW ...
- (转)asp.net 高质量缩略图
原文地址:http://www.cnblogs.com/Fooo/archive/2009/06/19/1506381.html using System.Drawing; ------------- ...
- C++学习(五)
一.拷贝构造函数和拷贝赋值运算符1.拷贝构造:用一个已有的对象,构造和它同类型的副本对象——克隆.2.形如class X { X (const X& that) { ... }};的构造函数 ...