7

したがって、MySQL で直接実行すると問題なく動作するクエリがありますが、Wordpress $wpdb->query() を介して実行すると失敗します。

たとえば、$qry をページにエコーアウトし、それをコピーして phpMyAdmin に貼り付けると、必要なすべての結果が得られます。ただし、Wordpress ではエラーが発生します。

エラー: WordPress データベース エラー: [SQL 構文にエラーがあります。'SELECT *, ROUND( 3963.0 * ACOS( SIN( 38.580983*PI()/180 ) * SIN( lat*PI()/18' 行) の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。 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;

明らかに「;」が好きではありません - またはそう推測します。しかし、これがWordpressではなくMySQLで直接うまく動作するのはなぜですか. 「;」を削除すると興味深いことに 2 つのクエリを分離するクエリから、Wordpress は正しい結果を返さず、MySQL は、phpMyAdmin を介して、それが正しくないクエリであると言います。

どんな助けでも大歓迎です。

4

2 に答える 2

4

あなたのコードは、1 つの SQL ステートメントではなく、2 つの SQL ステートメントを示しています。

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

私が覚えて$wbdb->query()いる限りでは、一度に 1 つのステートメントのみを受け入れます (少なくともコーデックスの記事 では、一括クエリ用に設計されているとは指摘されていません。クラス コードを確認して検証していません)。

これらのステートメントを 2 つの異なる変数に入れて、次のように 1 つずつ実行してみてください。

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

$wpdb->query( $SQL1 );   
$wpdb->query( $SQL2 );
于 2013-08-15T06:02:16.003 に答える