我试图让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 采用日期格式。
查询运行正常,但只返回列匹配的帖子: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对象。
答案 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)