Php mysqli查询问题。mysqli\u real\u escape\u字符串错误
mysqli查询有问题-特别是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
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中被删除了。。。这是另一种可能的解释,但我并没有自愿这么做,因为现在这种情况不太常见了。