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

Мне интересно, из синтаксиса

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

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

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

4 голоса | спросил JM at Work 20 J0000006Europe/Moscow 2011, 13:30:08

2 ответа


3

$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 QUERY, которую вы можете выполнить столько раз, сколько захотите.

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

ответил Hameedullah Khan 20 J0000006Europe/Moscow 2011, 15:17:38
5

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

В дополнительном вопросе было задано задание, которое можно использовать снова и снова. Подготовка 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.

ответил user49582 27 MarpmThu, 27 Mar 2014 18:51:38 +04002014-03-27T18:51:38+04:0006 2014, 18:51:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132