首页 文章

括号在url break codigniter查询中传递

提问于
浏览
1

我有一个字符串通过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(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');

还是不行 .

1 回答

  • 1

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

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

    然后一切都按预期工作 .

相关问题