【问题标题】:PHP MySQL how to transition database input from stripslashes to parametersPHP MySQL如何将数据库输入从stripslashes转换为参数
【发布时间】:2016-12-03 17:41:45
【问题描述】:

我正在尝试更新一个使用常规 MySql 查询的旧程序,在插入之前通过addslashes() 运行所有输入,并在返回之前通过stripslashes() 运行检索到的数据。我正在尝试更新程序以使用 Mysqli 运行并使用准备好的语句,但我不确定如何使用数据库中的现有数据进行转换。

我的第一个想法是编写一个函数来测试是否添加了斜线,但在我发现的类似问题的答案中普遍认为这是不可行的。

我试图避免对数据库进行大规模更新,因为它是一个开源程序,这似乎可能会给现有用户在尝试升级时带来问题。

如果我在使用 MySqli 和准备好的语句插入之前继续使用 addslashes(),这会起作用吗?不采用这种方式而是采用完整的数据库升级路线的原因是什么?

编辑:

根据现在貌似被删除的评论,我直接去查看了数据库。我所能找到的只是一个',它已转换为',并且没有斜线。当我取出数据时,它没有运行stripslashes(),结果很好。那么添加的斜杠是否只是告诉mysql在插入数据时对其进行转义?如果我删除stripslashes(),所有数据都会出来吗?如果是这样,stripslashes() 的意义何在?

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    您有几个问题:

    如果我在插入使用 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() 的情况非常罕见且非常具体。对于您的场景,您不需要它。

    【讨论】:

    • 这个答案很完美。谢谢。我正在更新的项目原本不是我的,所以我不知道添加stripslashes() 背后的逻辑是什么。我从您的回答中得到的是,删除它们会改进代码,我实际上不需要对现有数据库做任何事情。数据已正确保存,并且无需任何更改即可正常输出。我意识到如果不查看数据,您无法保证这一点,但从理论上讲,这应该是正确的。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2019-03-08
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多