2014-01-02 4 views
1

Я работаю над веб-сайтом, который покажет ближайший магазин в определенном месте. Я использую формулу haversine для определения расстояния, и все работает, за исключением того, что XML не видит поля расстояния, которое я создал.параметр расстояния привязки из формулы haversine с mysqli

switch($unit) { 
    case "km": 
    $distance = 6371; // KM 
    break; 
    case "mi": 
    $distance = 3959; // KM 
    break; 
} 

$query = "SELECT store_id, name, address, description, longitude, latitude, 
    (? * acos(cos(radians(?)) * cos(radians(latitude)) * cos(radians(longitude) 
    - radians(?)) + sin(radians(?)) * sin(radians(latitude)))) 
    AS distanceFromLocation FROM stores"; 



$stmt = $mysqli->prepare($query); 
$stmt->bind_param('iddd', $distance, $user_latitude, $user_longitude, $user_latitude); 

$valid_statement = true; 
try { 
    $stmt->execute(); 
    $stmt->store_result(); 
} catch(Exception $e) { 
    $valid_statement = false; 
    error_log($e->getMessage()); 
} 

if($valid_statement) { 

    $stmt->bind_result($store_id, $name, $address, $description, $longitude, $latitude, $distanceFromLocation); 

    while($stmt->fetch()) { 
    echo $distanceFromLocation; 
    $node = $dom->createElement("marker"); 
    $newnode = $parnode->appendChild($node); 
    $newnode->setAttribute("storeid", $store_id); 
    $newnode->setAttribute("name", $name); 
    $newnode->setAttribute("address", $address); 
    $newnode->setAttribute("lat", $latitude); 
    $newnode->setAttribute("lng", $longitude); 
    $newnode->setAttribute("distance", $distanceFromLocation); 
    } 
} 

Переменная distanceFromLocation всегда пуста, когда она попадает в цикл while. Я проверил SQL и вернет правильные значения расстояния. Любые идеи, почему я не могу получить доступ к дистанционному полю? Это потому, что это вычисленное поле?

+0

Почему вы используете строку 'ssss' вместо числового (6371 для километров или 3959 миль) в качестве вашего первого параметра? –

+0

Эти значения принимаются как строки, поэтому я оставил их как строки, потому что это не повлияло на результат SQL-запроса. Я попытался переключить их на: ssss, isss и iddd, и он не изменил исход запроса вообще, поэтому я оставил его как строку, когда я разместил его. В ходе работы над этим, так как я опубликовал его, я изменил его на iddd. – user3154922

+0

Вы пытаетесь умножить на строку. PS вам не нужно параметризовать это, поскольку оно является константой. –

ответ

1

Вам необходимо включить результат с помощью переключателя в качестве первого параметра. Я также изменил $ distance до $ constant для ясности.

switch($unit) {//From User 
    case "km": 
    $constant = 6371; // KM 
    break; 
    case "mi": 
    $constant = 3959; // KM 
    break; 
} 

$query = "SELECT store_id, name, address, description, longitude, latitude, 
    (? * acos(cos(radians(?)) * cos(radians(latitude)) * cos(radians(longitude) 
    - radians(?)) + sin(radians(?)) * sin(radians(latitude)))) 
    AS distanceFromLocation FROM stores"; 



$stmt = $mysqli->prepare($query); 
$stmt->bind_param($constant, $distance, $user_latitude, $user_longitude, $user_latitude); 
etc. 
0

Если вы хотите использовать MySQL для геопространственных работ, вместо того, чтобы переопределять формулы самостоятельно, посмотрите на the geospatial support. Согласно the performance blog, mysql supports st_distance for determining distance between two points, это должно быть хорошо. Если запретить это, вы можете посмотреть st_distance_sphere или st_distance_spheroid, оба из которых - are supported as of 5.1.

Смежные вопросы