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

时间:2013-05-29 19:00:56

标签: 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";

$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的限制,还是有办法绕过这个问题?

我使用的是PHP 5.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 )
                 );

1 个答案:

答案 0 :(得分:0)

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