WPDB: Allow `null` values in the CRUD functions.

Specifically, `::insert()`, `::replace()`, `::update()`, and `::delete()` can now set a column to `NULL`, or add the `IS NULL` condition to the `WHERE` clause.

This is based on [backpress 279].

Props pento, nbachiyski, sorich87.

Fixes #15158.


Built from https://develop.svn.wordpress.org/trunk@34737


git-svn-id: http://core.svn.wordpress.org/trunk@34701 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Gary Pendergast 2015-10-01 05:37:26 +00:00
parent 9caa7c4ba7
commit 3942226c90
2 changed files with 28 additions and 1 deletions

View File

@ -4,7 +4,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '4.4-alpha-34736'; $wp_version = '4.4-alpha-34737';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.

View File

@ -1779,6 +1779,7 @@ class wpdb {
* @param string $table Table name * @param string $table Table name
* @param array $data Data to insert (in column => value pairs). * @param array $data Data to insert (in column => value pairs).
* Both $data columns and $data values should be "raw" (neither should be SQL escaped). * Both $data columns and $data values should be "raw" (neither should be SQL escaped).
* Sending a null value will cause the column to be set to NULL - the corresponding format is ignored in this case.
* @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. * @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. * If string, that format will be used for all of the values in $data.
* A format is one of '%d', '%f', '%s' (integer, float, string). * A format is one of '%d', '%f', '%s' (integer, float, string).
@ -1803,6 +1804,7 @@ class wpdb {
* @param string $table Table name * @param string $table Table name
* @param array $data Data to insert (in column => value pairs). * @param array $data Data to insert (in column => value pairs).
* Both $data columns and $data values should be "raw" (neither should be SQL escaped). * Both $data columns and $data values should be "raw" (neither should be SQL escaped).
* Sending a null value will cause the column to be set to NULL - the corresponding format is ignored in this case.
* @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. * @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. * If string, that format will be used for all of the values in $data.
* A format is one of '%d', '%f', '%s' (integer, float, string). * A format is one of '%d', '%f', '%s' (integer, float, string).
@ -1827,6 +1829,7 @@ class wpdb {
* @param string $table Table name * @param string $table Table name
* @param array $data Data to insert (in column => value pairs). * @param array $data Data to insert (in column => value pairs).
* Both $data columns and $data values should be "raw" (neither should be SQL escaped). * Both $data columns and $data values should be "raw" (neither should be SQL escaped).
* Sending a null value will cause the column to be set to NULL - the corresponding format is ignored in this case.
* @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. * @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. * If string, that format will be used for all of the values in $data.
* A format is one of '%d', '%f', '%s' (integer, float, string). * A format is one of '%d', '%f', '%s' (integer, float, string).
@ -1848,6 +1851,11 @@ class wpdb {
$formats = $values = array(); $formats = $values = array();
foreach ( $data as $value ) { foreach ( $data as $value ) {
if ( is_null( $value['value'] ) ) {
$formats[] = 'NULL';
continue;
}
$formats[] = $value['format']; $formats[] = $value['format'];
$values[] = $value['value']; $values[] = $value['value'];
} }
@ -1875,9 +1883,12 @@ class wpdb {
* @param string $table Table name * @param string $table Table name
* @param array $data Data to update (in column => value pairs). * @param array $data Data to update (in column => value pairs).
* Both $data columns and $data values should be "raw" (neither should be SQL escaped). * Both $data columns and $data values should be "raw" (neither should be SQL escaped).
* Sending a null value will cause the column to be set to NULL - the corresponding
* format is ignored in this case.
* @param array $where A named array of WHERE clauses (in column => value pairs). * @param array $where A named array of WHERE clauses (in column => value pairs).
* Multiple clauses will be joined with ANDs. * Multiple clauses will be joined with ANDs.
* Both $where columns and $where values should be "raw". * Both $where columns and $where values should be "raw".
* Sending a null value will create an IS NULL comparison - the corresponding format will be ignored in this case.
* @param array|string $format Optional. An array of formats to be mapped to each of the values in $data. * @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. * If string, that format will be used for all of the values in $data.
* A format is one of '%d', '%f', '%s' (integer, float, string). * A format is one of '%d', '%f', '%s' (integer, float, string).
@ -1904,10 +1915,20 @@ class wpdb {
$fields = $conditions = $values = array(); $fields = $conditions = $values = array();
foreach ( $data as $field => $value ) { foreach ( $data as $field => $value ) {
if ( is_null( $value['value'] ) ) {
$fields[] = "`$field` = NULL";
continue;
}
$fields[] = "`$field` = " . $value['format']; $fields[] = "`$field` = " . $value['format'];
$values[] = $value['value']; $values[] = $value['value'];
} }
foreach ( $where as $field => $value ) { foreach ( $where as $field => $value ) {
if ( is_null( $value['value'] ) ) {
$conditions[] = "`$field` IS NULL";
continue;
}
$conditions[] = "`$field` = " . $value['format']; $conditions[] = "`$field` = " . $value['format'];
$values[] = $value['value']; $values[] = $value['value'];
} }
@ -1936,6 +1957,7 @@ class wpdb {
* @param array $where A named array of WHERE clauses (in column => value pairs). * @param array $where A named array of WHERE clauses (in column => value pairs).
* Multiple clauses will be joined with ANDs. * Multiple clauses will be joined with ANDs.
* Both $where columns and $where values should be "raw". * Both $where columns and $where values should be "raw".
* Sending a null value will create an IS NULL comparison - the corresponding format will be ignored in this case.
* @param array|string $where_format Optional. An array of formats to be mapped to each of the values in $where. * @param array|string $where_format 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. * If string, that format will be used for all of the items in $where.
* A format is one of '%d', '%f', '%s' (integer, float, string). * A format is one of '%d', '%f', '%s' (integer, float, string).
@ -1954,6 +1976,11 @@ class wpdb {
$conditions = $values = array(); $conditions = $values = array();
foreach ( $where as $field => $value ) { foreach ( $where as $field => $value ) {
if ( is_null( $value['value'] ) ) {
$conditions[] = "`$field` IS NULL";
continue;
}
$conditions[] = "`$field` = " . $value['format']; $conditions[] = "`$field` = " . $value['format'];
$values[] = $value['value']; $values[] = $value['value'];
} }