问题
I'm struggling to create SQL tables using email addresses as the table name.
The code I am using produces the following error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@gmail.com( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), name VARCHAR' at line 1
and the related code is:
// 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());
It works just fine when I input a value from the variable $emailaddress that is not an email address i.e. doesnt have an @ symbol, but it shows that error if it includes an @ symbol.
回答1:
You should be able to get around this by escaping the table name with backticks (`). But really for most circumstances this is a bad way to design your database.
You should use one table with an emailaddress field instead of creating a new table for each user/email address, unless you have a specific need to do so.
回答2:
The problem here is that you're not using backticks. Using backticks allows you to choose identifiers more freely:
CREATE TABLE `$emailaddress` ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), name VARCHAR(30), age INT)
See here for more information on this.
回答3:
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
回答4:
It would probably be to your advantage to have one table designed as follows
CREATE TABLE emailaddr
(
id INT NOT NULL AUTO_INCREMENT,
email varchar(50),
PRIMARY KEY(id),
name VARCHAR(30),
age INT,
unique key (email)
);
The reason I suggest this is in the event you have to add more fields to the table, you only have to alter one table. With the design you are using, you would have to query a table that may not exist yet (something mysql would do for you upfront). Should you add fields, you have to cycle through hundreds, probably thousands, of table to make needed changes.
You could query for an email address like this:
SELECT * FROM db_name.emailaddr where email = '$emailaddress';
With your design, you must check if the table exists first
SELECT COUNT(1) FROM information_schema.tables
WHERE table_schema = 'db_name' AND table_name = '$emailaddress';
Then, if the table count is 1, then you could
SELECT * FROM db_name.`$emailaddress`;
回答5:
Change your code to this:
// 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());
You need back ticks "`" around the variable.
来源:https://stackoverflow.com/questions/10558952/creating-an-sql-table-with-email-address-as-title