Mysql 跳过单引号,没有错误


Mysql skips single quote, no error

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

$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";
  }
}

现在我像往常一样提交这个,"猫"可能包含一个引号

我在我的表单处理函数中使用 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 它突然起作用,不明白

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

2(尝试自己转义报价。有时你会发现一个有前途的逃生或逃生功能,它实际上是为逃脱而构建的,而不是你讨价还价的。

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