您有几个问题:
如果我在插入使用 mysqli_ 和准备好的语句之前继续使用 addslashes(),这会起作用吗?
不,它不会:添加的反斜杠随后将存储在您的数据库中,这不是您想要的。在准备好的语句中,所提供的参数在您传递它们时按字面意思获取,因为在该机制中不再需要转义引号。
不采用这种方式而是采用完整的数据库升级路线的原因是什么?
见上文。
那么添加的斜线是否只是告诉 MySql 在插入数据时对其进行转义?
当您在 SQL 中嵌入字符串文字时,会解释添加的斜杠,因为它必然包含在引号中。例如:
$text = "My friend's wedding";
$sql = "INSERT INTO mytable VALUES ('$text')";
$result = mysqli_query($con, $sql);
mysqli_query 将失败,因为传递给它的 SQL 语句如下所示:
INSERT INTO mytable VALUES ('My friend's wedding')
这不是有效的 SQL,因为中间引号结束了字符串文字,因此后面的 s 不再被视为字符串的一部分。由于 SQL 引擎不理解 s(也不理解 wedding 及其后的悬空引号),因此会产生语法错误。您甚至可以看到上一行中突出显示语法的方式有问题。
这就是addslashes()(有点)有用的地方:
$text = "My friend's wedding";
$text = addslashes($text);
$sql = "INSERT INTO mytable VALUES ('$text')";
$result = mysqli_query($con, $sql);
这将起作用,因为现在发送到 MySql 的 SQL 语句如下所示:
INSERT INTO mytable VALUES ('My friend\'s wedding')
反斜杠告诉MySql,它后面的引号必须被视为文字,而不是字符串的结尾。 MySql 本身不会存储反斜杠,因为它只是为了转义引号(参见documentation 中的转义序列列表)。
所以在您的表格中,您将插入以下内容:
我朋友的婚礼
然后:
如果我删除stripslashes(),所有数据都会正常显示吗?
是的。事实上,它一开始就不应该出现在您的代码中,因为当您的数据中确实(有意!)反斜杠时,它会对您获得的结果产生负面影响。您可能很幸运,反斜杠在普通文本中是一个罕见的字符。显然,您在数据库数据中没有发现任何反斜杠,所以它可能直到现在还没有对您造成严重影响。认为保存数据期间的addslashes() 调用必须在读取数据时用stripslashes() 调用来对抗是错误的,因为再次,MySql 在将数据写入数据库时已经删除了它们。
如果是这样,stripslashes() 的意义何在?
在你所做的事情的背景下没有意义。仅当您以某种方式收到一个字符串时才有用,该字符串中的字符前面有一个反斜杠,并且在某些上下文中使用该字符串时具有 escape 下一个字符的含义。但是由于您只是短暂地拥有这样的字符串(在调用 addslashes() 之后)并且 MySql 通过删除写入数据中的反斜杠来解释这些转义,因此您再也不会看到带有额外反斜杠的字符串。
您需要stripslashes() 的情况非常罕见且非常具体。对于您的场景,您不需要它。