如何正确转义 mysql“搜索/喜欢”查询?

2024-05-08

Summary

我目前正在使用"$search_field LIKE '$this->db->escape_like_str($search_string)%'";逃避动态创建的搜索查询。创建的 SQL 语句结果不会产生任何错误,也不会产生任何结果。下面是我正在做的事情的详细描述。

Details

我正在使用 jqGrid 及其搜索功能。当用户输入搜索词时,它会发布$filtersjson 对象到我的服务器。然后我解析它并创建一个 SQL 语句来获取请求的数据。

这是转义传入搜索数据的代码(这也是问题区域):

$search_string_like = $this->CI->db->escape_like_str($search_string);
$operator['bw'] = "$search_field LIKE '$search_string_like%'"; //begins with

下面是生成的 SQL 语句:

SELECT *
FROM player_data_temp_table
WHERE first_name LIKE '\'zech\'%' AND last_name LIKE '\'camp\'%'
ORDER BY date_won desc
LIMIT 0 , 15

此查询不会引发任何错误,但也不起作用。当我直接在 phpmyadmin 中运行类似的查询时,我得到,MySQL returned an empty result set (i.e. zero rows).尽管我知道有结果可以找到。如果我只是删除反斜杠和单引号first_name LIKE '\'zech\'%'做到这一点first_name LIKE 'zech%'然后我得到预期的结果。我担心的是,这不再是正确的转义,对吧?

用于构建查询的代码

Summary

一个变量,$filters,有这样的数据{"groupOp":"AND","rules":[{"field":"first_name","op":"bw","data":"zech"}]}被传递到build_where_clause($filters). build_where_clause返回完整的$where语句,然后在模型中使用它来创建最终的 SQL 搜索语句。

jqgrid_lib.php

class jqgrid_lib 
{
private $CI;

public function __construct()
{
    $this->CI =& get_instance();
}

/**
 * Function takes a json string with search rules and turns it into an sql statement.
 *
 * To use this function make sure you set stringResult: true, see example below:
 *   $("#list").jqGrid('filterToolbar',{stringResult: true});
 * @param   json string     
 * @author zechdc
 */
public function build_where_clause($filters)
{
    $sql_fragments = array();

    $filters = json_decode($filters);
    $rules = $filters->rules;
    $group_op = $filters->groupOp;

    //loop through each rule and create an sql statement
    foreach($rules as $rule)
    {
        $temp_sql = $this->create_search_field($rule->field, $rule->data, $rule->op);
        array_push($sql_fragments, $temp_sql);
    }

    //combine all sql fragments with the group_operator
    $data['sql'] = implode(' ' . $group_op . ' ', $sql_fragments);

    return $data;
}

/**
 * Takes a field, string and search condition and turns it into a sql search statement
 *
 * To use this function make sure you set stringResult: true, see example below:
 *   $("#list").jqGrid('filterToolbar',{stringResult: true});
 * @param   json string 
 * @return  string  
 * @author  zechdc
 */
public function create_search_field($search_field, $search_string, $search_operator)
{   
    //$search_field = $this->CI->db->escape($search_field); //escaping the column breaks it.
    $search_string = $this->CI->db->escape($search_string);
    $search_string_like = $this->CI->db->escape_like_str($search_string);
    //$search_string_like = $search_string;

    $operator['eq'] = "$search_field=$search_string"; //equal to
    $operator['ne'] = "$search_field<>$search_string"; //not equal to
    $operator['lt'] = "$search_field < $search_string"; //less than
    $operator['le'] = "$search_field <= $search_string "; //less than or equal to
    $operator['gt'] = "$search_field > $search_string"; //less than
    $operator['ge'] = "$search_field >= $search_string "; //less than or equal to
    $operator['bw'] = "$search_field LIKE '$search_string_like%'"; //begins with
    $operator['bn'] = "$search_field NOT LIKE '$search_string_like%'"; //not begins with
    $operator['in'] = "$search_field IN ($search_string)"; //in
    $operator['ni'] = "$search_field NOT IN ($search_string)"; //not in
    $operator['ew'] = "$search_field LIKE '%$search_string_like'"; //ends with
    $operator['en'] = "$search_field NOT LIKE '%$search_string_like%'"; //not ends with
    $operator['cn'] = "$search_field LIKE '%$search_string_like%'"; //in
    $operator['nc'] = "$search_field NOT LIKE '%$search_string_like%'"; //not in
    $operator['nu'] = "$search_field IS NULL"; //is null
    $operator['nn'] = "$search_field IS NOT NULL"; //is not null

    if(isset($operator[$search_operator])) 
    {
        //set the sql search statement
        return $operator[$search_operator];
    } 
}
}

