使用PDO预处理语句和特定年份的占位符,我无法回应任何结果

时间:2017-07-19 14:54:17

标签: php mysql mysqli pdo

我最近了解了预处理语句的重要性,因此我着手将所有现有的mysqli查询更改为PDO查询。

我有一张名为" people"使用名为namedob(DATETIME)的字段,其数据类似于:

name:  Johnny
dob:  2016-12-06 18:30:00

我首先在PHP变量中提供一年,例如:

$theyear=2016;

然后,使用这个例子,我试图在2016年为拥有dob的人提取所有名称并回复它们,如下所示,但它没有显示任何结果(并且有很多) :

$stmt = $pdo->prepare("SELECT * FROM people WHERE `dob` BETWEEN ':theyear-01-01' AND ':theyear-12-31'");
$stmt->execute(['theyear' => $theyear]);
while ($row = $stmt->fetch()) {
    echo $row['name'] . "<br/>";
}

作为PDO的新手,我确信我做了一些愚蠢/不合逻辑的事情。

任何人都可以看到我的错误/帮助我朝着正确的方向前进吗?

2 个答案:

答案 0 :(得分:4)

如果您要连接,请在数组中执行,而不是查询,并为每个变量使用单独的占位符:

$stmt = $pdo->prepare("SELECT * FROM people WHERE `dob` BETWEEN :theyearbegin AND :theyearend");
$stmt->execute([':theyearbegin' => $theyear.'-01-01', ':theyearend' => $theyear.'-12-31']);

请注意,我已从查询中的占位符中删除了引号。您在准备查询的占位符中进行的任何连接都应在查询本身之外完成,包括使用LIKE的查询。

答案 1 :(得分:2)

尝试更改

':theyear-01-01'

CONCAT(:theyear, '-01-01')

如果未设置仿真,则需要两个不同的变量:theyear1和:theyear2 f.e。