尝试 - 捕获语法错误

时间:2016-06-15 18:39:39

标签: php mysql

try {
$stmt = $db->query('SELECT title FROM never-ending-book');
while($row = $stmt->fetch()){
    echo '<div class="lev3">'.$row['title'].'</div>';
    }
}catch(PDOException $e) {
    echo $e->getMessage();
};

结果:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-ending-book' at line 1

语法错误在哪里?为什么never-ending-book成为near'-ending-book

2 个答案:

答案 0 :(得分:3)

如果您碰巧查看了MySQL Manual,它会告诉您:

  

标识符在内部转换为Unicode。它们可能包含以下字符:

     
      
  • 未加引号 标识符中允许的字符数:

         
        
    • ASCII:[0-9,a-z,A-Z $ _](基本拉丁字母,数字0-9,美元,下划线)
    •   
  •   

(我的粗体/斜体)

并且因为您没有用反引号引用您的列/表名称,所以此语句(如上所述)适用。

解决方案:

在反引号中包含您的表名和列名,和/或重命名它们以删除不符合上述规范的字符。

另请仔细阅读MySQL Keywords and Reserved Words listing

  • 这个问题不会引起PHP Try / Catch块的任何问题。

  • 知道以后的参考可能是有用的,当MySQL声明错误时,开始在引用的字符串之前查看SQL查询的部分,所以near'-ending-book表示look at the character(s) at or before '-ending-book

答案 1 :(得分:2)

根据the documentation

  

不带引号的标识符中允许的字符:

     
      
  • ASCII:[0-9,a-z,A-Z $ _](基本拉丁字母,数字0-9,美元,下划线)

  •   
  • 扩展:U + 0080 .. U + FFFF

  •   

因此,正如消息所暗示的那样,除非引用标识符,否则架构对象标识符中不允许使用连字符:

SELECT title FROM `never-ending-book`