【问题标题】:Wildcard, '%', within ColdFusion cfscript query LIKE statement?ColdFusion cfscript 查询 LIKE 语句中的通配符“%”?
【发布时间】:2012-12-25 13:12:23
【问题描述】:

是否可以在 ColdFusion cfscript 查询中的 SQL LIKE 语句中使用通配符?

一个不起作用的例子:

local.q = new Query(); 
local.q.setDatasource(variables.dsn);
local.q.addParam(name='lastname', value='%' & arguments.lastname,     cfsqltype="cf_sql_varchar");
local.qString = 'SELECT name FROM users WHERE lastname LIKE :lastname';
local.q.setSQL(local.qString);
local.result = local.q.execute().getResult();

我也试过这些,但没有用:

local.qString = 'SELECT name FROM users WHERE lastname LIKE %:lastname';
local.qString = "SELECT name FROM users WHERE lastname LIKE '%:lastname'";

更新:

我使用的是 MS SQL Server 2008。

查询在 SQL Server Mgmt Studio 中运行良好...我认为这与如何在 cfscript 标记中格式化查询有关?

【问题讨论】:

  • 您的 DBMS 是否可能不支持使用 % 作为第一个字符的 LIKE
  • 这在 MS SQL 中运行良好。我倾向于按照亨利的思路认为这是不支持的。
  • “没用”含糊不清。这是什么意思?你收到错误了吗?你没有得到预期的结果吗?如果您没有得到预期的结果,您是否在 ColdFusion 之外尝试过以帮助隔离问题?
  • 在 MSSQL 中使用标签 <cfqueryparam value="%#arguments.lastname#"> 是正确的语法。看起来像你想要做的,所以你的 dbms 可能不支持这个
  • 顺便说一句,因为很多事情都是特定于数据库的,所以总是包括数据库类型和版本以及sql 问题。当人们不必猜测您使用的是哪种口味时,您将获得更快、更准确的答案:)

标签: sql sql-server sql-server-2008 coldfusion


【解决方案1】:

根据使用的 dbms,在运行 sql 语句时可能会解释单引号和双引号。你用的是什么dbms?您的语句现在不选择变量中的值,而是选择姓氏为“lastname”的任何用户。它应该是这样的:

  lastname like '%#lastname#' 

【讨论】:

  • 其实这就是他们的 CF 代码已经在做的事情。他们只是通过参数(即绑定变量)添加值%#arguments.lastName#
【解决方案2】:

这里有来自 Adam Cameron 的回复,显然是被一个过分热心的模组删除了。

我没有重复他所说的,而是复制和粘贴(重点添加到关键部分):


只是为了澄清您在第一个示例中尝试的语法确实有效。这是正确的方法。澄清/解释:

您所拥有的示例的<cfquery> 版本大致如下:

<cfqueryparam value="%foo">

所以在函数版本中,参数为?:paramName,参数的值将继续为"%foo"

% 是参数值的一部分,而不是 SQL 字符串。

因此,鉴于对您“不起作用”,如果您发布错误或任何导致您认为它不起作用的原因会有所帮助(您的期望是什么,并且实际结果如何)。然后我们可以处理您的问题的实际原因,我认为这不是您认为的那样。

查询作为&lt;cfquery&gt; 工作正常吗?

【讨论】:

    【解决方案3】:

    我建议使用CFQuery 标签而不是尝试在CFScript 中运行查询。除非你真的知道你在做什么。我这样说是因为CFQuery 标记具有一些内置功能,不仅可以让您更轻松地构建查询,还可以保护您免受不可预见的攻击(SQL 注入类型)。例如,当使用CFQuery 时,它会自动为您转义单引号,这样插入'well isn't that a mess' 之类的内容就不会对您造成影响。您还可以使用CFQueryParam 标签进一步对抗 SQL 注入攻击。虽然您可以在CFScript 中使用CFQueryParam 功能,但它并不那么简单(至少对我来说不是)。

    See this blog post from Ben Nadel talking about some of this.

    所以在CFQuery 标签中,您的查询看起来像这样:

    <cfquery name="myQuery" datasource="#variables.dsn#">
        SELECT name
        FROM users
        WHERE lastname LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%:#arguments.lastname#" maxlength="256" />
    </cfquery>
    

    【讨论】:

    • 我不得不删除外部单引号并省略冒号,例如LIKE &lt;cfqueryPARAM value = '#Form.Model_srch#%' CFSQLType = 'CF_SQL_VARCHAR'&gt;
    • 是的,你是对的。此示例不需要外部引号。我会将它们从我的答案中删除。谢谢。
    【解决方案4】:

    请记住,您最终需要查看 CF 为 DB 服务器提供了什么。在这种情况下,您可以尝试这个模型来接近并通过弄乱参数声明中的引号/值来在 SSMS 中找到相同的错误:

     declare @param1 varchar(max) = '%Eisenlohr';
    
     SELECT name FROM users WHERE lastname LIKE @param1
    

    【讨论】:

      【解决方案5】:

      是的,这是可能的。您将其设置在参数中,这是正确的。我不确定为什么它不适合你。

      我做了以下,它工作。

      var qryArgsCol = {};            
      qryArgsCol.datasource = variables.datasource;
      qryArgsCol.SQL = "                      
                      SELECT ID
                      FROM Users
                      WHERE LastName LIKE :searchStringParam
                      ";
      var qryGetID = new query(argumentCollection=qryArgsCol);
      qryGetID.addParam(name="searchStringParam", value="%" & searchString, cfsqltype="cf_sql_varchar");
      qryGetIDResult = qryGetID.execute().getResult();
      

      【讨论】:

        【解决方案6】:

        我刚刚遇到了与原始海报相同的问题,它“不起作用”并且我没有从查询查询中得到任何结果。 我的问题是通配符搜索区分大小写。

         local.q = new Query();  
         local.q.setDatasource(variables.dsn);
         local.q.addParam(name='lastname', value='%' & LCase(arguments.lastname), cfsqltype="cf_sql_varchar"); 
         local.qString = 'SELECT name FROM users WHERE LOWER(lastname) LIKE :lastname'; 
         local.q.setSQL(local.qString); 
         local.result = local.q.execute().getResult();
        

        所以我所做的是确保传入的参数是小写的,并确保 SQL 中的比较字段也是小写的并且它有效。

        【讨论】:

        • 是的。 QoQ 始终区分大小写:From documentation:“与 ColdFusion 的其余部分不同,Query of Queries 区分大小写...”.
        【解决方案7】:

        这样使用。

             local.q = new Query(); 
                local.q.setDatasource(variables.dsn);
        
                local.q.addParam(name="lastname", cfsqltype="cf_sql_varchar",value='%ARGUMENTS.lastname' );
                local.qString = 'SELECT name FROM users WHERE lastname LIKE :lastname';
                local.q.setSQL(local.qString);
                local.result = local.q.execute().getResult();
        

        【讨论】:

          猜你喜欢
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-18
          • 1970-01-01
          相关资源
          最近更新 更多