-1

我遇到了单引号问题我有一个带有选择下拉列表和多个选项的表单。

$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,不明白

4

2 回答 2

0

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

于 2013-10-09T18:30:26.250 回答
0

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

2)尝试自己转义报价。有时你会发现一个有希望的逃生或非逃生函数,实际上是为逃避比你讨价还价的更多而构建的。

于 2013-10-09T14:22:50.533 回答