无法识别的令牌:" \"在sqlite中

时间:2014-12-22 02:19:22

标签: php sqlite

我正在运行我的代码并收到此错误

[学说\ DBAL \异常\ DriverException]
  执行' ALTER TABLE
时发生异常                   ImportGenius \ Entities \ SQLite \ TradeBase \ UnitedStates \ UnitedStatesImporterIndex RENAME TO ImportGenius \ Entities \ SQLite \ TradeBa
  SE \ UnitedStates的\ UnitedStatesImporterIndexTemp_2,
                  ImportGenius \ Entities \ SQLite \ TradeBase \ UnitedStates \ UnitedStatesImporterIndexTemp RENAME TO ImportGenius \ Entities \ SQLite \ Tra
  贬低\ UnitedStates的\ UnitedStatesImporterIndex
                  &#39 ;:
  SQLSTATE [HY000]:一般错误:1个无法识别的令牌:" \"

这是我的代码:

private function switchTable(Connection $connection, $primaryTableName, $tempTableName)
{
    $secondaryTempTableName = $tempTableName.'_2';
    $rawSqlQuery = "ALTER TABLE 
            {$primaryTableName} RENAME TO {$secondaryTempTableName},
            {$tempTableName} RENAME TO {$primaryTableName}
            ";

    $stmt = $connection->prepare($rawSqlQuery);
    $stmt->execute();
}

1 个答案:

答案 0 :(得分:1)

很可能SQL语句中的这四个变量中有一个实际上有一个\字符,否则会出现格式错误。

如果您在尝试执行查询之前打印出

92.7%(a)可以解决所有SQL语句问题,例如:

var_dump ($rawSqlQuery);

在这种情况下,\不是表名的有效字符。事实上,它根本不是一个有效的独立令牌。

如果检查负责处理各种表名(sqlite3CreateTablesqlite3AlterRenameTable等)的SQLite源代码,它们通常归结为调用sqlite3GetToken来获取表名。

反过来,该函数会对令牌字符进行大量检查,但最重要的是,在字符串外,\会返回令牌TK_ILLEGAL - 它与任何字符都不匹配有效的令牌,所以它只是落在你看到的switch语句之外:

*tokenType = TK_ILLEGAL;
return 1;

这意味着它在该上下文中无效。

事实上,如果您输入以下任何“命令”,您可以看到:

\;
create table x\y (a integer);
alter table x rename to a\b;

(a)从空气中抽取统计数据,实际值可能会有所不同: - )