mysqli подготовил операторы с установочными переменными - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь выполнить запрос, который создает сводную таблицу.Запрос выполняется нормально вне PHP, но я получаю ошибки в PHP с mysqli->prepare()

Sql error #: 1064 - у вас ошибка в синтаксисе SQL;обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'SET @sql = CONCAT ...

Если (надеюсь) не вдаваться в подробности запроса, есть ли что-тоо присвоении значений переменным (например, SET @sql), которым нужен альтернативный синтаксис для работы с mysqli?Если я уберу все с SET @sql вниз, он больше не захлебнется prepare.

$q = "SELECT GROUP_CONCAT(DISTINCT
    CONCAT('MAX(CASE WHEN `date` = ''', `date`,
        ''' THEN `close` END) `', `date`, '`')
        ORDER BY YEAR(`date`), MONTH(`date`) 
    )
    INTO @sql
    FROM 
    (SELECT symbol, `date`, `close`
        FROM history where `date` IN 
        (SELECT MAX(`date`) as max_date
            FROM history
            WHERE date BETWEEN '1998-01-01' AND '2018-12-31' AND symbol = 'QQQ'
            GROUP BY YEAR(`date`) )
    ) a;

    SET @sql = CONCAT('SELECT symbol, ', @sql, ' 
    FROM history 
    GROUP BY symbol');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;";

$stmt = $this->mysqli->prepare($q);
$stmt->execute();

1 Ответ

0 голосов
/ 31 декабря 2018

Проблема в том, что вы пытаетесь выполнить несколько запросов в одном операторе prepare.

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

Определение

Подготавливает запрос SQL и возвращает дескриптор оператора, который будет использоваться для дальнейших операций над оператором.Запрос должен состоять из одного оператора SQL.

Источник: http://us3.php.net/manual/en/mysqli.prepare.php

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