使用alter table时是否有必要将mysql真正转义?

时间:2012-04-05 11:15:18

标签: php mysql pdo

前几天我注意到在将PDO与ALTER TABLE一起使用时无法绑定变量,例如以下示例不起作用,

$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?因为查询可以做的唯一事情就是ADD列?

由于

1 个答案:

答案 0 :(得分: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并忽略最后的评论。