2014-02-09 120 views
-2

由于PDOStatement::执行文档中说,“所有的值都为PDO::PARAM_STR处理 所以我有以下问题绑定值和参数在PDO预处理语句:PHP

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

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

当我执行语句,它成功地执行。 这意味着它作为一个整数.Does它做自动注入或违反该文件的语句将变量?

2)Suppse我有另一个查询

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 error.How我可以纠正它吗?

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

回答

2

1)当我执行语句,它成功地执行。它 表示它以整数形式传递变量。它是否自动执行 强制转换或违反文档声明?

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

2)做我需要指定PDO::PARAM_STR或者我可以依靠的默认 实现,它默认为 文件说,被视为字符串。

除非API发生变化,否则可以肯定的是,如果文档中有这样的说明,它将被绑定为一个字符串。我怀疑API会很快改变,或者根本不会改变。我仍然可以明确地将它绑定为字符串,只是为了让读者了解源代码。

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

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

+0

在最后一个问题我想动态改变表名,其中我通过获取'GET'.Isn't有什么办法来创建动态表名这样的查询。这就是最后一个问题 –

+0

的目的,你必须这么做:'“SELECT * FROM $ table ...”'。您必须保留*允许的表名称*白名单*!在以这种方式将查询插入查询之前,检查“$ table”是否是一些允许的值之一。 – deceze

+0

@InsaneCoder如果你需要的话,这意味着你的数据库设计是*疯狂*,你最好使它*正常* –