Пространственная геометрия SQL — два абсолютно одинаковых запроса, один работает, другой — нет

Это странно, у меня есть база данных, в которой хранятся полигоны, и выполняется запрос, который проверяет, существует ли точка в каком-либо полигоне, и извлекает их. Однако, когда запрос создается как строка sql в моем php-коде, он ничего не возвращает, однако, если я ввожу запрос вручную — он работает отлично!

#This works
SELECT * FROM locations
WHERE type = 'polygon' AND locationable_type = 'Notification' AND
ST_CONTAINS(locations.geoshape, GeomFromText('Point(25.276987 55.296249)') ) ;

#This doesnt work
SELECT * FROM locations
WHERE type = 'polygon' AND locationable_type = 'Notification' AND
ST_CONTAINS(locations.geoshape, GeomFromText('Point(‎25.276987 55.296249)') );

Вот как на самом деле генерируется sql i:

публичная функция get_by_coords ($ широта, $ долгота) {

// this grabs all the notifications
$sql = sprintf("SELECT * FROM locations WHERE type = 'polygon' AND locationable_type = 'Notification'
AND ST_CONTAINS(locations.geoshape, GeomFromText('point(%s, %s)') )", ($latitude), ($longitude));

куда $latitude, $longitude фактически передаются как строки из переменной GET. Я попытался набрать, но результат был:

$latitude = "25.276987";
(float)$latitude; // equals zero

Что тут происходит? Я использую Codeigniter здесь.

ОБНОВИТЬ

Я просто сделал var_dump и нашел что-то странное. Если я var_dump создаю SQL-запрос, он показывает, что на 6 символов больше, чем если бы я var_dump запрос непосредственно вводил в строку, т.е.

string(166) "SELECT * FROM locations  WHERE type = 'polygon' AND locationable_type = 'Notification' AND  ST_CONTAINS(locations.geoshape, Point('‎25.27116987','‎55.292216249'))"string(160) "SELECT * FROM locations  WHERE type = 'polygon' AND locationable_type = 'Notification' AND  ST_CONTAINS(locations.geoshape, Point('25.27116987','55.292216249'))"

Первая строка генерируется, в то время как вторая была как есть — она ​​показывает, что в первой строке есть 6 дополнительных символов — у меня странное чувство, что они вызывают проблемы … как мне идти дальше здесь …

0

Решение

Насколько я помню, в функциях php нам все еще нужен знак доллара перед аргументами.

как ты делаешь ....($latitude), ($longitude)); в функции

Таким образом, ваши аргументы функции должны быть

public function get_by_coords($latitude,$longitude){

$sql = sprintf("SELECT * FROM locations WHERE type = 'polygon' AND locationable_type = 'Notification'
AND ST_CONTAINS(locations.geoshape, GeomFromText('point(%s, %s)') )", ($latitude), ($longitude));
}
0

Другие решения

Эй, ребята, извините за поздний ответ. Мне удалось выяснить, в чем проблема. Я выполнил простую команду strlen для SQL, сгенерированной против SQL, набранной вручную, и нашел несоответствие длины. Там были какие-то скрытые символы — так же просто удалили непечатные символы, и это сработало как шарм.

0

По вопросам рекламы [email protected]