【问题标题】:Codeigniter database query bug - does not return expected resultsCodeigniter 数据库查询错误 - 不返回预期结果
【发布时间】:2012-02-07 11:05:33
【问题描述】:

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

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

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

$value = 'commas-:-)'

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

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

发生了什么事?

【问题讨论】:

  • 您是否尝试过运行活动查询以查看是否存在差异? $this->db->get_where('variables', array('value' => $value));
  • 我刚试过-没有区别。我打印了查询,它仍然可以正常工作。嗯。

标签: sql codeigniter


【解决方案1】:
$sql = "SELECT * FROM variables WHERE value = ?";
$this->db->query($sql, array('commas-:-)')); 

更多info

【讨论】:

    【解决方案2】:
    $get_data = $this->db->from('variables')
                          ->where('value', $value)
                            ->get();
    

    希望这会奏效...!

    尝试使用这些东西来检查查询

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

    【讨论】:

    • 我也试过这个 - 结果相同(没有结果)。我还测试了它返回的查询,它在数据库上运行良好......
    【解决方案3】:

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

    事情是这样的:

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

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

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

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

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

    _filter_uri($str)

    对于匹配的 uri 段的每个部分。

    它做了什么?它将可编程字符(和)替换为它们的 HTML 实体。现在,如果您不知道,html 实体的长度比 url 编码长。哈哈。所以发生了这样的事情:

    原始段:逗号-%3A-%29

    urldecode(")") = 字符串(4) urldecode("%29") = string(1)

    失败。

    还是赢了?!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多