【问题标题】:error in LIKE SQL syntaxLIKE SQL 语法错误
【发布时间】:2015-10-27 12:17:41
【问题描述】:

我正在使用 nodeJs 和 mysql 包。

我想使用带有变量的 LIKE sql 语句。

这是源代码:

var likemobile = '%'+mobile;
var query = "SELECT vtiger_contactaddress.contactaddressid as 'leadid', 
                    vtiger_contactaddress.mobile,
                    vtiger_contactaddress.phone 
             FROM `vtiger_contactaddress` 
             INNER JOIN `vtiger_crmentity` 
                 ON vtiger_crmentity.crmid=vtiger_contactaddress.contactaddressid AND 
                    vtiger_crmentity.deleted=0 AND 
                    vtiger_contactaddress.mobile LIKE "+likemobile+" OR 
                    vtiger_contactaddress.phone LIKE "+likemobile;

这是返回的错误:

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual th
at corresponds to your MySQL server version for the right syntax to use near '%8
8436500 OR vtiger_leadaddress.phone LIKE %88436500' at line 1

【问题讨论】:

  • 看来你必须像这样用单引号包裹类似的条件:“LIKE '” + likemobile,并用双引号关闭你的查询字符串。像这样:" <...> LIKE "+likemobile + ";
  • @Alyreza 你可以试试下面的编辑...因为查询应该有 '%8 8436500%' OR vtiger_leadaddress.phone LIKE '%88436500%' 这种类型的语法。
  • 您已通过从 likemobile 中删除 % 来执行
  • @Alyreza 现在尝试..因为我放错了 % 和 '。
  • 首先你必须明白你的查询应该是什么样子——在应用连接之后。然后,您应该了解连接的工作原理以及您应该做什么才能获得所需的查询。我假设您需要这样的查询:“select * from t where i like'%'”。你有 likemobile 变量。现在让我们构建您的查询: query = "select * from t where i like ' " + likemobile + " ' ";用您的替换所有特定值。

标签: mysql sql node.js


【解决方案1】:

您需要用单引号将类似的模式括起来。

另外两个建议:

  • 仅对字符串和日期常量(而不是列别名)使用单引号。
  • 使用参数化查询,因此您不会将用户输入放入查询字符串中。

【讨论】:

    【解决方案2】:

    如果您确实在使用node-mysql,则应按照the documentation 中的说明运行查询。假设您已经有一个connection 对象,使用绑定变量进行查询就变得简单了:

    connection.query({
      sql : "SELECT vtiger_contactaddress.contactaddressid as leadid, "
                       + " vtiger_contactaddress.mobile, "
                       + " vtiger_contactaddress.phone "
                 + "FROM `vtiger_contactaddress` "
                 + "INNER JOIN `vtiger_crmentity` "
                 + "  ON vtiger_crmentity.crmid=vtiger_contactaddress.contactaddressid"
                 + " AND vtiger_crmentity.deleted=0 AND "
                 + "       (vtiger_contactaddress.mobile LIKE concat('%', ?) OR "
                 + "       vtiger_contactaddress.phone LIKE concat('%', ?))",
      values: [mobile, mobile]
    }, function (error, results, fields) {
      // error will be an Error if one occurred during the query
      // results will contain the results of the query
      // fields will contain information about the returned results fields (if any)
    });
    

    注意事项:

    • 使用绑定变量,防止SQL Injection
    • concat 函数用于在(已清理的)输入前加上通配符 (%)
    • ORed 在一起的两个查询条件现在用括号分隔 vtiger_crmentity.deleted=0,这可能是您想要的
    • 需要在回调函数中编写结果集处理代码,通过resultsfields变量访问数据

    【讨论】:

      【解决方案3】:

      @Gordon Linoff 是正确的。有点像这样:

      var likemobile = mobile;
      var query = "SELECT vtiger_contactaddress.contactaddressid as 'leadid', vtiger_contactaddress.mobile, vtiger_contactaddress.phone FROM `vtiger_contactaddress` INNER JOIN `vtiger_crmentity` ON vtiger_crmentity.crmid=vtiger_contactaddress.contactaddressid AND vtiger_crmentity.deleted=0 AND vtiger_contactaddress.mobile LIKE '%"+likemobile+"%' OR vtiger_contactaddress.phone LIKE '%"+likemobile+"%'";
      

      【讨论】:

        【解决方案4】:
        ... AND vtiger_contactaddress.mobile LIKE '%" + likemobile + "%' OR vtiger_contactaddress.phone LIKE %" + likemobile + "%";
        

        【讨论】:

        • 不,同样的错误发生了。Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual th at corresponds to your MySQL server version for the right syntax to use near '%8 8436500 OR vtiger_leadaddress.phone LIKE %88436500' at line 1
        • 已编辑,可能引号不正确,我现在无法测试 ;-)
        【解决方案5】:
        try this..
        
                 var likemobile = mobile;
        
        var query = "SELECT vtiger_contactaddress.contactaddressid as 'leadid', 
                        vtiger_contactaddress.mobile,
                        vtiger_contactaddress.phone 
                 FROM `vtiger_contactaddress` 
                 INNER JOIN `vtiger_crmentity` 
                     ON vtiger_crmentity.crmid=vtiger_contactaddress.contactaddressid AND 
                        vtiger_crmentity.deleted=0 AND 
                        vtiger_contactaddress.mobile LIKE '% "+likemobile+"%'  OR 
                        vtiger_contactaddress.phone LIKE '%"+likemobile +"%'";
        

        【讨论】:

        • 不,有什么区别?在我预定义的问题中。但我的和你的都不起作用
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        相关资源
        最近更新 更多