Не создает ли $wpdb->prepare подготовленный оператор, который я могу выполнить несколько раз?
Меня интересует синтаксис
$sql = $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] )
Похоже (из синтаксических значений в prepare), что он просто экранирует значения, не соответствующие подготовленному оператору, что дает мне преимущества в производительности, когда я выполняю его несколько раз, будут разные параметры?
При 2-м взгляде, поскольку значения являются необязательными, я могу установить их после подготовки? Как мне это сделать?
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'
Я думаю, само собой разумеется, что разработчики ожидают, что "подготовленное" утверждение означает, что оно "подготовлено" в базе данных!
В подзадаче был задан вопрос, можно ли использовать это утверждение снова и снова. 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.