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
?
答案 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)
不带引号的标识符中允许的字符:
ASCII:[0-9,a-z,A-Z $ _](基本拉丁字母,数字0-9,美元,下划线)
扩展:U + 0080 .. U + FFFF
因此,正如消息所暗示的那样,除非引用标识符,否则架构对象标识符中不允许使用连字符:
SELECT title FROM `never-ending-book`