<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[13454] trunk/wp-includes/wp-db.php: Add wpdb::replace()
for replace queries.</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.wordpress.org/changeset/13454">13454</a></dd>
<dt>Author</dt> <dd>nacin</dd>
<dt>Date</dt> <dd>2010-02-27 15:45:09 +0000 (Sat, 27 Feb 2010)</dd>
</dl>
<h3>Log Message</h3>
<pre>Add wpdb::replace() for replace queries. props AaronCampbell fixes <a href="http://trac.wordpress.org/ticket/10864">#10864</a></pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkwpincludeswpdbphp">trunk/wp-includes/wp-db.php</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpincludeswpdbphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/wp-db.php (13453 => 13454)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/wp-db.php        2010-02-27 07:36:35 UTC (rev 13453)
+++ trunk/wp-includes/wp-db.php        2010-02-27 15:45:09 UTC (rev 13454)
</span><span class="lines">@@ -1143,12 +1143,58 @@
</span><span class="cx">          * @see wp_set_wpdb_vars()
</span><span class="cx">          *
</span><span class="cx">          * @param string $table table name
</span><del>-         * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
</del><ins>+         * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped).
</ins><span class="cx">          * @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.
</span><span class="cx">          *         A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.
</span><span class="cx">          * @return int|false The number of rows inserted, or false on error.
</span><span class="cx">          */
</span><span class="cx">         function insert( $table, $data, $format = null ) {
</span><ins>+                return $this->_insert_replace_helper( $table, $data, $format, 'INSERT' );
+        }
+
+        /**
+         * Replace a row into a table.
+         *
+         * <code>
+         * wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 'bar' ) )
+         * wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) )
+         * </code>
+         *
+         * @since 3.0.0
+         * @see wpdb::prepare()
+         * @see wpdb::$field_types
+         * @see wp_set_wpdb_vars()
+         *
+         * @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 unless otherwise specified in wpdb::$field_types.
+         * @return int|false The number of rows affected, or false on error.
+         */
+        function replace( $table, $data, $format = null ) {
+                return $this->_insert_replace_helper( $table, $data, $format, 'REPLACE' );
+        }
+
+        /**
+         * Helper function for insert and replace.
+         *
+         * Runs an insert or replace query based on $type argument.
+         *
+         * @access private
+         * @since 3.0.0
+         * @see wpdb::prepare()
+         * @see wpdb::$field_types
+         * @see wp_set_wpdb_vars()
+         *
+         * @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 unless otherwise specified in wpdb::$field_types.
+         * @return int|false The number of rows affected, or false on error.
+         */
+        function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) {
+                if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) )
+                        return false;
</ins><span class="cx">                 $formats = $format = (array) $format;
</span><span class="cx">                 $fields = array_keys( $data );
</span><span class="cx">                 $formatted_fields = array();
</span><span class="lines">@@ -1161,11 +1207,10 @@
</span><span class="cx">                                 $form = '%s';
</span><span class="cx">                         $formatted_fields[] = $form;
</span><span class="cx">                 }
</span><del>-                $sql = "INSERT INTO `$table` (`" . implode( '`,`', $fields ) . "`) VALUES ('" . implode( "','", $formatted_fields ) . "')";
</del><ins>+                $sql = "{$type} INTO `$table` (`" . implode( '`,`', $fields ) . "`) VALUES ('" . implode( "','", $formatted_fields ) . "')";
</ins><span class="cx">                 return $this->query( $this->prepare( $sql, $data ) );
</span><span class="cx">         }
</span><span class="cx">
</span><del>-
</del><span class="cx">         /**
</span><span class="cx">          * Update a row in the table
</span><span class="cx">          *
</span></span></pre>
</div>
</div>
</body>
</html>