$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它突然起作用,不明白
答案 0 :(得分:0)
1)回显查询以查看它的呈现方式。
2)尝试自己逃避报价。有时候你会发现一个有前途的逃避或失败的功能,它实际上是为逃避比你讨价还价的东西而建的。
答案 1 :(得分:0)
感谢大家的帮助。问题已被发现。这是另一个验证函数,它检查post值是否与任何允许的值匹配。 因为$ TMPL ['category']被转义并且没有验证变量(如果tmpl var ==允许var) 它用最后一个验证循环覆盖了我的变量,因为它没有找到任何匹配