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 语句时转义。
遇到 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 语句时转义。