【问题标题】:PHP PDO bindParam returning NULLPHP PDO bindParam 返回 NULL
【发布时间】:2012-05-03 00:52:10
【问题描述】:

我对 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 并将数据放入执行调用中的数组中,但结果是相同的。

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

很奇怪。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

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

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

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

    【讨论】:

    • 没有浮动选项,即使设置为 PARAM_STR 也会返回相同的行为。 int 选项不会像 str 选项那样将值用单引号括起来。但是,正如您指出的那样,这可能是问题所在,我将对此进行调查。谢谢
    • 已经有一些关于这个的话题,你应该看看:stackoverflow.com/questions/1335081/… ..也许你可以跳过 PDO::PARAM_* 参数,直接使用 $stm-&gt;bindParam(":latitude", $lat);
    • 我尝试过不定义该帖子中建议的类型,您可以在 mysql 的查询日志中看到它用单引号将值包装起来,与 PARAM_STR 相同。纬度和经度的值保持为 NULL。我不认为这是原因:(
    【解决方案2】:

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

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

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

    【讨论】:

    • 遗憾的是,这不会在屏幕或日志中产生任何内容。无论如何,谢谢。
    • 尝试将其设置为更高的级别:PDO::ERRMODE_EXCEPTION
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2014-08-11
    • 2013-03-29
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多