我遇到了单引号问题我有一个带有选择下拉列表和多个选项的表单。
$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'] 时,它是正确的。但是在更新查询中它是不同的(没有多次定义它)
更新 2 好的,我真的不知道为什么,但如上所述,我从发布的表单值中创建了一个 $TMPL['category'] 并将其转义,然后在查询中使用它。那行不通
$TMPL['category'] = $DB->escape($FORM['category'], 1);
如果我添加
$any_var = $TMPL['category'];
在它下面并在它突然起作用的查询中使用 $any_var,不明白