0

最初使用以下查询:

SELECT username, latitude, longitude, ( 3959 * acos( cos( radians(':lat') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(':lng') ) + sin( radians(':lat') ) * sin( radians( latitude ) ) ) ) AS distance FROM users HAVING distance < '500' ORDER BY distance LIMIT 0 , 20

当我在控制台中运行它(用实际数字替换我的 PDO 占位符(:lat,:lng 等))时,这非常有用,但是一旦我通过 PHP-PDO 运行它,即:

$stmt = db::getInstance()->prepare($sql);
 $stmt->bindParam(':lat', $lat, PDO::PARAM_STR);
 $stmt->bindParam(':lng', $lng, PDO::PARAM_STR);
 $stmt->bindParam(':radius', $radius, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();

它有问题并且没有返回任何内容。
问题是 PDO 处理 HAVING 的方式与原始查询不同,显然

没关系,我重写了替换 HAVING 的查询,新查询如下所示:

SELECT * FROM ( SELECT username, latitude, longitude, ( 3959 * acos( cos( radians(':lat') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(':lng') ) + sin( radians(':lat') ) * sin( radians( latitude ) ) ) ) ) WHERE distance < '500' ORDER BY distance LIMIT 0 , 20

这会导致 PDO 出现以下错误:

带有消息“SQLSTATE [42000] 的异常“PDOException”:语法错误或访问冲突:1248 每个派生表都必须在 /home/bessr/local_html/site.com/pieces/functions/geo.functions.php 中有自己的别名: 47 堆栈跟踪:#0 /home/bessr/local_html/site.com/pieces/functions/geo.functions.php(47): PDOStatement->execute() #1 {main}

好的,所以我给它一个别名,我修改后的查询如下所示:

SELECT * FROM ( SELECT username, latitude, longitude, ( 3959 * acos( cos( radians(':lat') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(':lng') ) + sin( radians(':lat') ) * sin( radians( latitude ) ) ) AS t ) AS alias ) WHERE distance < '500' ORDER BY distance LIMIT 0 , 20

即使我添加了别名,我仍然遇到同样的错误。我不确定我到底哪里出错了。任何帮助表示赞赏。

4

2 回答 2

0

PDO 根本不处理任何 SQL。显然。

它唯一的工作是将您的查询发送到 mysql 服务器并获取结果。所有处理都由mysql服务器完成。

因此,您的问题出在其他地方。很可能是由您连接到的不同 mysql 版本引起的。

尽管无论如何都必须修复错误。尝试as alias从牙套中移出。

于 2013-06-13T06:08:06.920 回答
0

您在查询中引用了命名的占位符。此外,您没有使用:radius。以下查询删除引号并添加:radius适用于我的数据库。

SELECT username, latitude, longitude,
( 3959 * acos( cos( radians(:lat) ) * cos( radians( latitude ) ) 
* cos( radians( longitude ) - radians(:lng) ) + sin( radians(:lat) )
* sin( radians( latitude ) ) ) ) AS distance FROM users
HAVING distance < :radius ORDER BY distance LIMIT 0 , 20
于 2013-06-13T10:21:09.250 回答