在EXTRACT()查询中使用PDO参数

时间:2012-03-07 15:54:04

标签: php mysql sql pdo

我正在创建一个函数来从数据库中获取不同玩家的统计数据,我需要能够将统计数据的时间刻度指定为函数的变量之一 - 它将类似于'月'或'年”。

我在使用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数据库

2 个答案:

答案 0 :(得分:2)

来自PHP PDO文档:

  

您不能在预准备语句中两次使用同名的命名参数标记。

我在某处读过旧版本的PHP允许您将一个占位符放在查询的多个部分中,但是在较新版本的PHP中已删除此功能。您需要在查询中为每个占位符指定不同的名称。

答案 1 :(得分:2)

我在这里看到两个问题:

  1. EXTRACT()函数不期望字符串而是标识符。您不能使用绑定参数来提供标识符(例如表名)。

  2. 所有PDO驱动程序和模式都不支持重复占位符,因此不鼓励。

  3. 您必须使用自己喜欢的字符串操作技术将值注入SQL代码。