1

先日、ALTER TABLEでPDOを使用すると変数をバインドできないことに気付きました。たとえば、次の例は機能しません。

$q = $dbc -> prepare("ALTER TABLE emblems ADD ? TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', ADD ? DATETIME NOT NULL"); 
$q -> execute(array($emblemDB, $emblemDB . 'Date')); 

したがって、mysql_real_escape文字列を使用して、以下のようにする必要があります。

// ESCAPE NAME FOR MYSQL INSERTION
$emblemDB = mysql_real_escape_string($emblemDB);
// INSERT EMBLEM DETAILS INTO DATABASE
$q = $dbc -> prepare("ALTER TABLE emblems ADD " . $emblemDB . " TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', ADD " . $emblemDB . "Date DATETIME NOT NULL");
$q -> execute();

または、追加する必要はありませんmysql_real_escape_stringか?クエリで実行できるのは列の追加だけですか?

ありがとう

4

1 に答える 1

1

依存します。クエリでユーザー入力を直接使用する場合は、それを使用する必要があります。そうしないと、ユーザーはクエリを区切り、DROPその後にステートメントをスローする可能性があります。

ユーザーが入力する場合:

somekindofname TINYINT(1) UNSIGNED NOT NULL DEFAULT '0'; DROP TABLE emblems --

クエリは次のようになります。

ALTER TABLE emblems ADD somekindofname TINYINT(1) UNSIGNED NOT NULL DEFAULT '0'; DROP TABLE emblems -- TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', ADD TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' somekindofname; DROP TABLE emblems -- Date DATETIME NOT NULL

データベースはを実行しALTER TABLE、を実行DROP TABLEし、最後のコメントを無視します。

于 2012-04-05T11:25:47.113 に答える