Не создает ли $wpdb->prepare подготовленный оператор, который я могу выполнить несколько раз?


Меня интересует синтаксис

$sql = $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] )

Похоже (из синтаксических значений в prepare), что он просто экранирует значения, не соответствующие подготовленному оператору, что дает мне преимущества в производительности, когда я выполняю его несколько раз, будут разные параметры?

При 2-м взгляде, поскольку значения являются необязательными, я могу установить их после подготовки? Как мне это сделать?

 6
Author: JM at Work, 2011-06-20

2 answers

$wpdb-prepare работает как sprintf и vsprintf. Первым аргументом всегда будет строка формата.

Единственными приемлемыми спецификаторами формата являются %s и %d. Другие, которые я никогда не тестировал, но могут привести к ошибке синтаксического анализа в соответствии с Кодексом. Вы должны избежать буквального % в вашем запросе с %, например,: %%

Если вы используете его как sprintf, что возможно только в том случае, если вы знаете количество аргументов до выполнения, то вы можете, чтобы количество аргументов соответствовало количество спецификаторов формата в строке формата.

Например,: $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}_votes WHERE post_id = %d AND username = %s", $post_id, $username );

Если вы не знаете количество аргументов до времени выполнения, то вы должны использовать его как vsprintf. В этом случае первым аргументом будет спецификатор формата, а вторым аргументом будет массив.

Например,: $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}_votes WHERE post_id = %d AND username = %s", array( $post_id, $username ) );

$wpdb->prepare вернет строку SQL-ЗАПРОСА, которую вы можете выполнять столько раз, сколько захотите.

Для приведенных выше примеров результирующий запрос будет: SELECT * FROM wp_votes WHERE post_id = 747 AND username = 'cooluser'

 4
Author: Hameedullah Khan, 2011-06-20 11:17:38

Я думаю, само собой разумеется, что разработчики ожидают, что "подготовленное" утверждение означает, что оно "подготовлено" в базе данных!

В подзадаче был задан вопрос, можно ли использовать это утверждение снова и снова. wpdb->подготовить на самом деле не "подготавливает" заявление. Это только очищает входные данные. Вы можете увидеть это в: wordpress/wp-includes/wp-db.php . Найдите функцию подготовки, и вы увидите, что она просто создает обычный неподготовленный запрос:

$query = array_shift($args);
$query = str_replace("'%s'", '%s', $query);
$query = str_replace('"%s"', '%s', $query);
$query = str_replace('%s', "'%s'", $query); // quote the strings
array_walk($args, array(&$this, 'escape_by_ref'));
return @vsprintf($query, $args); 

В принципе, функция wpdb->prepare должна называться "дезинфицировать" или "очистить" или что-то в этом роде. Называть это "подготовкой" вводит в заблуждение любого, кто знает SQL.

 9
Author: user49582, 2014-03-27 14:51:38