mysqli 查询问题。 mysqli_real_escape_string 错误

mysqli query issue. mysqli_real_escape_string error

遇到 mysqli 查询问题 - 特别是 WHERE stoname= 子句。

这行不通:

$result = @mysqli_query($dbc, "SELECT * FROM thedb  WHERE coname='{$_SESSION['user']}' AND stoname='{$_SESSION['store']}' ");

如果我回显 $_SESSION['store'] 然后它打印为 o\'store 匹配数据库中的内容。然而这不起作用。

但是,如果我回显 mysqli_real_escape_string($dbc,($_SESSION['store'])),那么它会打印出 o\\'store,这不是数据库中的内容。但它有效。

$result = @mysqli_query($dbc, "SELECT * FROM thedb WHERE user='{$_SESSION['user']}' AND stoname='".mysqli_real_escape_string($dbc,($_SESSION['store']))."' ");

我承认我有工作代码,但我对为什么会这样感到困惑。谁能解释我做错了什么/做错了什么?谢谢

如果您的 table 确实包含 o\'store,那么 mysqli_real_escape_string() 已经正确完成了它的工作。该函数的目的是转义字符串以安全包含在 SQL 语句中,而不是与 table 中实际已经存在的内容完全匹配。

table 值按字面意思包含 \'。当您在 SQL 语句中直接使用该值时,反斜杠被 误解为 作为 ' 的转义字符而不是文字 \如您的 table 中所示。所以查询不会产生任何结果,因为执行的 SQL 语句是:

# MySQL sees only an escaped ' and no \
SELECT * FROM thedb  WHERE coname='something' AND stoname='o\'store'

...意味着 stoname 实际比较的值只是 o'store 而没有 \,因为 \ 已被 MySQL 作为转义字符。

所以 mysqli_real_escape_string() 产生一个有两个变化的值。

首先,将原始字符串中的文字 ' 反斜杠转义为 \',以便在 SQL.

中使用

然后,字符串中已有的文字 \ 本身是反斜杠转义的,因此 MySQL 可以将其理解为文字字符,而不是转义字符。结果是 \。结合转义的 \',您现在有 \\'.

MySQL 收到该字符串 \\' 并能够正确地将其解释为一个文字 \ 后跟一个文字 ' 丢弃额外的 \ ] 在每个之前转义字符。条件与列的实际值匹配,查询成功。

# MySQL sees an escaped \ followed by an escaped '
SELECT * FROM thedb  WHERE coname='something' AND stoname='o\\'store'

关于存储...

我们不太了解您的 table 最初是如何收到它的值的,但我有预感它是以转义形式存储的。如果字符串 o\'store 最初是 o'store 而没有 \,则表明在 table 中插入了转义值。通常不会这样做,也是不可取的。在数据插入时正确使用mysqli_real_escape_string()应该存储原始字符串而不是转义字符串。仅在构造 SQL 语句时转义。