Php mysqli查询问题。mysqli\u real\u escape\u字符串错误

Php mysqli查询问题。mysqli\u real\u escape\u字符串错误,php,mysqli,mysql-real-escape-string,Php,Mysqli,Mysql Real Escape String,mysqli查询有问题-特别是WHERE stoname=子句 这不起作用: $result = @mysqli_query($dbc, "SELECT * FROM thedb WHERE coname='{$_SESSION['user']}' AND stoname='{$_SESSION['store']}' "); 如果我回显$\u会话['store'],则它将打印为o\store,与数据库中的内容匹配。但这不起作用 但是,如果我回显mysqli\u real\u escape\u

mysqli查询有问题-特别是
WHERE stoname=
子句

这不起作用:

$result = @mysqli_query($dbc, "SELECT * FROM thedb  WHERE coname='{$_SESSION['user']}' AND stoname='{$_SESSION['store']}' ");
如果我回显
$\u会话['store']
,则它将打印为
o\store
,与数据库中的内容匹配。但这不起作用

但是,如果我回显
mysqli\u real\u escape\u字符串($dbc,($\u SESSION['store'])
,那么它会打印数据库中没有的
o\\\\\'store
。但它确实有效

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

我承认我有工作代码,但我不明白为什么会这样。谁能解释一下我做错了什么?谢谢

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

表值包含字面上的
\'
。当您在SQL语句中直接使用该值时,反斜杠会被误解为
'
的转义字符,而不是表中显示的文本
\
。因此,查询不会产生任何结果,因为执行的SQL语句是:

# MySQL sees only an escaped ' and no \
SELECT * FROM thedb  WHERE coname='something' AND stoname='o\'store'
…这意味着实际比较的
stoname
的值只是
o'store
而不是
\
,因为MySQL已将
\
作为转义字符丢弃

因此
mysqli\u real\u escape\u string()
生成一个值,其中有两个更改

首先,原始字符串中的文本
'
被反斜杠转义为
\'
,以便在SQL中使用

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

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

# MySQL sees an escaped \ followed by an escaped '
SELECT * FROM thedb  WHERE coname='something' AND stoname='o\\\'store'
关于存储。。。
我们不知道您的表最初是如何接收其值的,但我有一种预感,它是以转义形式存储的。如果字符串
o'store
最初是
o'store
而没有
\
,则表明表中插入了转义值。这通常是不可取的。在插入数据时正确使用
mysqli\u real\u escape\u string()
应该存储原始字符串,而不是转义字符串。只有在构造SQL语句时才进行转义。

当您说第一个语句不起作用时,您的意思是它不返回结果,还是它破坏了SQL语句,导致错误?除非从
@mysqli_query()
中删除
@
,否则您将错过错误。感谢您的冗长回复。我看这些反斜杠已经很久了,我觉得我的大脑快要崩溃了&我得把你的回答读几遍。然而,听起来数据库是主要的错误。暂时忽略绑定等,是否应该在存储前转义值?您是否希望将该值存储为表中的
o'store
而不是
o'store
?@devsie是假定为
o'store
的原始值?如果是这样,那么应该在存储之前对其进行转义,这意味着存储的实际值不再转义。转义仅与SQL字符串相关。如您所知,如果没有反斜杠,SQL将崩溃。但是如果使用得当,转义值永远不会进入数据库,如果数据库中确实包含转义值,那么它们的插入方式就出了问题。例如,一个常见的问题是由于
addslashes()
而导致的双重转义。^^这听起来仍然很复杂。简短的回答-是的,我希望存储的值是
o'store
,未被替换。\用于查询解析器,而不是数据存储。是的,原始值应为
o'store
。未使用
addslashes
。查找代码,
stoname=mysqli\u real\u escape\u string($dbc,trim(ucwords)(strtolower($\u POST['stoname')))
@mysqli_query($dbc,“插入sto_详细信息(stoname)值(“$stoname”)”)似乎是所有的事情。@devsie-Hmm,您是否有旧PHP版本的一个邪恶的mis功能,它最终在5.4中被删除了。。。这是另一种可能的解释,但我并没有自愿这么做,因为现在这种情况不太常见了。