我有这段代码
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) );
在我的localhost上工作正常,但是当我将它上传到服务器时,它开始给我一个“不正确的表名'user_vasya@rossya.pu'”错误。任何想法?
谢谢!
答案 0 :(得分:2)
表名称不能包含@
或.
。此外,您要做的是数据库设计非常糟糕。使用单个表,并将电子邮件地址(或更好的,另一个表中的ID作为整数)添加为密钥。
答案 1 :(得分: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来管理多值属性。但是由于你的列被如此抽象地命名,所以无法告诉你如何做到这一点。
答案 2 :(得分:1)
看起来主机文件系统的文件名不正确。
但是你不应该为每个用户创建一个表。对于具有user_id字段的所有用户,它必须是一个表。
答案 3 :(得分:0)
我的第一个念头是“天啊!桌子真可怕!” : - )
MySQL文档声明:
数据库和表名称不能包含“/”,“\”,“。”或文件名中不允许的字符。
我怀疑你在两个方面违反了这一点,你的域名中的.
和(可能)@
分隔符。
您可能应该考虑使用一个表格来锁定电子邮件地址(或其他唯一ID)。
答案 4 :(得分:0)
表名不能包含@或..