【问题标题】:get named placeholders from prepared mysql query从准备好的mysql查询中获取命名占位符
【发布时间】:2014-08-06 21:23:06
【问题描述】:

在 PHP 中给定一个准备好的 MySQL 语句,我如何从中选择命名的占位符?

例如,如果我正在准备的查询是

SELECT name, colour FROM fruit WHERE calories < :calories AND colour = :colour

INSERT INTO people (name, position, admin_level) VALUES (:name, :pos, 0) 

然后我想作为输出array(":calories",":colour")array(":name",":pos")

PHP 网站上似乎没有列出此功能。有没有办法从准备好的语句中获取命名占位符?

【问题讨论】:

  • 自动填充 $_POST 数组中的任何内容都没有用,除非您是黑客。这将是令人难以置信的危险,旨在吸引菜鸟并帮助他们开发如此容易破解的网站
  • 这不是重点。当前代码还使用来自 $_POST 的内容填充它们,这就是表单所做的,并且完全有可能以安全的方式执行此操作。我要问的只是如何从查询中选择这些标记。
  • 好吧,我看到了这个愚蠢的部分,它让我对实际问题视而不见。
  • 好的,我已经删除了那部分,它只是为了说明一个用例。

标签: php mysql prepared-statement query-parameters


【解决方案1】:

您将不得不使用某种字符串操作来完成我认为您所要求的事情。我知道没有标准机制可以做到这一点。所以是这样的:-

$q = 'SELECT name, colour FROM fruit WHERE calories < :calories AND colour = :colour';

$res = preg_match_all('/:[a-z]+/',$q, $matches);

print_r($matches[0]);

会产生这样的东西:

Array
    (
        [0] => :calories
        [1] => :colour
    )
)

请注意,我不是正则表达式专家,因此需要进行一些测试以确保它不会因某些完整的查询而中断。

经过一些研究我发现

或者,如果您在完成后想要此信息

->prepare()
->bindParams()
->execute()

并生成一个语句句柄,你可以使用:-

$stmt->debugDumpParams()

Link to the PHP Manual,我知道激进的想法,现在我们都学到了一些东西,因为我以前也从未见过。

【讨论】:

  • 是的,这样可以从查询中获取它,但我希望/假设还有一种方法可以直接从准备好的语句中获取它。如果数据库不知道需要分配哪些占位符,它甚至如何准备语句?
  • 准备在数据库服务器上进行,而不是在 php 扩展中,并链接到您的连接。要取回它需要向数据库服务器发出某种请求以返回它,这没有任何意义,因此不存在。
  • 为什么没有意义? PHP 语法类似于$stmt = $db-&gt;prepare($query); $stmt-&gt;execute($params);,其中实际对象$stmt 在准备和执行之间由数据库返回。那么为什么在上面使用$stmt-&gt;listofplaceholders() 方法没有意义呢?
  • 哦,您在创建语句句柄后需要此信息。我以为你在 bindParam() 阶段之前想要它。请参阅答案以获取更多信息。
  • 但是就像我之前说的,prepare() 语句将带有:var? 的查询的原始文本直接发送到服务器,服务器本身进行准备并存储结果. bindParams 然后发送一组值以绑定到准备好的查询(在服务器上)。 PDO 扩展的 PHP 没有在本地维护任何内容。因此,当它可能忙于做有用的工作时,谁会想要向那里的数据库服务器添加额外的往返行程来获取这些数据。
猜你喜欢
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2016-09-11
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
相关资源
最近更新 更多