P-R*_*ens 5 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;
Run Code Online (Sandbox Code Playgroud)
显然,它不喜欢';' -大概我想。但是,为什么这可以直接在MySQL中而不是在Wordpress中正常运行。有趣的是,如果我删除“;” 从将两个查询分开的查询中,Wordpress无法返回正确的结果,而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;
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
$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!
}
Run Code Online (Sandbox Code Playgroud)
您的代码显示的不是一条 SQL 语句,而是两条:
CREATE TEMPORARY [...] LIMIT 0, 500;SELECT *, ROUND[...] LIMIT 0, 200;据我记得,$wbdb->query()一次只接受一个语句(至少法典文章 没有指出它是为批量查询而设计的,我还没有检查类代码来验证它)。
尝试将这些语句放入两个不同的变量中,然后依次运行它们,如下所示:
$SQL1 = "CREATE TEMPORARY [...] LIMIT 0, 500";
$SQL2 = "SELECT *, ROUND[...] LIMIT 0, 200";
$wpdb->query( $SQL1 );
$wpdb->query( $SQL2 );
Run Code Online (Sandbox Code Playgroud)