X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/wordpress.git/blobdiff_plain/0f29eadd474473203a1182f52af1aa82721cecbd..refs/tags/wordpress-2.8.3-scripts:/wp-includes/wp-db.php diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php index 790ddcfd..a4ff757c 100644 --- a/wp-includes/wp-db.php +++ b/wp-includes/wp-db.php @@ -1,146 +1,661 @@ '%d' + * + * @since 2.8.0 + * @see wpdb:prepare() + * @see wpdb:insert() + * @see wpdb:update() + * @access public + * @war array + */ + var $field_types = array(); + /** + * Database table columns charset + * + * @since 2.2.0 + * @access public + * @var string + */ + var $charset; + + /** + * Database table columns collate + * + * @since 2.2.0 + * @access public + * @var string + */ + var $collate; + + /** + * Whether to use mysql_real_escape_string + * + * @since 2.8.0 + * @access public + * @var bool + */ + var $real_escape = false; + + /** + * Connects to the database server and selects a database + * + * PHP4 compatibility layer for calling the PHP5 constructor. + * + * @uses wpdb::__construct() Passes parameters and returns result + * @since 0.71 + * + * @param string $dbuser MySQL database user + * @param string $dbpassword MySQL database password + * @param string $dbname MySQL database name + * @param string $dbhost MySQL database host + */ function wpdb($dbuser, $dbpassword, $dbname, $dbhost) { return $this->__construct($dbuser, $dbpassword, $dbname, $dbhost); } - + + /** + * Connects to the database server and selects a database + * + * PHP5 style constructor for compatibility with PHP5. Does + * the actual setting up of the class properties and connection + * to the database. + * + * @since 2.0.8 + * + * @param string $dbuser MySQL database user + * @param string $dbpassword MySQL database password + * @param string $dbname MySQL database name + * @param string $dbhost MySQL database host + */ function __construct($dbuser, $dbpassword, $dbname, $dbhost) { register_shutdown_function(array(&$this, "__destruct")); - $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword); + if ( defined('WP_DEBUG') and WP_DEBUG == true ) + $this->show_errors(); + + if ( defined('DB_CHARSET') ) + $this->charset = DB_CHARSET; + + if ( defined('DB_COLLATE') ) + $this->collate = DB_COLLATE; + + $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword, true); if (!$this->dbh) { - $this->bail(" + $this->bail(sprintf(/*WP_I18N_DB_CONN_ERROR*/"
This either means that the username and password information in your wp-config.php
file is incorrect or we can't contact the database server at $dbhost
. This could mean your host's database server is down.
This either means that the username and password information in your wp-config.php
file is incorrect or we can't contact the database server at %s
. This could mean your host's database server is down.
If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the WordPress Support Forums.
-"); +"/*/WP_I18N_DB_CONN_ERROR*/, $dbhost)); + return; + } + + $this->ready = true; + + if ( $this->has_cap( 'collation' ) ) { + if ( !empty($this->charset) ) { + if ( function_exists('mysql_set_charset') ) { + mysql_set_charset($this->charset, $this->dbh); + $this->real_escape = true; + } else { + $collation_query = "SET NAMES '{$this->charset}'"; + if ( !empty($this->collate) ) + $collation_query .= " COLLATE '{$this->collate}'"; + $this->query($collation_query); + } + } } $this->select($dbname); } + /** + * PHP5 style destructor and will run when database object is destroyed. + * + * @since 2.0.8 + * + * @return bool Always true + */ function __destruct() { - return true; + return true; } - // ================================================================== - // Select a DB (if another one needs to be selected) + /** + * Sets the table prefix for the WordPress tables. + * + * Also allows for the CUSTOM_USER_TABLE and CUSTOM_USER_META_TABLE to + * override the WordPress users and usersmeta tables that would otherwise be determined by the $prefix. + * + * @since 2.5.0 + * + * @param string $prefix Alphanumeric name for the new prefix. + * @return string|WP_Error Old prefix or WP_Error on error + */ + function set_prefix($prefix) { + + if ( preg_match('|[^a-z0-9_]|i', $prefix) ) + return new WP_Error('invalid_db_prefix', /*WP_I18N_DB_BAD_PREFIX*/'Invalid database prefix'/*/WP_I18N_DB_BAD_PREFIX*/); + + $old_prefix = $this->prefix; + $this->prefix = $prefix; + + foreach ( (array) $this->tables as $table ) + $this->$table = $this->prefix . $table; + + if ( defined('CUSTOM_USER_TABLE') ) + $this->users = CUSTOM_USER_TABLE; + if ( defined('CUSTOM_USER_META_TABLE') ) + $this->usermeta = CUSTOM_USER_META_TABLE; + + return $old_prefix; + } + + /** + * Selects a database using the current database connection. + * + * The database name will be changed based on the current database + * connection. On failure, the execution will bail and display an DB error. + * + * @since 0.71 + * + * @param string $db MySQL database name + * @return null Always null. + */ function select($db) { if (!@mysql_select_db($db, $this->dbh)) { - $this->bail(" + $this->ready = false; + $this->bail(sprintf(/*WP_I18N_DB_SELECT_DB*/'We were able to connect to the database server (which means your username and password is okay) but not able to select the $db
database.
We were able to connect to the database server (which means your username and password is okay) but not able to select the %1$s
database.
%2$s
have permission to use the %1$s
database?username_%1$s
. Could that be the problem?If you don't know how to setup a database you should contact your host. If all else fails you may find help at the WordPress Support Forums.
"); +If you don\'t know how to setup a database you should contact your host. If all else fails you may find help at the WordPress Support Forums.
'/*/WP_I18N_DB_SELECT_DB*/, $db, DB_USER)); + return; } } - // ==================================================================== - // 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 + function _weak_escape($string) { + return addslashes($string); + } + + function _real_escape($string) { + if ( $this->dbh && $this->real_escape ) return mysql_real_escape_string( $string, $this->dbh ); + else + return addslashes( $string ); + } + + function _escape($data) { + if ( is_array($data) ) { + foreach ( (array) $data as $k => $v ) { + if ( is_array($v) ) + $data[$k] = $this->_escape( $v ); + else + $data[$k] = $this->_real_escape( $v ); + } + } else { + $data = $this->_real_escape( $data ); + } + + return $data; } - // ================================================================== - // Print SQL/DB error. + /** + * Escapes content for insertion into the database using addslashes(), for security + * + * @since 0.71 + * + * @param string|array $data + * @return string query safe string + */ + function escape($data) { + if ( is_array($data) ) { + foreach ( (array) $data as $k => $v ) { + if ( is_array($v) ) + $data[$k] = $this->escape( $v ); + else + $data[$k] = $this->_weak_escape( $v ); + } + } else { + $data = $this->_weak_escape( $data ); + } + return $data; + } + + /** + * Escapes content by reference for insertion into the database, for security + * + * @since 2.3.0 + * + * @param string $s + */ + function escape_by_ref(&$string) { + $string = $this->_real_escape( $string ); + } + + /** + * Prepares a SQL query for safe execution. Uses sprintf()-like syntax. + * + * This function only supports a small subset of the sprintf syntax; it only supports %d (decimal number), %s (string). + * Does not support sign, padding, alignment, width or precision specifiers. + * Does not support argument numbering/swapping. + * + * May be called like {@link http://php.net/sprintf sprintf()} or like {@link http://php.net/vsprintf vsprintf()}. + * + * Both %d and %s should be left unquoted in the query string. + * + *
+ * wpdb::prepare( "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d", "foo", 1337 )
+ *
+ *
+ * @link http://php.net/sprintf Description of syntax.
+ * @since 2.3.0
+ *
+ * @param string $query Query statement with sprintf()-like placeholders
+ * @param array|mixed $args The array of variables to substitute into the query's placeholders if being called like {@link http://php.net/vsprintf vsprintf()}, or the first variable to substitute into the query's placeholders if being called like {@link http://php.net/sprintf sprintf()}.
+ * @param mixed $args,... further variables to substitute into the query's placeholders if being called like {@link http://php.net/sprintf sprintf()}.
+ * @return null|string Sanitized query string
+ */
+ function prepare($query = null) { // ( $query, *$args )
+ if ( is_null( $query ) )
+ return;
+ $args = func_get_args();
+ array_shift($args);
+ // If args were passed as an array (as in vsprintf), move them up
+ if ( isset($args[0]) && is_array($args[0]) )
+ $args = $args[0];
+ $query = str_replace("'%s'", '%s', $query); // in case someone mistakenly already singlequoted it
+ $query = str_replace('"%s"', '%s', $query); // doublequote unquoting
+ $query = str_replace('%s', "'%s'", $query); // quote the strings
+ array_walk($args, array(&$this, 'escape_by_ref'));
+ return @vsprintf($query, $args);
+ }
+
+ /**
+ * Print SQL/DB error.
+ *
+ * @since 0.71
+ * @global array $EZSQL_ERROR Stores error information of query and error string
+ *
+ * @param string $str The error to display
+ * @return bool False if the showing of errors is disabled.
+ */
function print_error($str = '') {
global $EZSQL_ERROR;
- if (!$str) $str = mysql_error();
- $EZSQL_ERROR[] =
- array ('query' => $this->last_query, 'error_str' => $str);
+
+ if (!$str) $str = mysql_error($this->dbh);
+ $EZSQL_ERROR[] = array ('query' => $this->last_query, 'error_str' => $str);
+
+ if ( $this->suppress_errors )
+ return false;
+
+ if ( $caller = $this->get_caller() )
+ $error_str = sprintf(/*WP_I18N_DB_QUERY_ERROR_FULL*/'WordPress database error %1$s for query %2$s made by %3$s'/*/WP_I18N_DB_QUERY_ERROR_FULL*/, $str, $this->last_query, $caller);
+ else
+ $error_str = sprintf(/*WP_I18N_DB_QUERY_ERROR*/'WordPress database error %1$s for query %2$s'/*/WP_I18N_DB_QUERY_ERROR*/, $str, $this->last_query);
+
+ $log_error = true;
+ if ( ! function_exists('error_log') )
+ $log_error = false;
+
+ $log_file = @ini_get('error_log');
+ if ( !empty($log_file) && ('syslog' != $log_file) && !@is_writable($log_file) )
+ $log_error = false;
+
+ if ( $log_error )
+ @error_log($error_str, 0);
+
+ // Is error output turned on or not..
+ if ( !$this->show_errors )
+ return false;
$str = htmlspecialchars($str, ENT_QUOTES);
$query = htmlspecialchars($this->last_query, ENT_QUOTES);
- // Is error output turned on or not..
- if ( $this->show_errors ) {
- // If there is an error then take note of it
- print "WordPress database error: [$str]
- $query
WordPress database error: [$str]
+ $query
+ * wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) )
+ *
+ *
+ * @since 2.5.0
+ * @see wpdb::prepare()
+ *
+ * @param string $table table name
+ * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
+ * @param array|string $format (optional) An array of formats to be mapped to each of the value in $data. If string, that format will be used for all of the values in $data. A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $data will be treated as strings.
+ * @return int|false The number of rows inserted, or false on error.
+ */
+ function insert($table, $data, $format = null) {
+ $formats = $format = (array) $format;
+ $fields = array_keys($data);
+ $formatted_fields = array();
+ foreach ( $fields as $field ) {
+ if ( !empty($format) )
+ $form = ( $form = array_shift($formats) ) ? $form : $format[0];
+ elseif ( isset($this->field_types[$field]) )
+ $form = $this->field_types[$field];
+ else
+ $form = '%s';
+ $formatted_fields[] = $form;
+ }
+ $sql = "INSERT INTO `$table` (`" . implode( '`,`', $fields ) . "`) VALUES ('" . implode( "','", $formatted_fields ) . "')";
+ return $this->query( $this->prepare( $sql, $data) );
+ }
+
+ /**
+ * Update a row in the table
+ *
+ *
+ * wpdb::update( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) )
+ *
+ *
+ * @since 2.5.0
+ * @see wpdb::prepare()
+ *
+ * @param string $table table name
+ * @param array $data Data to update (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
+ * @param array $where A named array of WHERE clauses (in column => value pairs). Multiple clauses will be joined with ANDs. Both $where columns and $where values should be "raw".
+ * @param array|string $format (optional) An array of formats to be mapped to each of the values in $data. If string, that format will be used for all of the values in $data. A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $data will be treated as strings.
+ * @param array|string $format_where (optional) An array of formats to be mapped to each of the values in $where. If string, that format will be used for all of the items in $where. A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $where will be treated as strings.
+ * @return int|false The number of rows updated, or false on error.
+ */
+ function update($table, $data, $where, $format = null, $where_format = null) {
+ if ( !is_array( $where ) )
+ return false;
+
+ $formats = $format = (array) $format;
+ $bits = $wheres = array();
+ foreach ( (array) array_keys($data) as $field ) {
+ if ( !empty($format) )
+ $form = ( $form = array_shift($formats) ) ? $form : $format[0];
+ elseif ( isset($this->field_types[$field]) )
+ $form = $this->field_types[$field];
+ else
+ $form = '%s';
+ $bits[] = "`$field` = {$form}";
+ }
+
+ $where_formats = $where_format = (array) $where_format;
+ foreach ( (array) array_keys($where) as $field ) {
+ if ( !empty($where_format) )
+ $form = ( $form = array_shift($where_formats) ) ? $form : $where_format[0];
+ elseif ( isset($this->field_types[$field]) )
+ $form = $this->field_types[$field];
+ else
+ $form = '%s';
+ $wheres[] = "`$field` = {$form}";
+ }
+
+ $sql = "UPDATE `$table` SET " . implode( ', ', $bits ) . ' WHERE ' . implode( ' AND ', $wheres );
+ return $this->query( $this->prepare( $sql, array_merge(array_values($data), array_values($where))) );
+ }
+
+ /**
+ * Retrieve one variable from the database.
+ *
+ * Executes a SQL query and returns the value from the SQL result.
+ * If the SQL result contains more than one column and/or more than one row, this function returns the value in the column and row specified.
+ * If $query is null, this function returns the value in the specified column and row from the previous SQL result.
+ *
+ * @since 0.71
+ *
+ * @param string|null $query SQL query. If null, use the result from the previous query.
+ * @param int $x (optional) Column of value to return. Indexed from 0.
+ * @param int $y (optional) Row of value to return. Indexed from 0.
+ * @return string Database query result
+ */
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] ) {
+ if ( !empty( $this->last_result[$y] ) ) {
$values = array_values(get_object_vars($this->last_result[$y]));
}
@@ -221,13 +828,27 @@ class wpdb {
return (isset($values[$x]) && $values[$x]!=='') ? $values[$x] : null;
}
- // ==================================================================
- // Get one row from the DB - see docs for more detail
-
+ /**
+ * Retrieve one row from the database.
+ *
+ * Executes a SQL query and returns the row from the SQL result.
+ *
+ * @since 0.71
+ *
+ * @param string|null $query SQL query.
+ * @param string $output (optional) one of ARRAY_A | ARRAY_N | OBJECT constants. Return an associative array (column => value, ...), a numerically indexed array (0 => value, ...) or an object ( ->column = value ), respectively.
+ * @param int $y (optional) Row to return. Indexed from 0.
+ * @return mixed Database query result in format specifed by $output
+ */
function get_row($query = null, $output = OBJECT, $y = 0) {
$this->func_call = "\$db->get_row(\"$query\",$output,$y)";
if ( $query )
$this->query($query);
+ else
+ return null;
+
+ if ( !isset($this->last_result[$y]) )
+ return null;
if ( $output == OBJECT ) {
return $this->last_result[$y] ? $this->last_result[$y] : null;
@@ -236,18 +857,28 @@ class wpdb {
} 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");
+ $this->print_error(/*WP_I18N_DB_GETROW_ERROR*/" \$db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N"/*/WP_I18N_DB_GETROW_ERROR*/);
}
}
- // ==================================================================
- // Function to get 1 column from the cached result set based in X index
- // se docs for usage and info
-
+ /**
+ * Retrieve one column from the database.
+ *
+ * Executes a SQL query and returns the column from the SQL result.
+ * If the SQL result contains more than one column, this function returns the column specified.
+ * If $query is null, this function returns the specified column from the previous SQL result.
+ *
+ * @since 0.71
+ *
+ * @param string|null $query SQL query. If null, use the result from the previous query.
+ * @param int $x Column to return. Indexed from 0.
+ * @return array Database query result. Array indexed from 0 by SQL result row number.
+ */
function get_col($query = null , $x = 0) {
if ( $query )
$this->query($query);
+ $new_array = array();
// Extract the column values
for ( $i=0; $i < count($this->last_result); $i++ ) {
$new_array[$i] = $this->get_var(null, $x, $i);
@@ -255,45 +886,70 @@ class wpdb {
return $new_array;
}
- // ==================================================================
- // Return the the query as a result set - see docs for more details
-
+ /**
+ * Retrieve an entire SQL result set from the database (i.e., many rows)
+ *
+ * Executes a SQL query and returns the entire SQL result.
+ *
+ * @since 0.71
+ *
+ * @param string $query SQL query.
+ * @param string $output (optional) ane of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants. With one of the first three, return an array of rows indexed from 0 by SQL result row number. Each row is an associative array (column => value, ...), a numerically indexed array (0 => value, ...), or an object. ( ->column = value ), respectively. With OBJECT_K, return an associative array of row objects keyed by the value of each row's first column's value. Duplicate keys are discarded.
+ * @return mixed Database query results
+ */
function get_results($query = null, $output = OBJECT) {
$this->func_call = "\$db->get_results(\"$query\", $output)";
if ( $query )
$this->query($query);
+ else
+ return null;
- // Send back array of objects. Each row is an object
if ( $output == OBJECT ) {
+ // Return an integer-keyed array of row objects
return $this->last_result;
+ } elseif ( $output == OBJECT_K ) {
+ // Return an array of row objects with keys from column 1
+ // (Duplicates are discarded)
+ foreach ( $this->last_result as $row ) {
+ $key = array_shift( get_object_vars( $row ) );
+ if ( !isset( $new_array[ $key ] ) )
+ $new_array[ $key ] = $row;
+ }
+ return $new_array;
} elseif ( $output == ARRAY_A || $output == ARRAY_N ) {
+ // Return an integer-keyed array of...
if ( $this->last_result ) {
$i = 0;
- foreach( $this->last_result as $row ) {
- $new_array[$i] = (array) $row;
+ foreach( (array) $this->last_result as $row ) {
if ( $output == ARRAY_N ) {
- $new_array[$i] = array_values($new_array[$i]);
+ // ...integer-keyed row arrays
+ $new_array[$i] = array_values( get_object_vars( $row ) );
+ } else {
+ // ...column name-keyed row arrays
+ $new_array[$i] = get_object_vars( $row );
}
- $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
-
+ /**
+ * Retrieve column metadata from the last query.
+ *
+ * @since 0.71
+ *
+ * @param string $info_type one of name, table, def, max_length, not_null, primary_key, multiple_key, unique_key, numeric, blob, type, unsigned, zerofill
+ * @param int $col_offset 0: col name. 1: which table the col's in. 2: col's max length. 3: if the col is numeric. 4: col's type
+ * @return mixed Column Results
+ */
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 ) {
+ foreach( (array) $this->col_info as $col ) {
$new_array[$i] = $col->{$info_type};
$i++;
}
@@ -304,14 +960,28 @@ class wpdb {
}
}
+ /**
+ * Starts the timer, for debugging purposes.
+ *
+ * @since 1.5.0
+ *
+ * @return true
+ */
function timer_start() {
$mtime = microtime();
$mtime = explode(' ', $mtime);
$this->time_start = $mtime[1] + $mtime[0];
return true;
}
-
- function timer_stop($precision = 3) {
+
+ /**
+ * Stops the debugging timer.
+ *
+ * @since 1.5.0
+ *
+ * @return int Total time spent on the query, in milliseconds
+ */
+ function timer_stop() {
$mtime = microtime();
$mtime = explode(' ', $mtime);
$time_end = $mtime[1] + $mtime[0];
@@ -319,62 +989,125 @@ class wpdb {
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 <<
-
-
-