使用Prepared Statements无法让SQL BETWEEN在PHP中工作

时间:2014-10-23 12:51:35

标签: php mysql prepared-statement

我试图让mySQL在两个日期之间向我发送帖子。由于日期是用户输入,我使用Prepared Statements。我使用的查询如下所示:

SELECT * FROM butiken_orderregister
WHERE datum_skapad BETWEEN :datum_skapad_0 AND :datum_skapad_1
ORDER BY datum_skapad LIMIT 9999;
  • :datum_skapad_0 = 2014-10-20
  • :datum_skapad_1 = 2014-10-23

datum_skapad 采用日期格式。

查询运行正常,但只返回列匹配的帖子:datum_skapad_1。但是,当我使用MySQL Workbench时,我可以使用查询获得我想要的结果:

SELECT * FROM butiken_orderregister
WHERE datum_skapad BETWEEN "2014-10-20" AND "2014-10-23"
ORDER BY datum_skapad LIMIT 9999;

对我来说,这些应该是等价的,但显然我没有得到相同的结果。我尝试过使用这样的括号:

SELECT * FROM butiken_orderregister
WHERE (datum_skapad BETWEEN :datum_skapad_0 AND :datum_skapad_1)
ORDER BY datum_skapad LIMIT 9999;

但它什么都没改变。

我在这里犯过一个明显的错误,或者问题可能在其他地方?

附录:

这是负责绑定参数的PHP:

    $stmt = $con->prepare($sql);
    foreach ($flat_data as $field => $value) {
        $stmt->bindParam(':' . $field, $value);
        $out .= ':' . $field . ' = ' . $value . "\n";
    }
    if ($return_query) {
        $out = $sql . "\n\n" . $out . "\n\n";
    } else {
        try {
            $stmt->execute();
            $out = $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch(PDOException $error) {
            $out = $error->getMessage();
        }
    }

$flat_data是一个数组,其中包含我在SQL中使用的所有值和名称。 $con是PDO对象。

4 个答案:

答案 0 :(得分:1)

Ryan Vincent的以下评论解决了我的问题:

  

我建议您尝试使用' bindValue'而不是' bindParam':questions / 1179874 / pdo-bindparam-versus-bindvalue - Ryan Vincent 10月23日17:06

如果你把评论写成答案,Ryan,我可以将其标记为已接受的评论。在那之前,我将标记这一个。

我真的无法找到我在绑定和执行之间更改变量的方法,但是由于这解决了我的问题,我认为这只是PHP怪癖中的一个。这是一种奇怪而美妙的语言......

答案 1 :(得分:0)

也许您可以尝试将col和参数显式转换为日期,您使用的是日期还是日期时间?

SELECT * FROM butiken_orderregister
WHERE (
    datum_skapad BETWEEN 
    DATE(:datum_skapad_0) AND DATE(:datum_skapad_1)
)
ORDER BY datum_skapad LIMIT 9999;

投射日期的另一种方式:

SELECT * FROM butiken_orderregister
WHERE (
    datum_skapad BETWEEN 
    CAST(:datum_skapad_0 AS DATE) AND CAST(:datum_skapad_1 AS DATE)
)
ORDER BY datum_skapad LIMIT 9999;

问题可能在于PHP如何处理参数,你应该在这里发布PHP代码。

答案 2 :(得分:0)

我同意@exussum,检查变量。还要检查使用的列类型和日期格式。

答案 3 :(得分:0)

可能无法解决问题,但我会避免使用BETWEEN

而是使用(例如)Date >= '2014-10-20' and Date < '2014-10-24'

More info on why