2010-01-08 43 views
0

首先,我刚开始用PHP学习MySQL。这个PHP-MySQL CREATE TABLE查询有什么问题?

我的查询复制/粘贴直接从我的IDE:

$query = "CREATE TABLE IF NOT EXISTS $table_messages (
       id  int(11)  unsigned NOT NULL auto_increment, 
       show  tinyint(1)  unsigned NOT NULL default '0', 
       to  varchar(255)    NOT NULL default '', 
       from  varchar(255)    NOT NULL default '', 
       type  varchar(255)    NOT NULL default '', 
       message varchar(255)    NOT NULL default '', 
       PRIMARY KEY(id) 
      ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"; 

$result = mysql_query($query, $link) OR exit (mysql_error()); 

导致此错误:

You have an error in your SQL syntax; near 'show tinyint(1) unsigned NOT NULL default '0' , to varchar(255) N' at line 4

...所以我一个字符添加到show(如showz),并得到这个错误:

You have an error in your SQL syntax; near 'to varchar(255) NOT NULL default '' , from varchar(255) NOT NUL' at line 5

...所以我添加一个字符到to(例如toz),并得到这个错误:

You have an error in your SQL syntax; near 'from varchar(255) NOT NULL default '' , type varchar(255) NOT NU' at line 6

...所以我一个字符添加到from(例如fromz)和它的作品!?

这是怎么回事?大声笑

如果这个问题太明显,我会删除它,如果社区认为这将是审慎的,但在此期间,我很难过。

顺便说一句,我已经与间距,案件和其他事情搞砸了没有任何成功。

+0

我不建议对零长度字符串默认 –

+0

@OMG_Ponies,为什么不呢? – Jeff

回答

4

SHOW,TOFROM是保留的MySQL关键字。您必须使用反引号引用他们,使他们作为列名工作:

$query = "CREATE TABLE IF NOT EXISTS $table_messages (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `show` tinyint(1) unsigned NOT NULL default '0' , 
    `to` varchar(255) NOT NULL default '' , 
    `from` varchar(255) NOT NULL default '' , 
    `type` varchar(255) NOT NULL default '' , 
    `message` varchar(255) NOT NULL default '' , 
    PRIMARY KEY(id) 
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"; 

它通常是很好的做法(虽然不需要),以这种方式来防止意外碰撞与关键字,有数百人报每列名。有关完整列表,请参阅http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html

+0

哇。我认为,作为一种最佳做法,我总是在我的专栏名称中加入反引号。谢谢! – Jeff

+2

......或许我不应该为我的列使用任何保留的MySQL关键字。 – Jeff

0

只是一个刺在黑暗中,但是从MySQL中的保留字?你可以用[]和[来]这样的[]来包装这些单词,或者像你一样,将这些词语改为toperson或fromperson?

2

您可能会感兴趣this list of reserved words in MySQL statements。总之,如果你想使用任何这些作为列名(或以下查询的任何地方),你得说出来了,通常是在反引号:

`show` TINYINT(1) UNSIGNED NOT NULL, 

...后来:

SELECT `show` FROM `varchar` WHERE `to`="France" 
0

这不是您的问题的答案,但它的答案是“a PHP-MySQL CREATE TABLE查询有什么问题?” (另一个Google员工)

也许不是PHP的所有版本都是这样的,但在我的环境,非PDO命令,如“的mysql_query”当我试图做一个表抛出一个错误:

CREATE TABLE IF NOT EXISTS `actionlog` 

错误:

You have an error in your SQL syntax 

PDO适配器可以正常工作。