Error message

You are browsing documentation for drupal 7.x, which is not supported anymore. Read the updated version of this page for drupal 11.x (the latest version).

function DatabaseConnection::expandArguments

Expands out shorthand placeholders.

Drupal supports an alternate syntax for doing arrays of values. We therefore need to expand them out into a full, executable query string.

Parameters

$query: The query string to modify.

$args: The arguments for the query.

Return value

TRUE if the query was modified, FALSE otherwise.

2 calls to DatabaseConnection::expandArguments()
DatabaseConnection::query in includes/database/database.inc
Executes a query string against the database.
DatabaseConnection_pgsql::query in includes/database/pgsql/database.inc
Executes a query string against the database.

File

includes/database/database.inc, line 793

Class

DatabaseConnection
Base Database API class.

Code

protected function expandArguments(&$query, &$args) {
 $modified = FALSE;
 // If the placeholder value to insert is an array, assume that we need
 // to expand it out into a comma-delimited set of placeholders.
 foreach (array_filter ($args, 'is_array') as $key => $data) {
 $new_keys = array();
 foreach (array_values ($data) as $i => $value) {
 // This assumes that there are no other placeholders that use the same
 // name. For example, if the array placeholder is defined as :example
 // and there is already an :example_2 placeholder, this will generate
 // a duplicate key. We do not account for that as the calling code
 // is already broken if that happens.
 $new_keys[$key . '_' . $i] = $value;
 }
 // Update the query with the new placeholders.
 // preg_replace is necessary to ensure the replacement does not affect
 // placeholders that start with the same exact text. For example, if the
 // query contains the placeholders :foo and :foobar, and :foo has an
 // array of values, using str_replace would affect both placeholders,
 // but using the following preg_replace would only affect :foo because
 // it is followed by a non-word character.
 $query = preg_replace ('#' . $key . '\\b#', implode (', ', array_keys ($new_keys)), $query);
 // Update the args array with the new placeholders.
 unset($args[$key]);
 $args += $new_keys;
 $modified = TRUE;
 }
 return $modified;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.