做程序员的或者学程序的都晓得 程序员语言都有保留字/保留英文单词,JS或者PHP也是如此,假如你在编写代码的时候使用一些敏感的保留字/保留词将导致程序发生一些莫名其妙的错误。最近笔者在为客户看看呗[kankanbei.com]做二次开发的时候在使用PHP向MYSQL数据库用insert语句添加新数据的时候发生一件莫名其妙的错误,那么这个PHP+MYSQL ERROR如何解决呢?详情如下:
按照项目开发需求,笔者需要开发一个对联广告管理系统,客户要求可以分别设置左侧对联广告和右侧对联广告是否显示。这个功能很简单,开发思路也很明确:我们决定用JS来实现对联部分,而在网站后台里加一个设置功能,把是否显示广告写入MYSQL数据库的某字段,然后页面中使用PHP来读取MYSQL中该字段的值从而输出对应的JS对联代码。
笔者在数据库中创建了一个表,负责存储广告是否显示的字段命名为show,然后就在测试添加广告功能的时候,MYSQL提示SQL语句出错了!
SQL语句为:INSERT INTO kkb_ads (adpic, adlink, show) VALUES ( 'kkb.jpg', 'http://kankanbei.com', 1)
MYSQL悲催地提示:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'show) VALUES ( 'kkb.jpg', 'http://kankanbei.com', 1)' at line 1
这句MYSQL ERROR错误提示的英语语句翻译为中文就是:你有一个SQL语法错误,请根据你的MYSQL数据库版本的用户帮助手册来检查你的语法。
实在看不出这句SQL有什么错误,笔者手动在PHPMYADMIN中添加了一条数据,发现其SQL语句会在字段名加上``这种英文符号,而把这种符号去掉就会导致MYSQL报错!
真是百思不得其解,这个错误从未遇到过!最后经过网络搜索笔者发现SHOW是MYSQL的保留字词,不能用于建立表格或者字段中,于是将该字段改名为display,OK 错误就这样解决了!
现将MYSQL中的敏感保留字和词列表发布一下,以免大家出现和我一样的错误,你可以使用CTRL+F在本页查找你想找的MYSQL保留字单词。
在MySQL中,下表中的字显式被保留。看看呗[kankanbei.com]提醒您:其中大多数字进制被标准SQL用作列名和/或表名。少数被保留了,因为MySQL需要它们,(目前)使用yacc解析程序。保留字被引起来后可以用作识别符。
ADD | ALL | ALTER |
ANALYZE | AND | AS |
ASC | ASENSITIVE | BEFORE |
BETWEEN | BIGINT | BINARY |
BLOB | BOTH | BY |
CALL | CASCADE | CASE |
CHANGE | CHAR | CHARACTER |
CHECK | COLLATE | COLUMN |
CONDITION | CONNECTION | CONSTRAINT |
CONTINUE | CONVERT | CREATE |
CROSS | CURRENT_DATE | CURRENT_TIME |
CURRENT_TIMESTAMP | CURRENT_USER | CURSOR |
DATABASE | DATABASES | DAY_HOUR |
DAY_MICROSECOND | DAY_MINUTE | DAY_SECOND |
DEC | DECIMAL | DECLARE |
DEFAULT | DELAYED | DELETE |
DESC | DESCRIBE | DETERMINISTIC |
DISTINCT | DISTINCTROW | DIV |
MYSQL关键保留字词查询表 by 看看呗[kankanbei.com] | ||
DOUBLE | DROP | DUAL |
EACH | ELSE | ELSEIF |
ENCLOSED | ESCAPED | EXISTS |
EXIT | EXPLAIN | FALSE |
FETCH | FLOAT | FLOAT4 |
FLOAT8 | FOR | FORCE |
FOREIGN | FROM | FULLTEXT |
GOTO | GRANT | GROUP |
HAVING | HIGH_PRIORITY | HOUR_MICROSECOND |
HOUR_MINUTE | HOUR_SECOND | IF |
IGNORE | IN | INDEX |
INFILE | INNER | INOUT |
INSENSITIVE | INSERT | INT |
INT1 | INT2 | INT3 |
INT4 | INT8 | INTEGER |
INTERVAL | INTO | IS |
ITERATE | JOIN | KEY |
KEYS | KILL | LABEL |
LEADING | LEAVE | LEFT |
LIKE | LIMIT | LINEAR |
LINES | LOAD | LOCALTIME |
LOCALTIMESTAMP | LOCK | LONG |
LONGBLOB | LONGTEXT | LOOP |
LOW_PRIORITY | MATCH | MEDIUMBLOB |
MEDIUMINT | MEDIUMTEXT | MIDDLEINT |
MINUTE_MICROSECOND | MINUTE_SECOND | MOD |
MODIFIES | NATURAL | NOT |
NO_WRITE_TO_BINLOG | NULL | NUMERIC |
ON | OPTIMIZE | OPTION |
OPTIONALLY | OR | ORDER |
OUT | OUTER | OUTFILE |
PRECISION | PRIMARY | PROCEDURE |
PURGE | RAID0 | RANGE |
READ | READS | REAL |
REFERENCES | REGEXP | RELEASE |
RENAME | REPEAT | REPLACE |
REQUIRE | RESTRICT | RETURN |
REVOKE | RIGHT | RLIKE |
SCHEMA | SCHEMAS | SECOND_MICROSECOND |
SELECT | SENSITIVE | SEPARATOR |
SET | SHOW | SMALLINT |
SPATIAL | SPECIFIC | SQL |
SQLEXCEPTION | SQLSTATE | SQLWARNING |
SQL_BIG_RESULT | SQL_CALC_FOUND_ROWS | SQL_SMALL_RESULT |
SSL | STARTING | STRAIGHT_JOIN |
TABLE | TERMINATED | THEN |
TINYBLOB | TINYINT | TINYTEXT |
TO | TRAILING | TRIGGER |
TRUE | UNDO | UNION |
UNIQUE | UNLOCK | UNSIGNED |
UPDATE | USAGE | USE |
USING | UTC_DATE | UTC_TIME |
UTC_TIMESTAMP | VALUES | VARBINARY |
VARCHAR | VARCHARACTER | VARYING |
WHEN | WHERE | WHILE |
WITH | WRITE | X509 |
XOR | YEAR_MONTH | ZEROFILL |