我正在创建一个函数来从数据库中获取不同玩家的统计数据,我需要能够将统计数据的时间刻度指定为函数的变量之一 - 它将类似于'月'或'年”。
我在使用EXTRACT()
创建SQL查询以将记录时间戳与当前时间进行比较时取得了一些成功,但我似乎无法使用PDO变量来更改每个函数调用。
任何想法我做错了什么?或者这只是bindParam()
的限制?
function get_player_stats($player_id, $timescale) {
global $pdo;
$query = $pdo->prepare('
SELECT count(results.winner)
FROM results
WHERE results.winner = :player_id
AND EXTRACT(:timescale FROM results.date) = EXTRACT(:timescale FROM NOW())
LIMIT 1
');
$query->bindParam(':player_id', $player_id);
if ($timescale = 'this_month') {
$query->bindParam(':timescale','YEAR_MONTH');
}
else if ($timescale = 'this_year') {
$query->bindParam(':timescale','YEAR');
}
$query->execute();
return $query->fetchAll(PDO::FETCH_OBJ);
}
P.S。这是一个MySQL数据库
答案 0 :(得分:2)
来自PHP PDO文档:
您不能在预准备语句中两次使用同名的命名参数标记。
我在某处读过旧版本的PHP允许您将一个占位符放在查询的多个部分中,但是在较新版本的PHP中已删除此功能。您需要在查询中为每个占位符指定不同的名称。
答案 1 :(得分:2)
我在这里看到两个问题:
EXTRACT()
函数不期望字符串而是标识符。您不能使用绑定参数来提供标识符(例如表名)。
所有PDO驱动程序和模式都不支持重复占位符,因此不鼓励。
您必须使用自己喜欢的字符串操作技术将值注入SQL代码。