【问题标题】:Parentheses passed in url break codigniter queryurl 中传递的括号会中断 codeigniter 查询
【发布时间】:2014-04-08 16:49:30
【问题描述】:

我有一个字符串通过 URL 传递到 Codeigniter 驱动的站点。字符串在传递之前先进行 urlencoded,然后由控制器进行 urldecode,然后再传递给模型中的函数,该函数在数据库表中搜索字符串。我已经阅读了其他几篇关于此的帖子/文章,但没有一个为该问题提供可行的(对我而言)解决方案。以下是我读过的一些内容:

URL having parentheses not working in codeigniter with datamapper ORM

Parenthesis issue in codeigniter url

php rawurldecode doesn't produce same string passed to rawurlencode

http://qubitlogs.com/PHP/2013/01/24/parentheses-in-urls-not-working-codeigniter-datamapper-orm/#.U0MtAce7mxa

这就是正在发生的事情:

一个 url 编码的字符串通过一个 url 传递,像这样:

http://www.awebsite.com/controllername/functionname/test%28string%29

控制器是这样处理的:

public function functionname($string) {
    $this->load->model("codeigniter_model");
    $dstring = urldecode($string);
    $validString = $this->codeigniter_model->valid_string($dstring);        
    if (!$validString) { 
        $thiserror =  "<br>Error: Invalid String. (".$dstring.")"; 
        echo $thiserror; 
        exit;
    }
}

还有模特:

function valid_string($string)
    {
    $sql = "select id from dbtable where dbfield = ?"; 
    $query = $this->db->query($sql, array($string));
    //Added this in to see what the query actually end up being
    echo $this->db->last_query();
        if ($query->num_rows() > 0) :
            return TRUE;
        else:
            return FALSE;       
        endif;
}

回显的查询是正确的:从 dbtable 中选择 id,其中 dbfield = 'test(string)' 并且在 Navicat 中运行时返回正确的 id。但是 - Codeigniter 在查询中返回 FALSE。

我还检查了查询中得到回显的字符串不包含 HTML 实体。

我无法控制传递的字符串,并且确实需要 Codeigniter 接受 ( 和 ) 作为字符串的一部分。

有什么想法吗?

编辑:当相同的字符串通过表单中的帖子传递给 Codeigniter 控制器时,它可以正常工作。

编辑 #2:刚刚尝试使用此处建议的 Active Record 方法创建查询:无法添加其他链接:ellislab.com 论坛视图线程 162036

这个:

$this->db->select('id');
$this->db->where('dbfield', "'".$string."'", FALSE);
$query = $this->db->get('dbfield');

也不行。

编辑#3:感谢 Kyslik 建议使用分析器。字符串显然是经过 html 编码的: select id from users where string = 'test(string)'由于 HTML 实体,它当然会返回 false。

不幸的是,添加代码以使用常规查询和活动记录查询删除这些实体:

$sql = "select id from dbtable where dbfield = ?"; $query = $this->db->query($sql, array(htmlspecialchars_decode($string)));

$this->db->select('id'); $this->db->where('dbfield', "'".htmlspecialchars_decode ($string)."'", FALSE); $query = $this->db->get('dbtable');

还是不行。

【问题讨论】:

  • 请打开profiler $this-&gt;output-&gt;enable_profiler(TRUE); 看看自己正在向数据库服务器发送什么查询。
  • +1 @Kyslik 建议启用分析器。它导致了实际的解决方案。

标签: codeigniter url activerecord urlencode


【解决方案1】:

答案是 htmlspecialchars_decode() 不会解码 ( 和 ) 的实体。如果我在传递字符串之前(以及在 url 解码之后)将此代码添加到控制器:

$dstring = str_replace("&#40;", "(", $dstring); $dstring = str_replace("&#41;", ")", $dstring);

然后一切正常。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 2011-09-27
    • 2013-07-01
    • 2021-09-22
    • 2011-11-07
    • 2012-01-10
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多