2010-05-15 49 views
2

我有了這個代碼不正確的表名,PHP/MySQL的

 mysqli_query ($userdatabase, 
     'CREATE TABLE `user_'.$emailreg.'` (
     ID int NOT NULL AUTO_INCREMENT PRIMARY KEY, 

     IP varchar(10), 
     FLD1 varchar(20), 
     FLD2 varchar(40), 
     FLD3 varchar(25), 
     FLD4 varchar(25), 
     FLD5 varchar(25))'); 

     echo (mysqli_error ($userdatabase)); 

是在我的本地工作正常,但是當我把它上傳到服務器,它開始給我一個「不正確的表名「user_vasya @ rossya.pu'「錯誤。任何想法?

謝謝!

+1

你爲什麼需要每個用戶?爲什麼不把所有的數據存儲在一張表+字段中的電子郵件? – zerkms 2010-05-15 15:06:07

+0

,因爲會有更多(1到10個額外的信息行),那麼只需爲每個用戶發送電子郵件和密碼。 – 2010-05-15 15:23:16

+0

@user可以爲每個用戶添加額外的行。這是NORMAL數據庫設置。你爲什麼不自己寫一本書,學一點? – 2010-05-15 15:31:32

回答

2

只要你說「我每個用戶創建一個表,」這是一個反模式我稱之爲元數據中Tribbles。問題在於這些表格傾向於重現失控。 :-)

相反,您應該創建一個表,並將用戶電子郵件的列作爲屬性。

如果使用delimited identifiers,SQL表名可以包含特殊字符,甚至是空白,SQL保留字,國際字符等,但如果你把反引號了,@.沒有有效字符一個標識符,因爲它會混淆SQL解析器。考慮一下:你是否使用任何其他編程語言來接受.作爲變量名或類名中的有效字符?

其他提示:

IP更容易被儲存爲INT UNSIGNED,並有功能INET_ATON()INET_NTOA()將IP地址字符串轉換爲從二進制數。這有助於確保您不會意外存儲無效的IP地址。您也可以使用按位二進制運算符對二進制形式的IP地址執行子網掩碼操作。

FLD1,FLD2,FLD3等不是描述性的,並且表明你沒有充分設計這張表。您甚至可能需要split this table into a few separate tables來管理多值屬性。但是由於你的專欄的命名非常抽象,所以不能告訴你該怎麼做。

1

看起來主機文件系統的文件名不正確。

但是,您不應該爲每個用戶創建一張表。它必須是具有user_id字段的所有用戶的一張表。

2

表名不能包含@.。另外,你要做的是非常差的數據庫設計。使用單個表格,然後將電子郵件地址(或更好的是,將另一個表格中的ID作爲整數)作爲關鍵字添加。

+0

奇怪的是,我的本地主機(xampp)拿這樣的表名沒有問題,只要它在'撇號'。 – 2010-05-15 15:21:14

0

我的第一個想法是「OMG!桌子真是個可怕的名字!」 :-)

MySQL的文檔指出:

數據庫和表名不能包含「/」,「\」,或者未在文件名中不允許的字符「」。

我懷疑你違反這兩項罪名,在.在您的域名和(可能)的@分隔符。

您應該考慮讓一個表格在電子郵件地址(或另一個唯一ID)上鍵入。