Ошибка MySQL, вызванная действительным синтаксисом

У меня ошибка MySQL, и я не могу, чтобы жизнь меня поняла. Я использовал один и тот же код несколько раз на моем сайте (хотя никогда не с одним столбцом). Кто-нибудь видит, что я делаю неправильно?

try{
 $conn = new PDO("mysql:host=$dbhost;dbname=$dbname;charset=utf8", $dbuser, $dbpass);
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 if(!empty($_POST['group'])){
 $sql = "INSERT INTO Groups (group) VALUES (:group)";
 $query = $conn->prepare($sql);

 if($query->execute(array(":group" => $_POST['group']))){
 echo 'Successfully created user. <a href="dashboard.php" target="_blank">Go back to admin page</a>';
 }
 else{
 echo 'Something went wrong. Contact the Admin. <a href="dashboard.php" target="_blank">Go back to admin page</a>';
 }
 }
 else{
 echo 'Group cannot be empty. <a href="dashboard.php" target="_blank">Go back to admin page</a>';
 }
 }
 catch(PDOException $e){
 echo $e->getMessage();
 }

Ошибка, которую я получаю:

SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с группой. VALUES ('as12') 'в строке 1

Я сидел над ним в течение часа, и я надеюсь на какой-то внешний вход, чтобы помочь понять это.

2 ответа

Вы не можете использовать зарезервированные слова MySQL (из которых одна group) в запросах как идентификаторы (столбцы, таблицы и т.д.). Если вы хотите использовать такое слово, вы должны обернуть его в обратные ссылки.

INSERT INTO Groups ('group') VALUES (:group)


группа является зарезервированным словом. Вы можете поместить его в backticks, но в целом вы должны стараться избегать использования зарезервированных слов в качестве имен столбцов.

Лучший путь вперед - изменить схему, изменить имя столбца на имя_группы или что-то в этом роде.

ALTER TABLE Groups CHANGE 'group' group_name VARCHAR(100); -- must repeat old column spec

licensed under cc by-sa 3.0 with attribution.