SQL查询适用于phpMyAdmin,但不适用于Codeigniter


SQL query works on phpMyAdmin but not Codeigniter

我有这个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()函数。

像这样:

$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);

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

当双引号内的浮点数被替换为其值时,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()的更多详细信息,请访问

您对radians(x)的调用没有所需的参数值。必须包含度数参数。

更清楚地说,你不能有

radians() // Missing value

您必须包含学位参数,例如

radians(90) // Converts 90 degrees to radians

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

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

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

$nearby_cities=$this->db->query("选择城市、州、邮政编码,(3959*acos(cos(radians($latitude))*cos(radiations(纬度))*科斯(radianss(经度-弧度($经度))+sin(radians($lative))*sin(radians(纬度)))作为与城市的距离_extended HAVING distance<25 ORDER BY distance LIMIT 0,3;");

radians函数的三个参数没有用$转义。。。我想@josh就是这么说的,但(我)不清楚为什么缺少参数。

相关文章: