2

我有这个 SQL 查询:

SELECT *, ( 3959 * acos( cos( radians(41.832100) ) * cos( radians( latitude ) ) * cos( radians( longitude) - radians(-87.789597) ) + sin( radians(41.832100) ) * sin( radians( latitude ) ) ) ) AS distance FROM cities_extended HAVING distance < 10 ORDER BY distance LIMIT 0 , 5;

当我通过 phpMyAdmin 运行它时,它可以工作。但是我尝试通过$this->db->query();使用 codeigniter 来实现它。功能。

像这样:

$nearby_cities = $this->db->query("SELECT city,state,zip, ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance FROM cities_extended HAVING distance < 25 ORDER BY distance LIMIT 0 , 3;");

我明白了:

Error Number: 1582

Incorrect parameter count in the call to native function 'radians'

SELECT city,state,zip, ( 3959 * acos( cos( radians() ) * cos( radians( latitude ) ) * cos( radians( longitude) - radians() ) + sin( radians() ) * sin( radians( latitude ) ) ) ) AS distance FROM cities_extended HAVING distance < 25 ORDER BY distance LIMIT 0 , 3;

当我在 phpmyadmin 上运行完全相同的查询并通过 mysql 上的命令行它可以工作时,它没有任何意义,但是使用 php 和 codeigniter 它没有。有人可以帮忙吗?

问题解决了

$query = sprintf("SELECT *, ( 3959 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance FROM cities_extended HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20",
             mysql_real_escape_string('41.832100'),
             mysql_real_escape_string('-87.789597'),
             mysql_real_escape_string('41.832100'),
             mysql_real_escape_string('25'));

            $nearby_cities = $this->db->query($query);

注意:纬度和经度是我表中的列而不是变量。谢谢您的意见!

4

4 回答 4

2

当双引号内的浮点数替换为它的值时,php默认使用逗号作为小数分隔符

$float = 1.234;
$string = "SELECT col FROM table WHERE lat > $float"

将成为

echo $string => SELECT col FROM table WHERE lat > 1,234

代替

echo $string => SELECT col FROM table WHERE lat > 1.234

因此 MySQL 不会将其视为浮点数,而是将其视为数字 1 和一些语法分隔符。

一种解决方案是在查询中使用之前将数字转换为正确的字符串:

$float = 1.234;
$float_string = number_format($float, 2, '.', '');
$string = "SELECT col FROM table WHERE lat > $float_string"

有关 number_format() 的更多详细信息在这里

于 2012-05-20T04:04:08.483 回答
0

看起来你的$latitude$longitude变量是空的

于 2012-03-16T20:14:32.407 回答
0

您可以在没有所需参数值的情况下调用。您必须包含degrees 参数。radians(x)

更清楚的是,你不能拥有

radians() // Missing value

您必须包含 degree 参数,例如

radians(90) // Converts 90 degrees to radians

此外,请检查您的$longitude$latitude值是否为空。

于 2012-03-16T20:21:42.370 回答
0

我意识到这是一个老问题,但问题似乎很明显:

$nearby_cities = $this->db->query("SELECT city,state,zip, ( 3959 * acos( cos( 弧度($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - 弧度($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) AS distance FROM cities_extended HAVING distance < 25 ORDER BY distance LIMIT 0 , 3;");

你的函数的三个参数radians没有被转义$......我想这就是@josh 所说的,但(对我来说)不清楚为什么参数丢失了。

于 2013-11-15T20:09:03.123 回答