我有一个字符串通过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
以下是发生的事情:
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');
仍然无法正常工作。
答案 0 :(得分:1)
答案是htmlspecialchars_decode()不解码(和)实体。如果我在传递字符串之前将此代码添加到控制器(和AFTER url解码):
$dstring = str_replace("(", "(", $dstring);
$dstring = str_replace(")", ")", $dstring);
然后一切正常。