【问题标题】:Is it possible to rebind sql paramters using the result from a cfquery?是否可以使用 cfquery 的结果重新绑定 sql 参数?
【发布时间】:2011-02-14 21:30:13
【问题描述】:

当我运行以下代码时:

<cfquery name="someQuery" result="queryResult" datasource="wetakepictures">
  SELECT id 
  FROM events
  WHERE category_id = <cfqueryparam value="1" cfsqltype="cf_sql_integer">
     OR title like <cfqueryparam value="%test%" cfsqltype="cf_sql_varchar">
</cfquery>

<cfoutput>
  #queryResult.sql# <br />
  #ArrayToList(queryResult.sqlparameters)#
</cfoutput>

它输出:

SELECT id FROM events WHERE category_id = ? OR title like ?
1,%test% 

我需要实际的字符串“SELECT id FROM events WHERE category_id = 1 OR title like '%test%'”。

有没有办法将参数重新绑定到sql?

----编辑----

这样做的原因是为了在对结果进行分页时消除重复的 SQL。我想做这样的事情:

<cftransaction>
  <cfquery name='getCount' result='queryResult'>
     SELECT count(*)
     ... conditions that are guarded by <cfif> ...
  </cfquery>

  <cfquery name='getLimitedRecords'>
     #replace(queryResult.sql, 'count(*)', 'id')#
     LIMIT ... based on pagination ...
  </cfquery>
</cftransaction>

注意:我查看了这个question 并决定对 MySQL 使用两个查询。

【问题讨论】:

  • 您究竟为什么需要这样做?听起来您想做一些不可能的事情,但如果您心中有一个目标,我们或许可以帮助您实现该目标,而无需执行此步骤...
  • 我想我明白你为什么要这样做,因为我曾经想过这个。实际上不是分页的好方法,因为已经有其他更好的解决方案。如果您总是需要 count(id),则根据这些记录的更改频率将其缓存几分钟。当用户来回移动时,第二个查询也可以被缓存。恕我直言,限制+偏移+如果其他参数的序列在所有可能的情况下都应该很好。如果没有,你可以放简短的描述。你想要达到的目标。
  • 我也不明白 cftransaction 是干什么用的。
  • 我现在想起了为什么我想这样做一次。在历史记录中保存上次搜索。但几秒钟后,我意识到我只需要参数,而不是整个查询!现在你必须告诉我们你想做什么,因为它太有趣了:)

标签: sql coldfusion


【解决方案1】:

两种方法,取决于你想要做什么:

Ben Nadel:Merging ColdFusion SQL Debugging And Query Params With Javascript - 如果您只想复制和粘贴,则很有用

A better debugging template - 如果您想对代码进行逆向工程以在代码中重建您的查询并进行一些日志记录等,这很有用。

【讨论】:

  • 感谢您的链接,但他们不会成功。它需要在服务器端完成,所以 Nadel 的方法已经失效。更好的调试模板只是使用字符串替换来重新绑定参数,因此重建的查询容易受到sql注入。
  • 它是如何受到影响的 - 如果您在服务器端执行此操作并将查询保留在会话范围内,它永远不会靠近用户。无论如何,我不确定你的想法是一个很好的分页方法,感觉就像过早的优化
猜你喜欢
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2010-10-13
相关资源
最近更新 更多