条件字符串中带有符号的 Codeigniter 查询

Posted

技术标签:

【中文标题】条件字符串中带有符号的 Codeigniter 查询【英文标题】:Codeigniter query with symbols in condition string 【发布时间】:2012-11-03 08:33:56 【问题描述】:

我正在尝试在我的 CMS 中设置过滤器下拉菜单 我的模型看起来像

public function load($sort,$order,$key,$value)
 //        $key='listening'; //        $value="1";
            //configure pagination
    $config=array(
      'base_url'=>base_url().'/index.php/companies/index',
      'total_rows'=>$this->db->get('company')->num_rows(),
      'per_page'=>$this->settings_model->get_per_page(),
      'num_links'=>20
    );

    $this->pagination->initialize($config);



    $this->db->select('company.id, 
                       company.name, 
                       company.logo, 
                       company.status_id, 
                       company.listening',FALSE);
    $this->db->select('company_category.name as category,
                       company_category.id as category_id',FALSE);

    $this->db->select('complain_status.cs_status as status',false);
    $this->db->from('company');
    $this->db->join('company_category','company_category.id = company.category_id');
    $this->db->join('complain_stastus', 'complain_status.cs_id = company.status_id');



    if(isset($_POST['key']))
    
       $value=  str_replace('&nbsp', ' ', $_POST['value']);
        var_dump($value);
        if($value!='0')
            $this->db->having ($_POST['key'], mysql_real_escape_string($value) );

    
    if($sort!='' || $sort!=NULL)
        $this->db->order_by ($sort, $order);

    $this->db->limit($config['per_page'], $this->uri->segment(3));

    $result=$this->db->get();
    if(!isset($_POST['key']))
        $this->filter->set_filters_list($result->result_array());

    return $result->result();

生成以下查询

SELECT company.id, company.name, company.logo, company.status_id, company.listening, company_category.name as category, company_category.id as category_id, complain_status.cs_status as status
FROM (`company`)
JOIN `company_category` ON `company_category`.`id` = `company`.`category_id`
JOIN `complain_status`  ON `complain_status`.`cs_id` = `company`.`status_id`
HAVING `category` =  'Health & recreation'
LIMIT 20

正如您在此处看到的那样,当类别等于带有特殊字符(如 Health & recreation)的某个字符串时,它会失败,即使我尝试了 CI 生成的查询,它也可以在 MYSQL 上正常工作并得到结果

注意:我正在替换空格$value= str_replace('&nbsp', ' ', $_POST['value']);,因为此数据来自选择 html 元素,当它在选项中有空格时失败,因此我必须稍后在后端代码中解析并删除它

提前致谢

【问题讨论】:

你怎么知道生成的查询是什么?您是否使用echo $this->db->last_query() 来确保生成的是查询? 不,实际上我只是拼错了查询中的任何内容,例如错误的表名,我从 ajax 响应生成的错误中得到它.. 【参考方案1】:

代码点火器可能是 html_encoding & 符号,以便它读取为它的 html 值。您可以通过将此行添加到您在其中运行查询的任何控制器或模型的构造函数中打开分析器来确认这一点:

$this->output->enable_profiler(TRUE);

如果我是对的,您的查询将替换为 & 之类的内容,而 & 应该是。

请注意,分析器显示&,而使用$this->db->last_query() 仍显示&

【讨论】:

我使用了分析器,我得到了 HAVING category = 'Health & entertainment',这真的很奇怪,同样的查询在 mysql 上运行并且工作正常 @jJohn B 嗯。除了使用 amp; 之外,您能否尝试通过 sql 运行查询?和 &代替 &。看看其中任何一个是否有效。【参考方案2】:

要将符号插入数据库,您需要先对值进行转义。在 PHP 中,您通常会使用:mysql_real_escape_string()

How to insert special characters into a database?

但是,当您在 CodeIgniter 中执行此操作时,您必须使用查询绑定来自动转义数据,

$category = $this->input->post('category');
$status = $category = $this->input->post('status');
$status_id = $category = $this->input->post('status_id');

$sql = "SELECT * FROM company WHERE category = ? AND status = ?"; 

$this->db->query($sql, array($category, $status));

http://ellislab.com/codeigniter/user_guide/database/queries.html(在查询绑定下)

Does CodeIgniter automatically prevent SQL injection?

虽然它不是原始问题的一部分,但您的代码存在缺陷,因为您使用 $_POST['value'] 没有任何形式的过滤。没有什么可以阻止某人使用 SQL 注入您的表单。

How can I prevent SQL injection in PHP?

【讨论】:

感谢 Jarret 的回复,但我选择不插入值的问题,我使用了转义字符串函数,但行为相同,这只是 CMS 中的过滤器,在查询中添加了另一个条件跨度> 尝试在和号“&”之前添加一个正斜杠,使其显示为:category = 'Health \& entertainment'

以上是关于条件字符串中带有符号的 Codeigniter 查询的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter "like()" 函数在搜索词中带有 % 通配符

在codeigniter中带有tinymce的响应式文件管理器不显示缩略图

MySQL 表中带有重音符号的字符串在 R (RODBC) 中返回为 NA

在PLSQL, sql语句中带有中文的查询条件查询不到数据

Python中带有AND条件的LOC搜索字符串

python中带有元组列表的字符串列表的条件笛卡尔积的单线