php - 使用多个查询的复杂 Wordpress 查询

标签 php mysql wordpress

所以我有一个查询,如果我直接在 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/

相关文章:

php - Mongo 相当于 `select distinct(name) from employee where age = "2 5"`

php - Doctrine2 - FindOneBy 外键

php - 使用 group by condition 使结果唯一

html - 为什么此页面上的 margin-top 向下推的不仅仅是它所在的 div?

php - 将日期添加到 mysql 表时出现问题

php - 连接MySQL数据库中的三个不同的表

mysql - 从多个表中按 ID 和时间分组进行选择

html - 删除绝对定位 div 周围的空白空间

php - WordPress 主题 "ERROR: The theme defines itself as its parent theme. Please check the Template header."

php - 如何在 php 的插入值中使用循环