summaryrefslogtreecommitdiffstats
path: root/wp-includes/wp-db.php
diff options
context:
space:
mode:
Diffstat (limited to 'wp-includes/wp-db.php')
-rw-r--r--wp-includes/wp-db.php433
1 files changed, 433 insertions, 0 deletions
diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php
new file mode 100644
index 0000000..142a3ec
--- /dev/null
+++ b/wp-includes/wp-db.php
@@ -0,0 +1,433 @@
+<?php
+// WordPress DB Class
+
+// ORIGINAL CODE FROM:
+// Justin Vincent (justin@visunet.ie)
+// http://php.justinvincent.com
+
+define('EZSQL_VERSION', 'WP1.25');
+define('OBJECT', 'OBJECT', true);
+define('ARRAY_A', 'ARRAY_A', false);
+define('ARRAY_N', 'ARRAY_N', false);
+
+if (!defined('SAVEQUERIES'))
+ define('SAVEQUERIES', false);
+
+class wpdb {
+
+ var $show_errors = true;
+ var $num_queries = 0;
+ var $last_query;
+ var $col_info;
+ var $queries;
+
+ // Our tables
+ var $posts;
+ var $users;
+ var $categories;
+ var $post2cat;
+ var $comments;
+ var $links;
+ var $link2cat;
+ var $linkcategories;
+ var $options;
+ var $optiontypes;
+ var $optionvalues;
+ var $optiongroups;
+ var $optiongroup_options;
+ var $postmeta;
+
+ // ==================================================================
+ // DB Constructor - connects to the server and selects a database
+
+ function wpdb($dbuser, $dbpassword, $dbname, $dbhost) {
+
+ if( defined( "WP_USE_MULTIPLE_DB" ) && CONSTANT( "WP_USE_MULTIPLE_DB" ) == true ) {
+ $this->db_connect();
+ return true;
+ }
+
+ $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
+ if (!$this->dbh) {
+ $this->bail("
+<h1>Error establishing a database connection</h1>
+<p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>$dbhost</code>. This could mean your host's database server is down.</p>
+<ul>
+ <li>Are you sure you have the correct username and password?</li>
+ <li>Are you sure that you have typed the correct hostname?</li>
+ <li>Are you sure that the database server is running?</li>
+</ul>
+<p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>
+");
+ }
+
+ $this->select($dbname, $this->dbh);
+ }
+
+ // ==================================================================
+ // Select a DB (if another one needs to be selected)
+
+ function select($db, &$dbh) {
+ if (!@mysql_select_db($db, $dbh)) {
+ $this->bail("
+<h1>Can&#8217;t select database</h1>
+<p>We were able to connect to the database server (which means your username and password is okay) but not able to select the <code>$db</code> database.</p>
+<ul>
+<li>Are you sure it exists?</li>
+<li>On some systems the name of your database is prefixed with your username, so it would be like username_wordpress. Could that be the problem?</li>
+</ul>
+<p>If you don't know how to setup a database you should <strong>contact your host</strong>. If all else fails you may find help at the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>");
+ }
+ }
+
+ // ====================================================================
+ // Format a string correctly for safe insert under all PHP conditions
+
+ function escape($string) {
+ return addslashes( $string ); // Disable rest for now, causing problems
+ if( !$this->dbh || version_compare( phpversion(), '4.3.0' ) == '-1' )
+ return mysql_escape_string( $string );
+ else
+ return mysql_real_escape_string( $string, $this->dbh );
+ }
+
+ // ==================================================================
+ // Print SQL/DB error.
+
+ function print_error($str = '') {
+ global $EZSQL_ERROR;
+ if (!$str) $str = mysql_error();
+ $EZSQL_ERROR[] =
+ array ('query' => $this->last_query, 'error_str' => $str);
+
+ // Is error output turned on or not..
+ if ( $this->show_errors ) {
+ // If there is an error then take note of it
+ print "<div id='error'>
+ <p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br />
+ <code>$this->last_query</code></p>
+ </div>";
+ } else {
+ return false;
+ }
+ }
+
+ // ==================================================================
+ // 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() {
+ $this->last_result = null;
+ $this->col_info = null;
+ $this->last_query = null;
+ }
+
+ function db_connect( $query = "SELECT" ) {
+ global $db_list, $global_db_list;
+ if( is_array( $db_list ) == false )
+ return true;
+
+ if( $this->blogs != '' && preg_match("/(" . $this->blogs . "|" . $this->users . "|" . $this->usermeta . "|" . $this->site . "|" . $this->sitemeta . "|" . $this->sitecategories . ")/i",$query) ) {
+ $action = 'global';
+ $details = $global_db_list[ mt_rand( 0, count( $global_db_list ) -1 ) ];
+ $this->db_global = $details;
+ } elseif ( preg_match("/^\\s*(alter table|create|insert|delete|update|replace) /i",$query) ) {
+ $action = 'write';
+ $details = $db_list[ 'write' ][ mt_rand( 0, count( $db_list[ 'write' ] ) -1 ) ];
+ $this->db_write = $details;
+ } else {
+ $action = '';
+ $details = $db_list[ 'read' ][ mt_rand( 0, count( $db_list[ 'read' ] ) -1 ) ];
+ $this->db_read = $details;
+ }
+
+ $dbhname = "dbh" . $action;
+ $this->$dbhname = @mysql_connect( $details[ 'db_host' ], $details[ 'db_user' ], $details[ 'db_password' ] );
+ if (!$this->$dbhname ) {
+ $this->bail("
+<h1>Error establishing a database connection</h1>
+<p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>$dbhost</code>. This could mean your host's database server is down.</p>
+<ul>
+ <li>Are you sure you have the correct username and password?</li>
+ <li>Are you sure that you have typed the correct hostname?</li>
+ <li>Are you sure that the database server is running?</li>
+</ul>
+<p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>
+");
+ }
+ $this->select( $details[ 'db_name' ], $this->$dbhname );
+ }
+
+ // ==================================================================
+ // Basic Query - see docs for more detail
+
+ function query($query) {
+ // initialise return
+ $return_val = 0;
+ $this->flush();
+
+ // Log how the function was called
+ $this->func_call = "\$db->query(\"$query\")";
+
+ // Keep track of the last query for debug..
+ $this->last_query = $query;
+
+ // Perform the query via std mysql_query function..
+ if (SAVEQUERIES)
+ $this->timer_start();
+
+ // use $this->dbh for read ops, and $this->dbhwrite for write ops
+ // use $this->dbhglobal for gloal table ops
+ unset( $dbh );
+ if( defined( "WP_USE_MULTIPLE_DB" ) && CONSTANT( "WP_USE_MULTIPLE_DB" ) == true ) {
+ if( $this->blogs != '' && preg_match("/(" . $this->blogs . "|" . $this->users . "|" . $this->usermeta . "|" . $this->site . "|" . $this->sitemeta . "|" . $this->sitecategories . ")/i",$query) ) {
+ if( false == isset( $this->dbhglobal ) ) {
+ $this->db_connect( $query );
+ }
+ $dbh =& $this->dbhglobal;
+ $this->last_db_used = "global";
+ } elseif ( preg_match("/^\\s*(alter table|create|insert|delete|update|replace) /i",$query) ) {
+ if( false == isset( $this->dbhwrite ) ) {
+ $this->db_connect( $query );
+ }
+ $dbh =& $this->dbhwrite;
+ $this->last_db_used = "write";
+ } else {
+ $dbh =& $this->dbh;
+ $this->last_db_used = "read";
+ }
+ } else {
+ $dbh =& $this->dbh;
+ $this->last_db_used = "other/read";
+ }
+
+ $this->result = @mysql_query($query, $dbh);
+ ++$this->num_queries;
+
+ if (SAVEQUERIES)
+ $this->queries[] = array( $query, $this->timer_stop() );
+
+ // If there is an error then take note of it..
+ if( $dbh ) {
+ if ( mysql_error( $dbh ) ) {
+ $this->print_error( mysql_error( $dbh ));
+ return false;
+ }
+ }
+
+ if ( preg_match("/^\\s*(insert|delete|update|replace) /i",$query) ) {
+ $this->rows_affected = mysql_affected_rows($dbh);
+ // Take note of the insert_id
+ if ( preg_match("/^\\s*(insert|replace) /i",$query) ) {
+ $this->insert_id = mysql_insert_id($dbh);
+ }
+ // Return number of rows affected
+ $return_val = $this->rows_affected;
+ } else {
+ $i = 0;
+ while ($i < @mysql_num_fields($this->result)) {
+ $this->col_info[$i] = @mysql_fetch_field($this->result);
+ $i++;
+ }
+ $num_rows = 0;
+ while ( $row = @mysql_fetch_object($this->result) ) {
+ $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;
+ }
+
+ return $return_val;
+ }
+
+ // ==================================================================
+ // Get one variable from the DB - see docs for more detail
+
+ function get_var($query=null, $x = 0, $y = 0) {
+ $this->func_call = "\$db->get_var(\"$query\",$x,$y)";
+ 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) {
+ $this->func_call = "\$db->get_row(\"$query\",$output,$y)";
+ if ( $query )
+ $this->query($query);
+
+ if ( $output == OBJECT ) {
+ return $this->last_result[$y] ? $this->last_result[$y] : null;
+ } elseif ( $output == ARRAY_A ) {
+ return $this->last_result[$y] ? get_object_vars($this->last_result[$y]) : null;
+ } elseif ( $output == ARRAY_N ) {
+ return $this->last_result[$y] ? array_values(get_object_vars($this->last_result[$y])) : null;
+ } 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
+ // se docs for usage and info
+
+ function get_col($query = null , $x = 0) {
+ 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) {
+ $this->func_call = "\$db->get_results(\"$query\", $output)";
+
+ 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] = (array) $row;
+ if ( $output == ARRAY_N ) {
+ $new_array[$i] = array_values($new_array[$i]);
+ }
+ $i++;
+ }
+ return $new_array;
+ } else {
+ return null;
+ }
+ }
+ }
+
+
+ // ==================================================================
+ // 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};
+ }
+ }
+ }
+
+ function timer_start() {
+ $mtime = microtime();
+ $mtime = explode(' ', $mtime);
+ $this->time_start = $mtime[1] + $mtime[0];
+ return true;
+ }
+
+ function timer_stop($precision = 3) {
+ $mtime = microtime();
+ $mtime = explode(' ', $mtime);
+ $time_end = $mtime[1] + $mtime[0];
+ $time_total = $time_end - $this->time_start;
+ return $time_total;
+ }
+
+ function bail($message) { // Just wraps errors in a nice header and footer
+ if ( !$this->show_errors )
+ return false;
+ header( 'Content-Type: text/html; charset=utf-8');
+ echo <<<HEAD
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>WordPress &rsaquo; Error</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <style media="screen" type="text/css">
+ <!--
+ html {
+ background: #eee;
+ }
+ body {
+ background: #fff;
+ color: #000;
+ font-family: Georgia, "Times New Roman", Times, serif;
+ margin-left: 25%;
+ margin-right: 25%;
+ padding: .2em 2em;
+ }
+
+ h1 {
+ color: #006;
+ font-size: 18px;
+ font-weight: lighter;
+ }
+
+ h2 {
+ font-size: 16px;
+ }
+
+ p, li, dt {
+ line-height: 140%;
+ padding-bottom: 2px;
+ }
+
+ ul, ol {
+ padding: 5px 5px 5px 20px;
+ }
+ #logo {
+ margin-bottom: 2em;
+ }
+ -->
+ </style>
+ </head>
+ <body>
+ <h1 id="logo"><img alt="WordPress" src="http://static.wordpress.org/logo.png" /></h1>
+HEAD;
+ echo $message;
+ echo "</body></html>";
+ die();
+ }
+}
+
+$wpdb = new wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
+?>