2017-02-11 110 views
1

我看不出这个sql中有什么问题。 没有Haversine公式的最简单的sql工作得很完美。所以我的意思是应该是关于sql或statments的东西。我看不到它。 有些想法? 谢谢,PHP PDO SQL错误:带有消息'SQLSTATE [HY093]的未捕获异常'PDOException':无效的参数编号

<?php 
require_once "connectPDO.php"; 

// Get parameters from URL 
$lat = 55; //$_GET["lat"]; 
$lng = 3; //$_GET["lng"]; 
$radius = 18; //$_GET["radius"]; 

// Start XML file, create parent node 
$dom = new DOMDocument("1.0"); 
$node = $dom->createElement("markers"); 
$parnode = $dom->appendChild($node); 

//$query = $db->prepare("SELECT id, coursename, lat, lng FROM wp_courses"); 
$query = $db->prepare("SELECT coursename, lat, lng, 
(3959 * acos(cos(radians(:latitude)) * cos(radians(lat)) 
* cos(radians(lng) - radians(:longitude)) + sin(radians(:latitude)) 
* sin(radians(lat)))) AS distance FROM wp_courses 
HAVING distance < :radius ORDER BY distance LIMIT 0 , 20"); 
$query->bindParam(':latitude', $lat, PDO::PARAM_STR); 
$query->bindParam(':longitude', $lng, PDO::PARAM_STR); 
$query->bindParam(':radius', $radius, PDO::PARAM_STR); 
$query->execute(); 

header("Content-type: text/xml"); 
foreach ($query->fetchAll(PDO::FETCH_ASSOC) as $row) { 
    $node = $dom->createElement("marker"); 
    $newnode = $parnode->appendChild($node); 
    $newnode->setAttribute("name", $row['coursename']); 
    $newnode->setAttribute("lat", $row['lat']); 
    $newnode->setAttribute("lng", $row['lng']); 
    $newnode->setAttribute("distance", $row['distance']); 
} 
echo $dom->saveXML(); 
?> 
+1

不知道,但我不'吨认为你可以即使值相同或启用仿真,您需要唯一绑定的回收参数:'$ db-> setAttribute(PDO :: ATTR_EMULATE_PREPARES,true)' – Mihai

+0

正如@mihai所说,您不能重用参数。错误信息非常简单,真的。 – junkfoodjunkie

回答

0

你不能在查询中重复使用相同的参数名称,但它是简单的只是改变他们有点像这样

$query = $db->prepare("SELECT coursename, lat, lng, 
(3959 * acos(cos(radians(:latitude1)) * cos(radians(lat)) 
* cos(radians(lng) - radians(:longitude)) + sin(radians(:latitude2)) 
* sin(radians(lat)))) AS distance 
FROM wp_courses 
HAVING distance < :radius ORDER BY distance LIMIT 0 , 20"); 

$query->bindParam(':latitude1', $lat, PDO::PARAM_STR); 
$query->bindParam(':latitude2', $lat, PDO::PARAM_STR); 
$query->bindParam(':longitude', $lng, PDO::PARAM_STR); 
$query->bindParam(':radius', $radius, PDO::PARAM_STR); 
$query->execute(); 
+0

它的工作原理。谢谢大家 –

+0

还不能投票? –

相关问题