【问题标题】:Using a PDO parameter in an EXTRACT() query在 EXTRACT() 查询中使用 PDO 参数
【发布时间】:2012-03-07 15:54:03
【问题描述】:

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

我在使用 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);
}

附:这是一个 MySQL 数据库

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    我在这里看到两个问题:

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

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

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

    【讨论】:

    • 您能解释一下我将如何注入价值吗?
    【解决方案2】:

    来自PHP PDO 文档:

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

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

    【讨论】:

    • 我没有注意到 - 感谢您的帮助!
    • 我只是注意到,因为我想做完全相同的事情。很遗憾你不能,真的。
    猜你喜欢
    • 2010-11-20
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多