Mysql 使用PDO将变量插入SELECT子句?

Mysql 使用PDO将变量插入SELECT子句?,mysql,variables,select,pdo,prepared-statement,Mysql,Variables,Select,Pdo,Prepared Statement,我试图使用球面余弦定律,得到MySQL数据库中存储的用户到每个地点的距离。用户输入他们的位置,然后执行以下查询 $data = array(':lat' => $lat, ':lon' => $lon); $qry = "SELECT ACOS(SIN(v.Latitude) * SIN(:lat) + COS(v.Latitude) * COS(:lat) * COS(:lon - v.Longitude)) * 3963 AS distance FROM Venue v";

我试图使用球面余弦定律,得到MySQL数据库中存储的用户到每个地点的距离。用户输入他们的位置,然后执行以下查询

$data = array(':lat' => $lat, ':lon' => $lon);

$qry = "SELECT ACOS(SIN(v.Latitude) * SIN(:lat) + COS(v.Latitude) * COS(:lat) * COS(:lon - v.Longitude)) * 3963 AS distance FROM Venue v";

$stmt = $pdo->prepare($qry);
$stmt->execute($data);
$rows = $stmt->fetchAll();
问题是,我得到了以下错误

PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number'
当我从SELECT子句中删除变量(
:lat
:lon
)时,它工作正常。语句中的其他变量(此处未显示)工作正常,只有SELECT子句中的变量才会导致问题。无法在SELECT子句中使用PDO变量是PDO的一个限制,还是有办法解决这个问题


我使用的是PHP5.4.15,我的PDO选项如下

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND   => 'SET NAMES utf8',        // UTF-8 to prevent issue sending special characters with JSON
                 PDO::ATTR_ERRMODE              => PDO::ERRMODE_EXCEPTION,  // fire exceptions for errors (turn this off for release)
                 PDO::ATTR_DEFAULT_FETCH_MODE   => PDO::FETCH_ASSOC,        // only return results indexed by column name
                 PDO::ATTR_EMULATE_PREPARES     => false                    // actually prepare statements, not pseudo-prepare ( http://stackoverflow.com/questions/10113562/pdo-mysql-use-pdoattr-emulate-prepares-or-not )
                 );

您使用的是什么版本的PHP?我刚刚用PHP5.3.15尝试过这个,效果很好。可能早期版本的PHP不知道如何处理同一命名参数占位符的两次出现。不要关闭release的异常模式为什么不想绑定:lat两次,只是为了满足库的需要?比如说,作为
:lat1
:lat2
我安装了PHP5.4.15并再次测试。如果使用
ATTR\u EMULATE\u PREPARES=>true
,它可以正常工作;如果使用
ATTR\u EMULATE\u PREPARES=>false
,它将失败。这会使阅读更加混乱,因为我有3条不同的行计算不同的距离。大约有10个不同的问号需要跟踪。这确实解决了问题,但似乎应该有更好的方法…您也可以使用命名占位符。给他们起个不同的名字我知道,这似乎是不必要的麻烦。PDO应该比这更聪明!
$data = array($lat, $lat, $lon);

$qry = "SELECT ACOS(SIN(v.Latitude) * SIN(?) + COS(v.Latitude) * COS(?) * COS(? - v.Longitude)) * 3963 AS distance FROM Venue v";

$stmt = $pdo->prepare($qry);
$stmt->execute($data);
$rows = $stmt->fetchAll();