Codeigniter数据库查询错误 - 不返回预期结果

时间:2012-01-11 02:26:21

标签: sql codeigniter

我在我的数据库中测试了这个查询,它运行正常:

select * from variables where value = 'commas-:-)';

我得到了一个结果。现在,我将值存储在变量中并使用查询类。

$value = 'commas-:-)'<<<这是作为参数传递的

$query = "select * from variables where value = '$value'";
$this->db->query($query);

现在,此查询适用于除此之外的所有其他值 - 但奇怪的是,如果我打印出确切的查询(print_r $query)并在数据库上执行它,它返回正确的结果。所以我不得不认为查询类正在搞砸我的查询,它不应该因为所有内容都被正确转义而且$value是一个字符串文字。

发生了什么事?

3 个答案:

答案 0 :(得分:0)

$sql = "SELECT * FROM variables WHERE value = ?";
$this->db->query($sql, array('commas-:-)')); 

更多info

答案 1 :(得分:0)

$get_data = $this->db->from('variables')
                      ->where('value', $value)
                        ->get();

希望这会奏效......!

尝试使用这些内容来检查查询

echo $this->db->last_query();

print_r($this->db->result_array($get_data));

答案 2 :(得分:0)

我发现了问题 - 这是导致事故的重新路由功能。更具体地说,系统核心中的路径文件夹内的段过滤功能。

这就是发生的事情:

我创建了一个带编码值的锚(逗号:-)),我配置了路由,将uri重新路由到我控制器中的函数。每次我点击链接时,值都会传递,并且(据说)重新路由到函数。对于我使用的几乎所有值,它做了什么。除了这一个。

第一个假设:db查询函数正在转义值。但我关闭了逃生,并通过打印检查了查询。价值是正确的。然后我尝试了其他查询格式,但仍然没有结果。结论:数据库查询功能没有任何问题。

第二个假设:数据必须损坏 - 尽管值是正确的(我得到逗号:-)),除非我手动输入值,否则它不会返回任何内容。所以我测试了这个: 我创建了一个单独的值,并将其设置为我输入的值(有效的值)。然后我使用VAR_DUMP打印原始值(一个传递)和新创建的值。 事实证明,参数值(一个不起作用)是一个长度为14的字符串,而我的新变量是一个长度为10的字符串.WTF?结论:在重新路由/传递过程中发生了一些改变变量的事情。

我回到config文件夹,并将重新路由中的变量$ i替换为文字字符串值逗号:-)。你猜怎么着?它工作得很好。只是为了确保它不是正则表达式,我编写了自己的自定义正则表达式并且匹配正常,但价值仍在改变。所以我决定深入了解。

我将routes类中的URI操作跟踪到_explode_segment()函数,该函数用于执行正则表达式并分析其他变量的uri。它也做了这件事......

_filter_uri($ STR)

匹配的uri细分的每个部分。

它做了什么?它用HTML ENTITY替换像(和)这样的可编程字符。现在,如果您不知道,html实体的长度比url编码长。大声笑。所以发生了什么:

原始片段:逗号 - %3A-%29< - 非常好! 过滤段:逗号 - %3A - )< - NOOOOOOOOO! (使用&#41编码的右边的paren。)

urldecode(“&#41”)= string(4) urldecode(“%29”)= string(1)

失败。

或WIN?!