令牌可以参数在PDO准备语句?(Which tokens can be parameterized

2019-09-01 04:18发布

我玩弄在PHP / PDO准备语句。 基本查询做工精细,值传递给WHERE子句:

$stmt = $db->prepare( 'SELECT title FROM episode WHERE id=:id' );
$stmt->bindParam( ':id', $id, PDO::PARAM_INT );
$id = 5;
$stmt->execute();

但是我有一个情况我需要传递变量的字段名。 该查询(在适当的结合)正常工作:

SELECT :field FROM episode WHERE id=:id

这一次给出了一个错误:

SELECT title FROM :field WHERE id=:id

这一次不给一个错误,但不返回行:

SELECT title FROM episode WHERE :field=:id

那么,有什么事情应该在事先准备好的发言工作? 我可以“参数”字段名,表名等等?

Answer 1:

你不能参数表名,列名,或任何一个在IN子句(感谢c0r0ner用于指明了IN子句限制 )。

见这个问题 ,并随后在PHP手册此评论 。



Answer 2:

@乔希Leitzel

这种想法是非常有限的(并且是在我看来,仅仅因为是懒得去实现一个强大的解决方案的借口),特别是在数据库中表达的动态树结构。

请看下面的例子:

我的项目有一个逻辑结构:

一个公司层级中的实体表示。 每个实体可以在被分级的或作为层次结构的特定电平的一个部件的部件一般情况下进行处理。 层次结构本身是在一个表中定义为一个单一的树枝如下:

entity_structure (
   id
   name
   parent_entity_structure_id
);

和实体本身表示为:

entities (
   id
   name
   entity_structure_id
   parent_id
);

为了方便使用,我已经建立了创建树的平面视图的算法。 下面具体的例子说明我的意思:

SELECT * FROM entity_structure;

id      | name               | entity_structure_parent_id
-----------------------------------------------------------
1       | Company            | null    (special one that always exists)
2       | Division           | 1
3       | Area               | 2
4       | Store              | 3

这将导致所生产的以下平面表示:

entity_tree (
   entity_id
   division_id
   area_id
   store_id
)

实体是师级将有division_id,AREA_ID和商店编号为NULL,面积AREA_ID和商店编号为NULL,等等。

关于这个的好处是,它可以让你使用类似如下的陈述查询部门的所有的孩子:

SELECT * FROM entity_tree WHERE division_id = :division_id;

然而,这假定我知道我查询实体的结构层次。 这将是很好的事情:

SELECT * FROM entity_tree WHERE :structure = :entity_id;

我知道这不是很难找出一个单一实体的结构水平,但假设我通过实体可能不是所有在同一级别的集合循环。 因为它是现在我必须建立对每个层次进行单独查询,但如果我能参数场我能做到以下几点:

$children = array();
$stmt = $pdo->prepare('SELECT entity_id FROM entity_tree WHERE :structure = :entityId');
foreach ($entities AS $entity) {
   $stmt->execute(array(
      ':structure' = $entity->getEntityStructureId(),
      ':entityId'  = $entity->getId()
   ));

   $children[$entity->getId()] = $stmt->fetchAll(PDO::FETCH_COLUMN);
}

导致更干净的代码,只有一个事先准备好的声明。

整个示例使用没有用户输入的任何。

只是要考虑的问题。



Answer 3:

你不能在任何参数IN子句为好。



文章来源: Which tokens can be parameterized in PDO prepared statements?