Как безопасно использовать зарезервированные имена SQL?

Я использую Cakephp 3, используя sqlserver в качестве источника данных. Я уверен, что нет никаких проблем с подключением к базе данных. Поскольку home.ctp запрашивает, что я подключен к моей базе данных .. и я также использую плагин migrations для создания моих таблиц .. кажется, что нет проблем с работой с эти инструменты. но после того, как я испекла свой MVC, я только получил страницу с ошибками.

например, $ bin \ cake испечь все тесты

ошибок нет, и MVC находятся в его конкретной папке, testController.php, testTable и т. д.

и в браузерах localhost: 8765 \ tests

но все, что у меня есть, это страница с разными ошибками.

Error: SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near the keyword 'desc'.

SELECT * FROM (SELECT Tests.id AS [Tests__id], Tests.desc AS [Tests__desc], (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS [_cake_page_rownum_] FROM tests Tests) _cake_paging_ WHERE _cake_paging_._cake_page_rownum_ <= :c0

и больше ошибок на левой стороне.

Я предполагаю, что это из-за controllerов с неправильными запросами или запросами, сгенерированными с помощью bake, только для mysql. Я просто хочу знать, как с этим бороться. есть ли настройки, которые я забыл сделать? пожалуйста посоветуй. Я новичок в Cakephp, а английский – не мой родной язык, извините, если я не могу правильно объяснить свой вопрос. заранее спасибо.

Как уже упоминалось в комментариях к Vishal Gajjar, вы используете зарезервированное ключевое слово desc для своего имени столбца, следовательно, ошибка, это не ошибка пека, это ваша.

Чтобы иметь возможность использовать такие зарезервированные слова, имя столбца должно быть правильно указано, однако CakePHP 3 больше не автокопирует по умолчанию, поскольку это дорогостоящая операция.

Если вы настаиваете на использовании зарезервированных слов, включите quoteIdentifiers идентификатора с помощью параметра app.php конфигурации app.php или включите его вручную, используя метод autoQuoting() ( enableAutoQuoting() как CakePHP 3.4) для драйвера DB.

Смотрите также

  • Cookbook> Доступ к базе данных и ORM> Основы баз данных> Идентификатор Quoting
  • Поваренная книга> Руководство по перенастройке 3.x> Новое руководство по обновлению ORM> Идентификатор с котировкой отключен по умолчанию
  • API> \ Cake \ Database \ Driver :: autoQuoting ()
  • API> \ Cake \ Database \ Driver :: enableAutoQuoting ()

Вы можете использовать этот код перед проблемным запросом:

 $this->Tests->connection()->driver()->autoQuoting(true); 

и когда вы закончите, вы можете отключить автоматическое цитирование:

 $this->Tests->connection()->driver()->autoQuoting(false); 

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

Использовать это :

 SELECT * FROM (SELECT Tests.id AS [Tests__id], Tests.[desc] AS [Tests__desc], (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS [_cake_page_rownum_] FROM tests Tests) _cake_paging_ WHERE _cake_paging_._cake_page_rownum_ <= :c0 

Если вы используете ключевое слово, используйте его в квадратных скобках [ ]

  • MySQL - значение «PRIMARY KEY», «UNIQUE KEY» и «KEY» при совместном использовании при создании таблицы
  • Получение данных с кодировкой UTF-8 с сервера MSSQL с использованием расширения PHP FreeTDS
  • Должен ли MAMP возвращать :: 1 как IP на localhost?
  • Найти все таблицы, содержащие столбец с указанным именем - MS SQL Server
  • PHP Неустранимая ошибка: вызов неопределенной функции mssql_connect ()
  • Как ускорить массовую вставку в MS SQL Server из CSV, используя pyodbc
  • Инструкция INSERT противоречит ограничению FOREIGN KEY - SQL Server
  • Практическое руководство. Модель базы данных в Visio 2013
  • Соединение CodeIgniter MSSQL
  • Сравните DATETIME и DATE, игнорируя временную часть
  • Как проверить, существует ли столбец в таблице SQL Server?
  • Давайте будем гением компьютера.