PDO准备语句中的绑定值和参数:PHP

时间:2014-02-09 12:29:05

标签: php mysql sql pdo

正如PDOStatement::执行文档所述,“所有值都被视为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'...........   

1 个答案:

答案 0 :(得分:2)

  

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

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

  

2)我是否需要指定PDO::PARAM_STR或者我可以依赖默认值   默认情况下将其视为字符串的实现   文件说。

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

  

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

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