여러 쿼리를 사용하는 복잡한 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 문이 표시됩니다.
CREATE TEMPORARY [...] LIMIT 0, 500;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
'programing' 카테고리의 다른 글
| 주식 시세 API? (0) | 2023.03.21 |
|---|---|
| SID가 Oracle tnsnames.ora의 서비스 이름과 어떻게 다른지 (0) | 2023.03.21 |
| 장고를 위한 가장 좋은 AJAX 라이브러리는 무엇입니까? (0) | 2023.03.21 |
| AngularJS를 수동으로 부트스트랩하려면 어떤 방법을 사용해야 합니까? (0) | 2023.03.21 |
| 상태 배열의 항목을 편집하는 방법 (0) | 2023.03.21 |