SQL-запрос работает на phpMyAdmin, но не Codeigniter - PullRequest
2 голосов
/ 17 марта 2012

У меня есть этот 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, он работает. Однако я попытался реализовать его с помощью codeigniter с помощью функции $ 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);

ПРИМЕЧАНИЕ: широта и долгота - это столбцы в моей таблице, а не переменные. Спасибо за ваш вклад!

Ответы [ 4 ]

2 голосов
/ 20 мая 2012

Когда число с плавающей точкой в ​​двойных кавычках подставляется в его значение, 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 () можно узнать здесь

0 голосов
/ 16 ноября 2013

Я понимаю, что это старый вопрос, но проблема кажется очевидной:

$ near_cities = $ this-> db-> query ("SELECT city, state, zip, (3959 * acos(cos (радианы ($ широта)) * cos (радианы ( широта )) * cos (радианы ( долгота ) - радианы ($ долгота)) + sin (радианы ($ широта))) * sin (радианы ( широта )))) AS расстояние от города_ расширенное расстояние HAVING <25 ЗАКАЗАТЬ НА расстояние LIMIT 0, 3; "); </p>

Три из ваших параметровв radians функции не экранируются $ ... Полагаю, это то, о чем говорит @josh, но мне неясно (1015) почему параметр отсутствовал.

0 голосов
/ 17 марта 2012

У вас есть звонки на radians(x) без необходимого значения параметра.Вы должны включить параметр градусов.

Более четко, вы не можете иметь

radians() // Missing value

Вы должны включить аргумент градусов, такой как

radians(90) // Converts 90 degrees to radians

Дополнительно, проверьтеВаши значения $longitude и $latitude не пусты.

0 голосов
/ 17 марта 2012

похоже, что переменные $latitude и $longitude пусты

...