Это странно, у меня есть база данных, в которой хранятся полигоны, и выполняется запрос, который проверяет, существует ли точка в каком-либо полигоне, и извлекает их. Однако, когда запрос создается как строка 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 дополнительных символов — у меня странное чувство, что они вызывают проблемы … как мне идти дальше здесь …
Насколько я помню, в функциях 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));
}
Эй, ребята, извините за поздний ответ. Мне удалось выяснить, в чем проблема. Я выполнил простую команду strlen для SQL, сгенерированной против SQL, набранной вручную, и нашел несоответствие длины. Там были какие-то скрытые символы — так же просто удалили непечатные символы, и это сработало как шарм.