【问题标题】:PHP PDO SQL error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter numberPHP PDO SQL 错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY093]:无效的参数号
【发布时间】:2017-02-11 21:31:21
【问题描述】:

我看不出这个 sql 有什么问题。 没有 Haversine 公式的最简单的 sql 可以完美运行。所以我的意思是应该是关于 sql 或 statments 的东西。我看不到它。 有什么想法? 谢谢,

<?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();
?>

【问题讨论】:

  • 不确定,但我不知道t think you can recycle paramters you need unique bindings even if the value is identical OR enable emulation: $db->setAttribute( PDO::ATTR_EMULATE_PREPARES, true )`
  • 正如@mihai 所说,您不能重用参数。错误信息非常直接,真的。

标签: php mysql pdo


【解决方案1】:

您不能在查询中重复使用相同的参数名称,但只需像这样更改它们很简单

$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();

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多