我正在努力使用电子邮件地址作为表名来创建SQL表。
我使用的代码会产生以下错误:
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 '@ gmail.com附近(id INT NOT NULL AUTO_INCREMENT,PRIMARY KEY(id), 在第1行命名VARCHAR'
,相关代码是:
// create new table for users tosses
// Make a MySQL Connection
mysql_connect("localhost", "$sqlusername", "$sqlpassword") or die(mysql_error());
mysql_select_db("$db_name") or die(mysql_error());
// Create a MySQL table in the selected database
mysql_query("CREATE TABLE $emailaddress(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(30),
age INT)")
or die(mysql_error());
当我从变量$emailaddress
输入一个不是电子邮件地址的值,即没有@
符号时,它工作正常,但如果它包含@
则显示错误}符号。
答案 0 :(得分:8)
你应该能够通过使用反引号(`)转义表名来解决这个问题。但实际上,对于大多数情况来说,这是设计数据库的一种糟糕方式。
除非您有特殊需要,否则您应该使用一个带有emailaddress字段的表,而不是为每个用户/电子邮件地址创建一个新表。
答案 1 :(得分:0)
这里的问题是你没有使用反引号。使用反引号可以让您更自由地选择标识符:
CREATE TABLE `$emailaddress` ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), name VARCHAR(30), age INT)
有关详细信息,请参阅here。
答案 2 :(得分:0)
http://dev.mysql.com/doc/refman/5.5/en/identifiers.html
Permitted characters in quoted identifiers include the full Unicode Basic Multilingual Plane (BMP), except U+0000:
ASCII: U+0001 .. U+007F
答案 3 :(得分:0)
将一个表设计如下
可能对您有利CREATE TABLE emailaddr
(
id INT NOT NULL AUTO_INCREMENT,
email varchar(50),
PRIMARY KEY(id),
name VARCHAR(30),
age INT,
unique key (email)
);
我建议这样做的原因是如果您必须向表中添加更多字段,您只需要更改一个表。使用您正在使用的设计,您将不得不查询可能尚不存在的表(mysql将为您提前做的事情)。如果你添加字段,你必须循环数百甚至数千个表来进行必要的更改。
您可以查询如下的电子邮件地址:
SELECT * FROM db_name.emailaddr where email = '$emailaddress';
根据您的设计,您必须先检查表格是否存在
SELECT COUNT(1) FROM information_schema.tables
WHERE table_schema = 'db_name' AND table_name = '$emailaddress';
然后,如果表计数为1,那么你可以
SELECT * FROM db_name.`$emailaddress`;
答案 4 :(得分:0)
将您的代码更改为:
// create new table for users tosses
// Make a MySQL Connection
mysql_connect("localhost", "$sqlusername", "$sqlpassword") or die(mysql_error());
mysql_select_db("$db_name") or die(mysql_error());
// Create a MySQL table in the selected database
mysql_query("CREATE TABLE `$emailaddress`(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(30),
age INT)")
or die(mysql_error());
你需要在变量附近留下“嘀嗒”。