2013-08-15 2 views
1

Так что у меня есть запрос, который работает отлично, если я запускаю его непосредственно в MySQL, но не удается, если я запустил его через Wordpress $ wpdb-> query().Комплексный запрос Wordpress с использованием нескольких запросов

Если я выхожу на страницу $ qry и скопирую и вставляю ее в phpMyAdmin, например, я получаю все результаты, которые я хочу. Однако в Wordpress я получаю сообщение об ошибке.

Ошибка: Ошибка базы данных WordPress: [У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'SELECT *, ROUND (3963.0 * ACOS (SIN (38.580983 * PI()/180) * SIN (lat * PI()/18' на линии 21]

запросов:

CREATE TEMPORARY TABLE tmp_locations_tbl 
SELECT post.ID, 
     post.post_name, 
     lat_meta.meta_value AS lat, 
     lng_meta.meta_value AS lng, 
     address_meta.meta_value AS address 
FROM wp_posts AS post, 
     wp_postmeta AS lat_meta, 
     wp_postmeta AS lng_meta, 
     wp_postmeta AS address_meta 

WHERE post.ID = lat_meta.post_id 
AND post.ID = lat_meta.post_id 
AND post.ID = lng_meta.post_id 
AND lat_meta.meta_key = 'geo_latitude' 
AND lng_meta.meta_key = 'geo_longitude' 
AND address_meta.meta_key = 'address' 

LIMIT 0, 5000; 

SELECT *, 
ROUND(3963.0 * ACOS(SIN(38.580983*PI()/180) * SIN(lat*PI()/180) + COS(38.580983*PI()/180) * COS(lat*PI()/180) * COS((lng*PI()/180) - (-121.4931*PI()/180))) , 1) 
AS distance 
FROM tmp_locations_tbl 
HAVING distance < 25 
ORDER BY distance ASC 
LIMIT 0, 200; 

Ясно, что это не нравится «;» - или я так полагаю, Но почему этот пробег отлично непосредственно в MySQL, а не Wordpress Интересно, если я удалю.. ';' из запроса, который отделяет два запроса. Wordpress не возвращает правильные результаты и MySQL, через phpMyAdmin говорит, что это неправильный запрос.

Любая помощь будет оценена.

ответ

0

Ваш код показывает не один SQL заявление, а скорее два:

  1. CREATE TEMPORARY [...] LIMIT 0, 500;
  2. SELECT *, ROUND[...] LIMIT 0, 200;

Насколько я помню, $wbdb->query() принимает только одно заявление, в то время (по крайней мере, codex article не указывает, что он предназначен для массовых запросов, я не проверял код класса, чтобы проверить его).

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

$SQL1 = "CREATE TEMPORARY [...] LIMIT 0, 500"; 
$SQL2 = "SELECT *, ROUND[...] LIMIT 0, 200"; 

$wpdb->query($SQL1); 
$wpdb->query($SQL2); 
+0

было бы лучше использовать $ wpdb-> get_results для второго запроса, а не $ wpdb-> запрос ? – ThePengwin

+0

Это зависит от того, что хочет сделать оригинальный плакат.Конечно, если он/она хочет работать с результатом второго запроса, ему лучше использовать '$ wpdb-> get_results();'. – Bjoern

+0

Это сработало отлично. Единственная причина, по которой я не пробовал это в первую очередь, я был обеспокоен тем, что таблица TEMPORARY больше не будет доступна, если я запустил второй запрос после первого. Благодарю. –

2

Это, как представляется, ограничение самого PHP см this post on the Wordpress forums.

Я столкнулся с той же проблемой и в итоге создал пользовательскую функцию, которая выполняет эту работу, и вставляю ее здесь, если она полезна для кого-то. Функция довольно проста, так как она делает несколько предположений, но ее следует легко модифицировать для адаптации к различным потребностям. В частности, он предполагает, что:

  • Все заявления являются вставками и обновлениями, данных для возврата нет.
  • Заявления разделены последовательностью конца строки.
  • Заявления прилагаются к транзакции.

Вот функция: пример

function execute_multiline_sql($sql) { 
    global $wpdb; 
    $sqlParts = array_filter(explode("\r\n", $sql)); 
    foreach($sqlParts as $part) { 
     $wpdb->query($part); 
     if($wpdb->last_error != '') { 
      $error = new WP_Error("dberror", __("Database query error"), $wpdb->last_error); 
      $wpdb->query("rollback;"); 
      return $error; 
     } 
    } 
    return true; 
} 

Использование:

$sql = "start transaction;\r\n" . 
     "insert into ...;\r\n" . 
     "update ...;\r\n" . 
     "commit;\r\n" 
     ; 

$result = execute_multiline_sql($sql); 
if(is_wp_error($result)) { 
    //Fail! 
} 
Смежные вопросы