PHP PDO bindParam返回NULL

时间:2012-04-21 21:23:45

标签: php mysql pdo

我遇到PDO绑定参数问题,在数据库上执行时,所设置的参数不会被推送到查询中。我通过让MySQL将查询记录到文件来见证这一点。

如果我针对服务器执行 - 我在日志文件中看到了这一点。

SELECT sg.locID, ( 3959 * acos( cos( radians(53.21333) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-2.4354014) ) + sin( radians(53.21333) ) * sin( radians( latitude ) ) ) ) AS distance FROM location_geo sg HAVING distance < 1000 ORDER BY distance LIMIT 0 , 20

从PHP / PDO中执行时

SELECT
  sg.locID,
  ( 3959 * acos( cos( radians(NULL) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(NULL) ) + sin( radians(NULL) ) * sin( radians( latitude ) ) ) ) AS distance
FROM
  location_geo sg
HAVING
  distance < 1000
ORDER BY distance LIMIT 0, 20

以下是PHP执行的代码

$lat = 53.21333;
$lng = -2.4354014;
$limit = 10;
$start = 0;

$query = "
    SELECT
      sg.locID,
      ( 3959 * acos( cos( radians(:latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(:longitude) ) + sin( radians(:latitude) ) * sin( radians( latitude ) ) ) ) AS distance
    FROM
      location_geo sg
    HAVING
      distance < :radius
    ORDER BY distance LIMIT :start, :limit
";

$stm = Modules::db()->prepare($query);
$stm->bindValue(":radius", 1000, PDO::PARAM_INT);
$stm->bindParam(":latitude", $lat, PDO::PARAM_INT);
$stm->bindParam(":longitude", $lng, PDO::PARAM_INT);
$stm->bindParam(":start", $start, PDO::PARAM_INT);
$stm->bindParam(":limit", $limit, PDO::PARAM_INT);
$stm->execute();

继承我的桌子

CREATE TABLE `location_geo` (
  `locID` int(11) unsigned NOT NULL,
  `latitude` double DEFAULT NULL,
  `longitude` double DEFAULT NULL,
  PRIMARY KEY (`locID`)
)

虚拟数据 -

INSERT INTO `location_geo` (`locID`, `latitude`, `longitude`)
VALUES
    (1, 53.21333, -2.4354014),
    (2, 53.213435, -2.4345214);

我尝试更换bindParams并将数据放入execute调用中的数组中,但结果是一样的。

如果您错过了它,纬度和经度的值保持为空。 PDO没有错误。

怪异。

2 个答案:

答案 0 :(得分:1)

好的,我之前从未使用过原始PDO,但我认为错误就在这里:

$stm->bindParam(":latitude", $lat, PDO::PARAM_INT);
$stm->bindParam(":longitude", $lng, PDO::PARAM_INT);

为什么你说它是一个INT(我假设这个PDO::PARAM_INT说明传递了什么类型的值),如果你传递FLOAT?可能这就是它被转换为NULL的原因,因为浮点值不是整数...

答案 1 :(得分:1)

出于调试目的,我使用setAttribute()。像这样举例如:

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

这样它会告诉你是否有任何错误以及它们是什么。