在url break codeigniter查询中传递的括号

时间:2014-04-08 16:49:31

标签: codeigniter url activerecord urlencode

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

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方法创建查询,如下所示:无法添加另一个链接SO:ellislab.com论坛viewthread 162036

此:

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

也不起作用。

编辑#3:感谢Kyslik建议使用profiler。该字符串显然是html编码的:从用户中选择id,其中string ='test&amp;#40; string&amp;#41;'由于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');

仍然无法正常工作。

1 个答案:

答案 0 :(得分:1)

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

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

然后一切正常。