4.2.3 格式化字符串以便存储:addslashes()和stripslashes()

除了使用字符串函数来重新格式化一个可见的字符串之外,也可以使用其中的一些函数来重新格式化字符串,以便将其存入数据库。虽然在本书的第二篇之前,我们还没有介绍在数据库中执行真正的写操作,但现在,我们将介绍如何为了数据库存储而对字符串进行格式化。

对于字符串来说,某些字符肯定是有效的,但是当将数据插入到数据库中的时候可能会引起一些问题,因为数据库会将这些字符解释成控制符。这些有问题的字符就是引号(单引和双引)、反斜杠(\)和NULL字符。

我们需要找到一种标记或是转义它们的办法,以便使像MySQL这样的数据库能够理解我们表示的是有实际意义的特殊文本字符,而不是控制序列。为了将这些字符进行转义处理,可以在它们前面加一个反斜杠。例如,"(双引号)就变成\"(反斜杠双引号),\(反斜杠)就变成\(反斜杠反斜杠)。(这个规则对所有特殊字符都通用,所以,如果在字符串中存在\字符,就需要用\\进行替换。)

PHP提供了两个专门用于转义字符串的函数。在将任何字符串写到数据库之前,如果你的PHP的默认配置还没有启用该功能,你应该使用addslashes()将它们重新格式化,例如:


$feedback=addslashes(trim($_POST['feedback']));


和许多其他字符串函数一样,addslashes()函数需要一个字符串作为输入参数,经过该函数处理,将返回一个重新格式化后的字符串。

图4-3所示的是对一个字符串应用这些函数后的结果。

4.2.3 格式化字符串以便存储:addslashes()和stripslashes() - 图1

图 4-3 调用addslashes()后,所有引号将被加上反斜杠,而Stripslashes()会移除这些反斜杠

也可以在服务器上尝试执行这些函数,将获得与图4-4类似的输出结果。

4.2.3 格式化字符串以便存储:addslashes()和stripslashes() - 图2

图 4-4 所有存在问题的字符都被转义了两次,这就意味着魔术引号特征被启用了

如果你看到了上图中的结果,这表明你的PHP配置将自动添加或去除反斜杠。这个功能是由magic_quotes_gpc配置指令控制的。如今,在PHP新版本的默认安装情况下,该指令是启用的。gpc表示GET、POST和cookie,是第一个字母的组合。这就意味着,来自这些方法或方式的变量将被自动包括在引号内。使用get_magic_quotes_gpc()函数,可以检查系统上的这个指令是否已经启用,如果来自这些方法的变量被自动引用在引号中,该函数将返回true。如果系统上该指令为启用的,在显示用户数据之前,必须调用stripslashes()函数;否则,这些反斜杠会被显示出来。

使用魔术引号将允许你编写具有更好可移植性的代码。可以在第23章中了解关于该特性的更多内容。