代码之家  ›  专栏  ›  技术社区  ›  mseifert

mysqli准备了带有设置变量的语句

  •  1
  • mseifert  · 技术社区  · 6 年前

    我正在尝试运行一个正在创建透视表的查询。查询在php之外本身运行良好,但在php内使用 mysqli->prepare()

    SQL错误:1064-您的SQL语法有错误;请检查 与右侧MySQL服务器版本相对应的手册 在'set@sql=concat'附近使用的语法…

    如果不了解(希望)查询的细节,是否有一些关于为变量赋值的内容(例如 SET @sql )这里需要另一种语法来处理 mysqli ?如果我从 设置@ 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 回复  |  直到 6 年前
        1
  •  1
  •   Muhammad Bilal    6 年前

    问题是,您试图在单个查询中运行多个查询 prepare 语句。

    您需要为不同变量中的每个查询创建单独的PREPARE语句。

    定义

    准备SQL查询,并返回要用于的语句句柄 对语句的进一步操作。查询必须包含 单个SQL语句。

    来源: http://us3.php.net/manual/en/mysqli.prepare.php