Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO参数化查询-重用命名占位符?_Php_Pdo - Fatal编程技术网

Php PDO参数化查询-重用命名占位符?

Php PDO参数化查询-重用命名占位符?,php,pdo,Php,Pdo,本质上,我有一个值,我必须在我的SQL查询中调用几次。因此,是否可以在语句中重用相同的命名占位符,例如。 从Column=:Param的表中选择:Param,然后简单地bindValue(“:Param”),并使两个参数的值都存在:Params?声明“不能在准备好的语句中两次使用相同名称的命名参数标记”,因此我猜这是否定的 除了重用,这里的主要问题是您正在尝试动态更改列名称 此答案由匿名用户发布在: 对于那些想知道为什么在占位符周围添加引号是错误的人, 以及为什么不能对表或列名使用占位符: 对于

本质上,我有一个值,我必须在我的SQL查询中调用几次。因此,是否可以在语句中重用相同的命名占位符,例如。
从Column=:Param
的表中选择:Param,然后简单地bindValue(“:Param”),并使两个参数的值都存在:Params?

声明“不能在准备好的语句中两次使用相同名称的命名参数标记”,因此我猜这是否定的

除了重用,这里的主要问题是您正在尝试动态更改列名称

此答案由匿名用户发布在:

对于那些想知道为什么在占位符周围添加引号是错误的人, 以及为什么不能对表或列名使用占位符:

对于如何准备占位符,存在一种常见的误解 语句工作:它们不是简单地替换为as(转义) 字符串,并执行结果SQL。相反,DBMS要求 “prepare”语句提供了一个完整的查询计划,说明如何使用它 将执行该查询,包括它将执行哪些表和索引 使用,无论您如何填写 占位符

“从my_表中选择名称,其中id=:value”的计划将是 无论你用什么来代替“:value”,都是一样的,但看起来很相似 无法计划“从:表中选择名称,其中id=:值”,因为 DBMS不知道您实际上要从哪个表中选择

即使使用“模拟准备”,PDO也不能让您使用 占位符在任何地方,因为它必须计算出您需要的内容 意思是:“从某个表中选择:foo”是否意味着:foo将成为 列引用,还是文字字符串


当您的查询使用动态列引用时,您应该显式地将已知存在于表中的列列列列列为白名单,例如,使用带有在default:子句中引发异常的switch语句。

如果设置
PDO::ATTR\u EMULATE\u PREPARES=true,则可以

例如,
$connection->setAttribute(PDO::ATTR\u EMULATE\u PREPARES,true)


如果您使用的是Laravel,您可以在
config/database.php
中的
options
数组中进行设置。e、 g.
PDO::ATTR\u EMULATE\u PREPARES=>true

像您这样的许多查询可以重写为只使用一个占位符

SELECT :Param FROM Table WHERE Column = :Param
就跟

SELECT Column FROM Table WHERE Column = :Param
但有时候并不是那么简单。例如:

SELECT *
FROM my_table
WHERE first_name LIKE :Param
   OR last_name  LIKE :Param
   OR biography  LIKE :Param
在这种情况下,可以重用将其存储在交叉联接的派生表(FROM子句中的子查询)中的参数值:


你为什么不试试呢?PDO::prepare表示是,PDOStatement::execute表示可能需要关闭依赖于驱动程序的db游标。我尝试过,但一直出现错误,但我认为我做了其他错误。Was在文档中找不到任何内容(正在查看PDO::bindParam)。在PDO中找到它::尽管准备好了,谢谢你给我指出了正确的方向!实际上,第一部分
选择:Param
,这是不可能的;无法绑定表/列,请参阅。但是,您可以执行
$Param=“column”;选择$Param…
你认为你能给我答案吗?这可能吗?当前接受的声明是不可能的,但我的解决方案是这样的。文档不完全正确。如果
PDO::ATTR\u EMULATE\u
true
,则PDO支持重用命名参数标记。看起来有人更新了文档。现在它说“除非启用了仿真模式,否则在一个准备好的语句中不能多次使用同名的命名参数标记。”这部分是正确的。但是,
SELECT:Param
是不可能的,因为您不能绑定表/列。如果使用
pdo::ATTR\u EMULATE\u PREPARES
SELECT t.*
FROM my_table t
CROSS JOIN (SELECT :Param as Param) AS x
WHERE first_name LIKE x.Param
   OR last_name  LIKE x.Param
   OR biography  LIKE x.Param