Mysql跳过单引号,没有错误

时间:2013-10-09 14:08:53

标签: php mysql

我对单引号有疑问 我有一个带有选择下拉列表和多个选项的表单。

$TMPL['category'] = htmlspecialchars($TMPL['category'], ENT_QUOTES, "UTF-8");

foreach ($CONF['categories'] as $cat => $skin) {
  $cat = htmlspecialchars($cat, ENT_QUOTES, "UTF-8");

  if ($TMPL['category'] == $cat) {
    $TMPL['categories_menu'] .= "<option value=\"{$cat}\" selected=\"selected\">{$cat}</option>\n";
  }
  else {
    $TMPL['categories_menu'] .= "<option value=\"{$cat}\">{$cat}</option>\n";
  }
}

现在我像往常一样提交,“cat”可能包含单引号

我在表单处理函数中使用mysql转义函数(是的,这也检查了magic_quotes)进行了转义

$TMPL['category'] = $DB->escape($FORM['category'], 1);

如果我回显这个变量一切都很好,那么单引号被转义,你会认为mysql会更新我的行。 Html,php,db也在utf8中

完全迷失了,也许我只是没有看到我的错误,但它可以在其他地方工作,输入都很好,但只要单引号在选择框中,mysql只是完全跳过它而且也不会产生任何错误

$DB->query("UPDATE `my_table` SET `category` = '{$TMPL['category']}' WHERE `xx` = 'xx'", __FILE__, __LINE__);

注意,以上查询关于列的查询不完整,为了便于阅读,我删除了所有其他查询。如果我选择了单引号选项值,其他字段仍会更新。当选项不包含单引号时,它也有效。

我希望有人可以给我一些见解,厌倦了查看代码,因为它看起来完全正确

谢谢

更新1

更深入一点,我有3个选择选项

<option value="category1"></option>
<option value="category'bla"></option>
<option value="category3"></option>

现在,当我提交表单并选择第二个选项时,它会跳过并提交第三个选项(总是列表中的最后一个选项),尽管我在提交时回显了选择后的var $ TMPL ['category']功能,这是正确的。但是在Update查询中它是不同的(没有多次定义)

更新2 好吧,我真的不知道为什么,但如上所述,我从已发布的表单值中创建$ TMPL ['category']并将其转义,然后在查询中使用它。 这不起作用

$TMPL['category'] = $DB->escape($FORM['category'], 1);

如果我添加

$any_var = $TMPL['category'];
在它下面

并在查询中使用$ any_var它突然起作用,不明白

2 个答案:

答案 0 :(得分:0)

1)回显查询以查看它的呈现方式。

2)尝试自己逃避报价。有时候你会发现一个有前途的逃避或失败的功能,它实际上是为逃避比你讨价还价的东西而建的。

答案 1 :(得分:0)

感谢大家的帮助。问题已被发现。这是另一个验证函数,它检查post值是否与任何允许的值匹配。 因为$ TMPL ['category']被转义并且没有验证变量(如果tmpl var ==允许var) 它用最后一个验证循环覆盖了我的变量,因为它没有找到任何匹配