я запускал свои коды и получил эту ошибку
[Учение \ DBAL \ Exception \ DriverException] Возникла исключительная ситуация при выполнении команды ALTER TABLEЭто мои коды:
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();
}
Скорее всего, одна из этих четырех переменных в вашем операторе SQL на самом деле имеет \
характер в нем или иным образом искажен.
92,7% (А) все проблемы SQL-операторов могут быть решены, если вы просто распечатать ваш запрос прежде чем пытаться выполнить это, что-то вроде:
var_dump ($rawSqlQuery);
В этом случае, \
не является допустимым символом для имени таблицы. На самом деле, это вовсе не действительный автономный токен.
Если вы изучите исходный код SQLite, отвечающий за обработку различных имен таблиц (sqlite3CreateTable
, sqlite3AlterRenameTable
и так далее) они вообще сводятся к звонкам sqlite3GetToken
чтобы получить имена таблиц.
Эта функция, в свою очередь, выполняет большое количество проверок символов токена, но суть в том, что вне строки \
возвращает токен TK_ILLEGAL
— он не соответствует действительным токенам, поэтому просто выпадает из switch
утверждение в какой момент вы видите:
*tokenType = TK_ILLEGAL;
return 1;
Это означает, что это не действует в этом контексте.
И, на самом деле, вы можете увидеть это, если введете любую из следующих «команд»:
\;
create table x\y (a integer);
alter table x rename to a\b;
(А) Статистика взята из воздуха, фактическое значение может отличаться 🙂
Других решений пока нет …