php - 准备好的语句不适用于 ALTER 表查询

标签 php mysql sql pdo

我正在编写一个简单的函数,使用 PHP 和 PDO 向表中添加列来准备查询。

连接 ( $dbh ) 有效,其他不涉及参数的查询有效。但是,添加该列的重要查询却没有。

当我检查数据库时,有一个新列,其列名为 ? (即只是一个问号)以及我指定的所有属性。

我检查过以确保 $column变量正确通过,此外,执行语句返回 false,因此据称该语句失败,但不知何故仍然创建了一个列。

错误信息不是很有帮助(至少对我来说):

Array ( [0] => 00000 ). 

我检查了代码中是否有简单的拼写错误,但找不到任何东西。有什么想法吗?

$qry='ALTER TABLE `completed` ADD `:column` TINYINT(1) NOT NULL DEFAULT 0';
$stmt = $GLOBALS['dbh']->prepare($qry);
$stmt->bindParam(":column",$column,PDO::PARAM_STR);
$stmt->execute();
$arr = $stmt->errorInfo();
print_r($arr);
$stmt===TRUE ? $return=1 : $return=0;

最佳答案

http://dev.mysql.com/doc/refman/5.6/en/prepare.html说:

Parameter markers can be used only where data values should appear, not for SQL keywords, identifiers, and so forth.

标识符指的是数据库名称、表名称、列名称、索引名称、分区名称等。

数据值指的是数字文字、带引号的字符串文字或带引号的日期文字。

要添加新列,您需要在准备查询之前在 SQL 字符串中包含该列的名称。这意味着您需要确保列名称中没有可能创建 SQL 注入(inject)漏洞的有趣字符。

关于php - 准备好的语句不适用于 ALTER 表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22570268/

相关文章:

PHP - 比较两个 JSON 对象的结构

sql - 在 SQL 中存储/更新基于 Interval 的数据的最有效方法是什么?

mysql - SQL:检测重复客户

MySQL 数据库 INNER 连接 - 查询帮助

php - 什么是 PHP7 类型的闭包?

php - 多条件 IF 语句

php - PHP CodeIgniter 中的持续时间重叠检查

PHP 相加两个时间变量

mysql - 为什么这个 SUM 没有给出预期的结果?

php - JavaScript 数组搜索和 MySQL LIKE 查询哪个更有效?