programing

여러 쿼리를 사용하는 복잡한 Wordpress 쿼리

goodjava 2023. 3. 21. 22:06

여러 쿼리를 사용하는 복잡한 Wordpress 쿼리

그래서 MySQL에서 직접 실행하면 정상적으로 동작하지만 Wordpress $wpdb->query()에서 실행하면 실패합니다.

예를 들어 $qry를 페이지에 에코아웃하고 복사하여 phpMyAdmin에 붙여넣으면 원하는 결과를 얻을 수 있습니다.그러나 워드프레스에서 오류가 발생합니다.

오류: WordPress 데이터베이스 오류: [SELECT *, ROUND(3963.0* ACOS(SIN(38.580983*PI()/180)) 21행에서 사용할 올바른 구문에 대해 MySQL Server 버전에 대응하는 매뉴얼을 확인하십시오.

쿼리:

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에서 바로 실행이 되는 거죠?흥미로운 것은 두 개의 쿼리를 구분하는 쿼리에서 ";"를 삭제하면 워드프레스는 올바른 결과를 반환하지 않으며 MySQL은 잘못된 쿼리라고 phpMyAdmin을 통해 말합니다.

어떤 도움이라도 주시면 감사하겠습니다.

이는 PHP 자체의 제한으로 보입니다. Wordpress 포럼의 이 게시물을 참조하십시오.

저도 같은 문제에 직면하게 되어, 그 일을 하는 커스텀 기능을 만들어, 누군가에게 도움이 될지도 모르기 때문에 여기에 붙여 둡니다.이 함수는 몇 가지 가정을 하기 때문에 다소 단순하지만 다양한 요구에 맞게 쉽게 수정할 수 있어야 합니다.구체적으로는 다음과 같이 가정합니다.

  • 모든 문은 삽입 및 업데이트이며 반환할 데이터가 없습니다.
  • 문장은 행의 끝 시퀀스로 구분됩니다.
  • 스테이트먼트는 트랜잭션 내에 동봉됩니다.

기능은 다음과 같습니다.

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!
}

코드에는 1개의 SQL 문이 아닌 2개의 SQL 문이 표시됩니다.

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

제가 기억하는 한, 한 번에 하나의 스테이트먼트만 받아들입니다(적어도 코덱스 기사에는 대량 쿼리용으로 설계되어 있다고 기재되어 있지 않습니다.클래스 코드를 체크하고 검증하지 않았습니다).

이러한 문을 두 개의 다른 변수에 넣은 다음 다음과 같이 차례로 실행합니다.

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

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

언급URL : https://stackoverflow.com/questions/18247015/complex-wordpress-query-using-multiple-queries