0

テーブルをphpから作成し、送信者が入力する変数として名前を付けることができるプラットフォームを作成しようとしています。ここにあるコードは、mysql 構文エラーを引き起こします。括弧の配置の問題だと思いますが、私が試したすべての組み合わせは失敗しましたが、誰かがそれを理解できますか? 混乱を避けるために、間違った括弧を削除しました

    <?php

if (isset($_POST['submit']))
{ 
$name=$_POST['name'];

mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());


mysql_query("CREATE TABLE '$name'(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(30),
age INT)")
or die(mysql_error());  

echo "Table Created!";

?>   <html><form method='POST'>..........</html>
4

5 に答える 5

2

SQLテキストのテーブル名をバッククォートで囲みます。

mysql_query("CREATE TABLE `$name`(

バックティックは、MySQLの識別子のデフォルトの区切り文字です。(注:他の区切り文字を有効にすることは可能ですが、実際にはそこに行きたくありません。)

識別子が予約語である、空白が含まれているなどの場合、バックティックは必須です(バックティックは多くの場合省略できますが、不要な場合は使用するのは間違いではありません。基本的に、ルールを考えてください。 「常に識別子の周りにバッククォートを使用する」ので、都合がよく、必要ないことが確実な場合は省略してください。)

于 2012-07-27T15:57:27.530 に答える
1

これはうまくいくかもしれません:

if (isset($_POST['submit']))
{ 
$name=$_POST['name'];

mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());


mysql_query("CREATE TABLE ".$name."(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(30),
age INT)")
or die(mysql_error());  

echo "Table Created!";
}
?>

私はそれをテストしましたが、問題はありません...この構造でテーブルを作成します。

于 2012-07-27T15:41:57.883 に答える
0

入力データを完全に信頼しない限り、 SQL インジェクションから保護するために $name を検証することが非常に重要です。

于 2012-07-27T16:43:23.577 に答える
0

への変更 :mysql_query("CREATE TABLE ".$name."(

于 2012-07-27T15:42:04.307 に答える
0

テーブル名を一重引用符で囲みません。予約語や文字に一致する名前でも処理できるように、バックティックに配置します。このような

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

他の提案された回答のようにバックティックなしで行うこともできますが、最初に多数の MySQL 予約語に対してテーブル名をチェックする必要がない場合、これはより信頼性が高くなります。

于 2012-07-27T15:43:34.547 に答える