Включение формулы Haversine с PHP PDO

Первоначально использовал следующий запрос:

SELECT username, latitude, longitude, ( 3959 * acos( cos( radians(':lat') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(':lng') ) + sin( radians(':lat') ) * sin( radians( latitude ) ) ) ) AS distance FROM users HAVING distance < '500' ORDER BY distance LIMIT 0 , 20

Это прекрасно работает, когда я запускаю его в консоли (заменяя заполнители PDO (: lat, : lng и т. д.) фактическими числами), но как только я запускаю его через PHP-PDO, т.е.:

$stmt = db::getInstance()->prepare($sql);
 $stmt->bindParam(':lat', $lat, PDO::PARAM_STR);
 $stmt->bindParam(':lng', $lng, PDO::PARAM_STR);
 $stmt->bindParam(':radius', $radius, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();

Он имеет проблемы и ничего не возвращает.
Проблема заключалась в том, что PDO обрабатывал HAVING иначе, чем необработанный запрос, по-видимому

Так что все в порядке, я переписал запрос, заменив HAVING, и новый запрос выглядит так:

SELECT * FROM ( SELECT username, latitude, longitude, ( 3959 * acos( cos( radians(':lat') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(':lng') ) + sin( radians(':lat') ) * sin( radians( latitude ) ) ) ) ) WHERE distance < '500' ORDER BY distance LIMIT 0 , 20

Это приводит к следующей ошибке от PDO:

исключение «PDOException» с сообщением «SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1248 Каждая производная таблица должна иметь свой собственный псевдоним» в /home/bessr/local_html/site.com/pieces/functions/geo.functions.php: 47 Трассировка стека: #0 /home/bessr/local_html/site.com/pieces/functions/geo.functions.php(47): PDOStatement->execute() #1 {main}

Итак, я даю ему псевдоним, и мой измененный запрос выглядит так:

SELECT * FROM ( SELECT username, latitude, longitude, ( 3959 * acos( cos( radians(':lat') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(':lng') ) + sin( radians(':lat') ) * sin( radians( latitude ) ) ) AS t ) AS alias ) WHERE distance < '500' ORDER BY distance LIMIT 0 , 20

Несмотря на то, что я добавил псевдоним, я все равно получаю ту же ошибку. Я не уверен, где именно я ошибаюсь. Любая помощь приветствуется.


person Community    schedule 13.06.2013    source источник


Ответы (2)


Вы цитируете именованные заполнители в запросе. Также вы не используете :radius. Следующий запрос, удаляющий кавычки и добавляющий :radius, работает с моей базой данных.

SELECT username, latitude, longitude,
( 3959 * acos( cos( radians(:lat) ) * cos( radians( latitude ) ) 
* cos( radians( longitude ) - radians(:lng) ) + sin( radians(:lat) )
* sin( radians( latitude ) ) ) ) AS distance FROM users
HAVING distance < :radius ORDER BY distance LIMIT 0 , 20
person david strachan    schedule 13.06.2013

PDO вообще не обрабатывает SQL. Видимо.

Единственная его работа - отправить ваш запрос на сервер mysql и получить результаты. Вся обработка выполняется сервером mysql.

Таким образом, ваша проблема в другом. Скорее всего, это может быть вызвано разными версиями MySQL, к которым вы подключаетесь.

Хотя ошибку все равно надо исправлять. Попробуйте убрать as alias из фигурных скобок.

person Your Common Sense    schedule 13.06.2013