2012-03-16 6 views
2

У меня есть это SQL-запрос:SQL запрос работает на PhpMyAdmin, но не Codeigniter

SELECT *, (3959 * acos(cos(radians(41.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(-87.789597)) + sin(radians(41.0)) * 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 и Повсеместно в Comman линию на 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.0'), 
      mysql_real_escape_string('-87.789597'), 
      mysql_real_escape_string('41.0'), 
      mysql_real_escape_string('25')); 

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

Примечание: широта и долгота столбцов в моей не таблицы переменных. Спасибо за ваш вклад!

+0

Почему вы делаете эти вычисления на стороне sql? Вы могли бы предварительно предсказать их до $ this-> db-> query(). – Panagiotis

+0

, когда вы помещаете '$ query =" SELECT city, state, zip, (3959 * acos (cos (радиан ($ широта)) * cos (радиан (широта)) * cos (радиан (долгота) - радиан ($ долгота)) + sin (радиан ($ широта)) * sin (радиан (широта)))) AS расстояние от городов_расширенный HAVING расстояние <25 ORDER BY distance LIMIT 0, 3; ", а затем' var_dump ($ query); 'что делать Вы получаете? – artragis

+0

Вы уверены, что '$ широта' и' $ долгота' имеют значения, которые, по вашему мнению, у них есть? Дважды проверьте это. –

ответ

0

это выглядит, как если бы ваши $latitude и $longitude переменных являются пустыми

0

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

Более ясно, вы не можете иметь

radians() // Missing value 

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

radians(90) // Converts 90 degrees to radians 

Кроме того, убедитесь, что $longitude и $latitude значения не пусты.

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() являются here

0

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

$ nearby_cities = $ this-> db-> запрос ("SELECT город, штат, почтовый индекс, (3959 * экоса (Cos (радианы ($ широта)) * Cos (радианы (широта)) * Cos (радиан (долгота) - радиан ($ долгота)) + sin (радиан ($ широта)) * Sin (радиан (широта)))) как расстояние от cities_extended HAVING расстояния < 25 ORDER BY distance LIMIT 0, 3; ");

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