Model

/*
 * Gets all columns from table with limit and sort order set dynamically
 */
function get_specific($sidx, $sord, $start, $limit, $where = NULL)
{
    $result = FALSE;

    if($where)
    {
        $where = ' WHERE ' . $where;
    }

    // usually I dont do select all but since this whole table is temp and only holds the needed data
    // then just do select all.
    $sql = "SELECT *
            FROM player_data_temp_table
            $where
            ORDER BY $sidx $sord
            LIMIT $start , $limit"; 

    $q = $this->db->query($sql);

    if($this->db->affected_rows() > 0)
    {
        $result = $q->result();
    }

    return $result;
}

更新/回答:

看来我解决了这个问题。在模型中,我删除了手工制作的 $sql 语句并将其替换为

    if($where)
    {
        $this->db->where($where);
    }

    $this->db->order_by($sidx, $sord);
    $q = $this->db->get('player_data_temp_table', $limit, $start);

这似乎正确地转义了所有变量,包括 $where 语句中的列名。


Manual http://codeigniter.com/user_guide/database/queries.html:

$this->db->e​​scape_like_str() 当要在 LIKE 条件下使用字符串时,应使用此方法,以便字符串中的 LIKE 通配符('%'、'_')也能正确转义。

$search = '20% raise';
$sql = "SELECT id FROM table WHERE column LIKE '%".$this->db->escape_like_str($search)."%'";

所以你在最后两行代码中做得正确。


下面的代码对你有什么作用?

