2013-06-13 4 views
0

Первоначально с помощью следующего запроса:Включающего 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 заполнителей (: латы,: 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(); 

У этого есть проблемы и ничего не возвращает.
Проблемы в том, что ПДО было обрабатывая 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]: ошибка синтаксиса или нарушение прав доступа: 12 48 Каждая производная таблица должна иметь свой собственный псевдоним ' в /home/bessr/local_html/site.com/pieces/functions/geo.functions.php:47 Трассировка стека: # 0 /home/bessr/local_html/site .com/частей/функций/geo.functions.php (47): PDOStatement-> Execute() # 1 {главная}

Хорошо, так что я даю ему псевдоним и мой измененный запрос выглядит следующим образом:

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 

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

ответ

1

Вы указываете имя владельца места в запросе. Также вы не используете :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 
+0

это сделал трюк. Большое спасибо за помощь. – Jared

0

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

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

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

Хотя ошибка должна быть исправлена ​​в любом случае. Попробуйте переместить as alias из брекетов.

-1

Это работает для меня: ПОЛУЧИТЬ строковое значение переменной с strval() ...

$stmt->bindParam(':lat', strval($lat), PDO::PARAM_STR); 
$stmt->bindParam(':lng', strval($lng), PDO::PARAM_STR); 

Вопрос от некоторое время назад, но, надеюсь, это поможет кому-то еще.