表名不正确,php / mysql

时间:2010-05-15 15:02:59

标签: 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) );

在我的localhost上工作正常,但是当我将它上传到服务器时,它开始给我一个“不正确的表名'user_vasya@rossya.pu'”错误。任何想法?

谢谢!

5 个答案:

答案 0 :(得分:2)

表名称不能包含@.。此外,您要做的是数据库设计非常糟糕。使用单个表,并将电子邮件地址(或更好的,另一个表中的ID作为整数)添加为密钥。

答案 1 :(得分:2)

一旦你说“我为每个用户创建一个表”,这就是我称之为元数据Tribbles 的反模式。问题是这些表往往会失控。 : - )

相反,您应该创建一个表,并将用户电子邮件的列作为属性。

如果您使用delimited identifiers,则SQL表名可以包含特殊字符,甚至包括空格,SQL保留字,国际字符等。但如果您取消后引号, @.不是标识符的有效字符,因为它会混淆SQL解析器。想一想:你是否使用任何其他编程语言接受.作为变量名或类名中的有效字符?

其他提示:

IP更容易存储为INT UNSIGNED,并且有函数INET_ATON()INET_NTOA()可以将IP地址字符串转换为二进制等效字符串。这有助于确保不会意外存储无效的IP地址。您还可以使用按位二进制运算符对二进制形式的IP地址执行子网掩码操作。

FLD1FLD2FLD3等不具有描述性,表明您没有充分设计此表。您甚至可能需要split this table into a few separate tables来管理多值属性。但是由于你的列被如此抽象地命名,所以无法告诉你如何做到这一点。

答案 2 :(得分:1)

看起来主机文件系统的文件名不正确。

但是你不应该为每个用户创建一个表。对于具有user_id字段的所有用户,它必须是一个表。

答案 3 :(得分:0)

我的第一个念头是“天啊!桌子真可怕!” : - )

MySQL文档声明:

  

数据库和表名称不能包含“/”,“\”,“。”或文件名中不允许的字符。

我怀疑你在两个方面违反了这一点,你的域名中的.和(可能)@分隔符。

您可能应该考虑使用一个表格来锁定电子邮件地址(或其他唯一ID)。

答案 4 :(得分:0)

表名不能包含@或..