2010-01-08 5 views
0

D'abord, je commence juste à apprendre MySQL avec PHP.Quel est le problème avec cette requête PHP-MySQL CREATE TABLE?

Ma copie de recherche/coller directement à partir de mon 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()); 

résultats dans cette erreur:

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

... J'ajoute donc un caractère à show (par exemple showz) et obtenir cette erreur:

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

... J'ajoute donc un caractère à to (par ex. toz) et obtenir cette erreur:

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

... J'ajoute donc un caractère à from (par exemple fromz) et IT Works !?

Que se passe-t-il? Lol

Si cette question est trop flagrante, je l'enlèverai si la communauté pense que ce serait prudent, mais en attendant je suis perplexe.

BTW, j'ai raté avec l'espacement, l'affaire et d'autres choses sans succès.

+0

Je ne recommande pas la valeur par défaut à une chaîne de longueur nulle –

+0

@OMG_Ponies, Pourquoi pas? – Jeff

Répondre

4

SHOW, TO et FROM sont des mots-clés MySQL réservés. Vous devez les citer avec des accents graves pour les faire fonctionner en tant que noms de colonnes:

$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"; 

Il est généralement une bonne pratique (mais non nécessaire) de citer tous les noms de colonne de cette façon pour éviter les collisions accidentelles avec des mots clés comme il y a des centaines d'entre eux. Pour une liste complète, voir http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html.

+0

Wow. Je pense que comme une bonne pratique, je vais toujours inclure des backticks sur mes noms de colonnes. Merci! – Jeff

+2

... Ou peut-être que je ne devrais utiliser aucun mot-clé MySQL réservé pour mes colonnes. – Jeff

0

Juste un coup dans le noir, mais sont à et de mots réservés dans mysql? Pourriez-vous soit envelopper ces mots dans [] comme [à] et [à partir de] ou, comme vous l'avez fait, changer les termes pour toperson ou de personne?

2

Vous pourriez être intéressé par this list of reserved words in MySQL statements. En bref, si vous voulez utiliser un d'entre eux comme un nom de colonne (ou ne importe où dans la suite des requêtes), vous devez les citer, le plus souvent dans les apostrophes inverses:

`show` TINYINT(1) UNSIGNED NOT NULL, 

... et plus tard:

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

Ce n'est pas la réponse à votre problème, mais c'est la réponse à "Qu'est-ce qui ne va pas avec une requête CREATE TABLE PHP-MySQL?" (Pour une autre googler)

Peut-être pas toutes les versions de PHP sont comme ça, mais dans mon environnement, les commandes non AOP comme « mysql_query » jette une erreur lorsque je tente de faire une table:

CREATE TABLE IF NOT EXISTS `actionlog` 

erreur :

You have an error in your SQL syntax 

Fonctionne très bien avec l'adaptateur PDO.

Questions connexes