$search_string = 'zech';
$search_string_like = $this->CI->db->escape_like_str($search_string);
$operator['bw'] = "$search_field LIKE '$search_string_like%'";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确转义 mysql“搜索/喜欢”查询? 的相关文章

  • 解析错误:语法错误,意外的 T_RETURN [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 遇到这个问
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • 这个巨大的正则表达式是如何工作的?

    我最近在我的一个目录中的一个名为的文件中找到了下面的代码doc php 文件功能或链接到文件管理器 做得非常好 基本上 它列出了当前目录中的所有文件 并且允许您更改目录 它可以访问我的所有文件 添加 重命名 信息 删除 我不记得安装过它 我
  • MySQL - 从数字列表中选择在表的 id 字段中没有对应项的数字

    我有一个数字列表 例如 2 4 5 6 7 我有一个表 foos 带有 foos ID 包括 1 2 3 4 8 9 我想获取我的号码列表 并在我的表的 ID 字段中找到那些没有对应项的号码 实现此目的的一种方法是创建一个表格栏 在 ID
  • json_encode 返回 NULL?

    由于某种原因 项目 描述 返回NULL使用以下代码 这是我的数据库的架构 CREATE TABLE staff id int 11 NOT NULL AUTO INCREMENT name longtext COLL
  • 如何使用 jQuery Ajax 将 PHP 数组值传递到另一个文件?

    这是我的代码
  • 付款成功后保存到数据库(paypal)

    我试图找出在客户使用 paypal 支付商品费用后将数据 之前以表单提交 保存到数据库的最佳方法 沿着这个过程的一些事情 1 在实际网站上填写表格 gt 2 登录 Paypal gt 3 立即付款 PayPal gt 4 数据已插入数据库
  • 合并 2 个数组并合并数字键的结果

    我有 2 个数组 我希望通过每个数字键将其中合并 分组在一起 例如 Array1 2009 gt 131 2008 gt 940 2007 gt 176 2006 gt 1 Array2 2008 gt 9 2007 gt 3 我希望输出是
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • Paypal 将钱从一个帐户转移到另一个帐户

    我知道这个建议如何汇款至任何 PayPal 账户 https stackoverflow com questions 1559808 paypal api send money to any paypal account但到目前为止我所尝试
  • 使(文本到图像)图像具有一定的宽度但无限的长度?

    我有下面的代码 可以用大量文本生成图像 我希望该图像的宽度为 700 像素 我还希望它保留字符串所具有的段落结构 该字符串来自 MySQL 数据库 我怎样才能实现这一点 font 2 width imagefontwidth font st
  • 扩展构建器中的“映射到现有表”显示 TYPO3 中的奇怪问题

    在我的扩展中MyExt 我映射了模型Page to pagesTYPO3 中的表 首先它向我展示了type mismatch错误 无论如何我继续保存它 会发生以下情况 我的页面树变成这样 我的新记录表单仅显示 UID 而不显示标题 My P
  • ACL授权失败后ZF3重定向

    我有一个带有 ACL 的新 ZF3 应用程序 现在 我需要在未经授权的访问的情况下重定向到错误页面 例如 403 我认为最好的方法是触发一个事件 然后捕获它 但我失败了 全部都在我的用户模块中Module php 摘录 namespace
  • PHP switch case 在 case 中存在多个值

    我有一个变量保存值 每周 每月 季度 和 年度 还有另一个变量保存值从 1 到 10 switch var2 case 1 var3 Weekly break case 2 var3 Weekly break case 3 var3 Mon
  • php date_parse("2010 年 2 月") 给出日期 == 1

    当没有日期时 我将其称为 date parse 中的错误 d date parse Feb 2010 会给 d day 1 请参阅对此的评论date parse 手册页 http php net manual en function dat
  • PHP 共享标头而不使用服务器端脚本?

    到目前为止我总是通过 PHP 解决简单的问题 您有一个包含页眉 菜单 页脚和内容字段的网站 每个页面的页眉 菜单和页脚通常是相同的 在没有 PHP 或任何其他服务器端语言的情况下 如何使页眉 菜单和页脚数据仅存在于一个文件中 例如 您不会有
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv

随机推荐

  • 故事板入口点缺失

    在 xcode 7 2 中 对象列表中没有 Storyboard Entry Point 项 我需要使用 Storyboard Entry Point 我通过谷歌搜索找不到任何类似的问题 所以任何人都可以在这里帮助我 单击要作为情节提要入口
  • 从数据帧字典中获取单独的数据帧 Python

    我有一本字典d充满了数据帧的集合 key type size value gm1 dataframe mxn gm2 dataframe mxN gm10 dataframe nxM 我想使用它们来一一输出这些数据帧keys作为新数据框的名
  • 如何在 Bash 中为数组赋值?

    我正在尝试从文本文件中读取值列表 你好 txt 并将它们存储在一个数组中 counter 0 cat hello txt while read line do Unix Array counter line let counter coun
  • Kafka 适合运行公共 API 吗?

    我有一个想要发布的事件流 它被划分为主题 不断更新 需要水平扩展 并且没有 SPOF 很好 并且可能需要在某些情况下重播旧事件 所有的功能似乎都与 Kafka 的功能相匹配 我想通过任何人都可以连接并获取事件的公共 API 将其发布到全世界
  • 如何在 PHPWord 中更改纸张大小

    如何更改phpword中的纸张大小 我想将纸张尺寸更改为 Legal 纸张 8 5 英寸 x 14 英寸 我在文档中找不到该选项 我不确定如何应用该规则 并且文档中似乎没有与此相关的 纸张 或 大小 https phpword readth
  • 如何将vue文件样式提取到一个单独的style.css文件中

    我正在使用 vue loader 默认情况下 对于每个 vue 文件 您的视图中都有一个样式标签 这不是一件好事 根据 vue loader 文档我可以做到这一点 https vue loader vuejs org en configur
  • 修改SQL Server中的默认值

    我正在尝试使用 SQL Server 2008 中的 SQL 语句更改列的默认值 我在很多地方找到了如何在创建表 添加列时设置默认值 但没有找到如何设置它 一旦列已经存在就修改它 这就是我可以用来在添加时设置它的内容 ALTER TABLE
  • R 中第三维的平均值

    R中是否有任何快速方法或内置函数来计算基于第三维的平均值 例如我的数组是 1 1 2 1 1 3 2 2 4 2 1 2 1 11 13 2 12 14 3 1 2 1 21 23 2 22 24 我的输出是 1 2 1 mean 1 11
  • 我是否需要在我的 Firebase 项目中添加 SHA-1 指纹?

    在 Firebase 上有一个弹出窗口 显示我的项目可以添加指纹 SHA1 因为我只想使用一些 Firebase 服务 例如实时数据库 身份验证 我需要在我的项目中添加指纹吗 该图显示 仅在使用某些 Google Play 服务 如 OAu
  • img 标签如何通过 cors 标头获取内容

    为什么当我使用 fetch 从禁用响应 CORS 标头的服务器加载数据时 我预期会收到错误 Failed to load http www imgworlds com wp content uploads 2015 12 18 CONTAC
  • 在 MVC 中使用 Request.URL 和 Request.URLReferrer 获取当前链接的替代方案?

    我希望在我的中编写一个方法 属性BaseController允许任何操作获取当前 URL 的类 如果我打电话localhost Keyword Edit 1我可以用Request Url获取网址 但是 如果我的编辑视图中有部分视图 我需要使
  • SQLite3 数学函数 Python

    更新 SQLite 版本 3 5 0 后 可以使用 SQL 数学函数 如果我在 pycharm 查询中使用它 它效果很好 但我无法在 python 代码中执行查询 然后我收到以下错误消息 pandas io sql DatabaseErro
  • 在 LaTeX 中自动将新句子中第一个单词的第一个字母大写

    我知道 LaTeX 的吹嘘点之一是它没有这种微软式的行为 尽管如此 它有时还是有用的 LaTeX 已经在您键入 非反斜杠 句点后添加了一个额外的空格 因此应该可以使其自动将后面的字母大写 是否有一个明显的方法来编写一个宏来执行此操作 或者是
  • Python 中的“Zip”列表字典

    我有一个列表字典 我想将它们合并到一个命名元组列表中 我想要第一个元组中所有列表的第一个元素 第二个元组中的第二个元素 依此类推 Example key1 1 2 3 key2 4 5 6 key3 7 8 9 我希望生成的列表如下所示 k
  • 由于保存之前/之后的 CSV 差异而导致错误解析(Java w/ Apache Commons CSV)

    我有一个 37 列的 CSV 文件 我正在使用 Apache Commons CSV 1 2 在 Java 中解析该文件 我的设置代码如下 initialize FileReader object FileReader fileReader
  • Ruby—Open3.popen3 / 如何打印输出

    我有一个小红宝石脚本 它的作用是mysql导入方式 mysql u
  • 全日历和时区。求助,我做错了

    我不知何故做错了 我被时区绊倒了Fullcalendar 我尝试过设置ignoreTimezone真与假 不过似乎并不重要 它在下面的代码中的两个地方 因为我不确定它在哪里 我的数据源是隐藏的表单字段 数据流转out of FullCale
  • R - 如何为一个图例元素组合 expression()、paste() 和 formatC() 命令?

    我正在努力创造一个美好的传奇 它应该包含希腊字母 mu 我可以使用表达式 一些文字 即 和 mm 以及使用 formatC 格式化的模型系数来完成此操作 我运行没有问题的是要么没有希腊字母 然后我可以使用简单的粘贴命令 leg txt lt
  • 如何在 iPhone 中使用可达性代码查找服务器是否可达?

    我有客户端服务器说 http abc com 我想检查该服务器是否响应 如何使用苹果的可达性代码检查这一点 当我看到该代码但无法找到在哪里编写我的客户的网址来检查这一点 请建议我 这是一个同步示例 您可能希望异步执行此操作 但这将帮助您完成
  • 如何正确转义 mysql“搜索/喜欢”查询?

    Summary 我目前正在使用 search field LIKE this gt db gt escape like str search string 逃避动态创建的搜索查询 创建的 SQL 语句结果不会产生任何错误 也不会产生任何结果