所以我有一个查询,如果我直接在 MySQL 中运行它就可以正常工作,但如果我通过 Wordpress $wpdb->query() 运行它就会失败。
例如,如果我将 $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 表示这是一个不正确的查询。
如有任何帮助,我们将不胜感激。
最佳答案
这似乎是 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!
}
关于php - 使用多个查询的复杂 Wordpress 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18247015/