-1

メール アドレスをテーブル名として使用して SQL テーブルを作成するのに苦労しています。

私が使用しているコードは、次のエラーを生成します。

SQL 構文にエラーがあります。1 行目の '@gmail.com( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), name VARCHAR' の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

関連するコードは次のとおりです。

// 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電子メールアドレスではない、つまり記号を持たない変数から値を入力すると問題なく動作しますが、@記号が含まれているとエラーが表示されます@

4

5 に答える 5

8

テーブル名をバッククォート( `)でエスケープすることで、これを回避できるはずです。しかし、実際にはほとんどの状況で、これはデータベースを設計するための悪い方法です。

特に必要がない限り、ユーザー/電子メールアドレスごとに新しいテーブルを作成するのではなく、電子メールアドレスフィールドを持つ1つのテーブルを使用する必要があります。

于 2012-05-11T21:38:34.587 に答える
0

次のように1つのテーブルを設計することはおそらくあなたの利益になるでしょう

CREATE TABLE emailaddr
(
    id INT NOT NULL AUTO_INCREMENT,
    email varchar(50),
    PRIMARY KEY(id),
    name VARCHAR(30),
    age INT,
    unique key (email)
);

これを提案する理由は、テーブルにフィールドを追加する必要がある場合に備えて、1つのテーブルを変更するだけで済みます。使用しているデザインでは、まだ存在していない可能性のあるテーブルをクエリする必要があります(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`;
于 2012-05-11T21:48:48.547 に答える
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

于 2012-05-11T21:41:04.420 に答える
0

ここでの問題は、バックティックを使用していないことです。バックティックを使用すると、識別子をより自由に選択できます。

CREATE TABLE `$emailaddress` ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), name VARCHAR(30), age INT)

詳細については、こちらを参照してください。

于 2012-05-11T21:39:00.267 に答える
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()); 

変数の前後にバックティック「`」が必要です。

于 2012-05-11T22:52:22.220 に答える