实际上,我有一个值需要在 SQL 查询中调用多次。因此,在语句中是否可以重复使用相同的命名占位符,例如 SELECT :Param FROM Table WHERE Column = :Param
,然后简单地绑定值 ":Param",并且该值对于两个 :Params 都存在?
PDO::prepare 表示:"不能在准备好的语句中重复使用同名的命名参数标记", 所以我猜那就不行了。
PDO::ATTR_EMULATE_PREPARES
为true
,PDO实际上支持重用命名参数标记。 - MikeSELECT :Param
是不可能的,因为你不能绑定表/列。请查看 https://dev59.com/8XVC5IYBdhLWcg3wykaj/。 - Funk Forty NinerPDO :: ATTR_EMULATE_PREPARES
,那么pdo会将所有内容转换为字符串。 - Gaby_64如果设置PDO::ATTR_EMULATE_PREPARES = true
,则可以实现此功能。
例如:$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
。
如果您使用的是Laravel,则可以在config/database.php
文件中的options
数组中设置。例如:PDO::ATTR_EMULATE_PREPARES => true
。
SELECT :Param FROM Table WHERE Column = :Param
would be the same as
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子句中的子查询)中进行重用:
最初的回答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
ATTR_EMULATE_PREPARES
设置为true
。如果上述方法不可行或不可取,还有另一种优雅的解决方法,即在SQL中使用变量:
DECLARE @MyVariable AS INT = :value;
SELECT column_x FROM table WHERE column_y = @MyVariable OR column_z = @MyVariable;
value
赋值给此语句。有一个解决方法:
function search($criteria) {
$sql = "SELECT * FROM my_table
WHERE column_1 like CONCAT('%', :criteria1, '%')
OR column_2 like CONCAT('%', :criteria2, '%')
OR column_3 like CONCAT('%', :criteria3, '%')
";
$stmt = $this->db->prepare($sql);
$stmt->bindParam(':criteria1', $criteria);
$stmt->bindParam(':criteria2', $criteria);
$stmt->bindParam(':criteria3', $criteria);
$stmt->execute();
return($stmt->fetchAll(PDO::FETCH_ASSOC));
}
总之,使用具有相同条件的不同占位符。
SELECT :Param
是不可能的;你不能绑定表/列,请参考 https://dev59.com/8XVC5IYBdhLWcg3wykaj/。*然而*,你可以这样做$Param = "column"; SELECT $Param...
- Funk Forty Niner