Использование параметра PDO в запросе EXTRACT () - PullRequest
2 голосов
/ 07 марта 2012

Я создаю функцию для получения статистики по различным игрокам из базы данных, и мне нужно иметь возможность указать шкалу времени для статистики в качестве одной из переменных функции - это будет что-то вроде «месяц» илиyear..

Есть идеи, что я делаю не так?Или это просто ограничение 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);
}

PS Это база данных MySQL

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Я вижу две проблемы здесь:

  1. Функция EXTRACT() ожидает не строку, а идентификатор. Вы не можете использовать параметры связывания для предоставления идентификаторов (таких как имена таблиц).

  2. Повторение заполнителей поддерживается не всеми драйверами и режимами PDO, поэтому его не рекомендуется.

Вам нужно будет вставить значение в код SQL с помощью вашей любимой техники манипуляции со строками.

2 голосов
/ 07 марта 2012

Из PHP PDO документы:

Нельзя использовать именованный маркер параметра с одним и тем же именем дважды в подготовленном операторе.

Я где-то читал, что старые версии PHP позволяли вам поместить один заполнитель в несколько частей запроса, однако эта функция была удалена в более новых версиях PHP. Вам нужно будет дать каждому заполнителю разные имена в вашем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...