Uncaught PDOException: ошибка синтаксиса или нарушение прав доступа: 1064 из-за неправильного интервала - PullRequest
1 голос
/ 27 мая 2020

Я получаю два разных типа ошибок из одной строки, и мне потребовалось много времени, чтобы выяснить, где была ошибка. Это интересное поведение, которое php демонстрирует при конкатенации MySql операторов запроса с использованием клавиш для разделения строк.

$query='SELECT c.name as category_name, p.id, p.category_id, p.title, p.body, p.author, p.created_at
    FROM'.$this->table. ' p
    LEFT JOIN categories c ON p.category_id=c.id
    ORDER BY p.created_at DESC';

Примечание: между FROM и обратным апострофом нет пробела. Следующая ошибка:

Неустранимая ошибка : Uncaught PDOException: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с 'p LEFT JOIN Categories c ON p.category_id = c .id ORDER BY p.crea' в строке 2 в C: \ xampp \ htdocs \ php_REST_myblog \ models \ Post. php: 31 Трассировка стека:
# 0 C: \ xampp \ htdocs \ php_REST_myblog \ models \ Post. php (31): PDOStatement-> execute ( )
# 1 C: \ xampp \ htdocs \ php_REST_myblog \ api \ posts \ read. php (18): Post-> read ()
# 2 {main} добавлено C: \ xampp \ htdocs \ php_REST_myblog \ models \ Post. php в строке 31

Следующий вариант -

  $query='SELECT c.name as category_name, p.id, p.category_id, p.title, p.body, p.author, p.created_at
    FROM '.$this->table. 'p
    LEFT JOIN categories c ON p.category_id=c.id
    ORDER BY p.created_at DESC';

Обратите внимание на отсутствие пробела между обратной кавычкой и p. Имя БД - myblog, имя таблицы - сообщения. Ошибка:

Неустранимая ошибка : Неперехваченное исключение PDOException: SQLSTATE [42S02]: Базовая таблица или представление не найдено: 1146 Таблица 'myblog.postsp' не существует в C: \ xampp \ htdocs \ php_REST_myblog \ models \ Post . php: 31 Трассировка стека:
# 0 C: \ xampp \ htdocs \ php_REST_myblog \ models \ Post. php (31): PDOStatement-> execute ()
# 1 C : \ xampp \ htdocs \ php_REST_myblog \ api \ posts \ read. php (18): Post-> read ()
# 2 {main} добавлено C: \ xampp \ htdocs \ php_REST_myblog \ models \ Post. php на линии
31

Ниже приведен правильный код с двумя лишними пробелами.

$query='SELECT c.name as category_name, p.id, p.category_id, p.title, p.body, p.author, p.created_at
        FROM '.$this->table. ' p
        LEFT JOIN categories c ON p.category_id=c.id
        ORDER BY p.created_at DESC';

Что происходит не так?

1 Ответ

2 голосов
/ 27 мая 2020

Ваша база данных и имя таблицы будут добавлены из $this->table, а «p» - это псевдоним. Они должны быть отделены друг от друга пробелом, как и имя базы данных, а FROM требует пробела между ними.

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