【问题标题】:Binding values and Parameters in PDO Prepared Statements :PHP在 PDO 准备语句中绑定值和参数:PHP
【发布时间】:2014-02-09 12:29:04
【问题描述】:

正如PDOStatement::execute 文档所说,“所有值都被视为PDO::PARAM_STR。 所以我有以下问题

1)假设我有一个变量$_SESSION['id']=2 和一个查询

$sql='select * from articles where id=?';
$query=$con->prepare($sql);
$query->execute(array($_SESSION['id']));

当我执行语句时,它执行成功。 它表示它将变量作为整数传递。它会自动转换还是违反文档声明?

2)假设我有另一个查询

select * from articles where id=? and category=?

现在这里第一个参数是int,最后一个参数是string,所以当我绑定参数$query->bindValue(2, $_GET['category'],PDO::PARAM_STR);时,我是否需要指定PDO::PARAM_STR,或者我可以依赖默认实现,它被认为是string默认情况下,如文档所述。

3)我想在查询中指定$_GET['category'] 中的表名,但我得到以下格式的字符串(注意表名周围的引号),因此出现 SQL 错误。我该如何更正它?

select * from 'article'...........   

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    1) 当我执行语句时,它执行成功。它 表示它将变量作为整数传递。它是否自动 铸造或违反文档声明?

    不,它确实将参数作为字符串传递。 MySQL 将其透明地转换回 int,因为该列是一个 int 值,在这种情况下没有副作用。

    2) 我需要指定PDO::PARAM_STR 还是可以依赖默认值 默认情况下它被视为字符串的实现 文档说。

    除非 API 发生变化,否则如果文档说明,它肯定会绑定为字符串。我怀疑 API 会很快改变,或者根本不会改变。我可能仍然将它显式绑定为字符串,只是为了让源代码的读者非常清楚。

    3) 我想将 $_GET['category'] 中的表名指定到查询中 ...

    你不能。您只能“占位”,而不是标识符或查询的其他结构元素。参数化语句明确区分查询的结构和动态插入其中的;如果你可以动态地插入结构元素,那么这种分离就没有意义了。

    【讨论】:

    • 在最后一个问题中,我想动态更改表名,我正在通过GET获得。没有任何方法可以使用动态表名创建这样的查询。这就是目的最后一个问题
    • 您必须按照旧的方式进行操作:"SELECT * FROM $table ..."。您必须保留允许的表名的白名单!在以这种方式将其插入查询之前,请检查 $table 是否是少数允许的值之一。
    • @InsaneCoder 如果你需要,这意味着你的数据库设计是 insane 并且你最好让它normal
    猜你喜欢
    • 2015-07-13
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2014-04-19
    相关资源
    最近更新 更多