【发布时间】: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
这就是正在发生的事情:
一个 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->output->enable_profiler(TRUE);看看自己正在向数据库服务器发送什么查询。 -
+1 @Kyslik 建议启用分析器。它导致了实际的解决方案。
标签: codeigniter url activerecord urlencode