关于使用文本域(TextArea)的一个问题

我在使用表单处理信息时发现,对文本域的处理不正确。例如下面的一个表格:
—————————————————————test.html
html head title TextArea Test /title /head body bgcolor=”#FFFFFF” form
method=”post” action=”test.php” 文件名input type=”text” name=”filename”
value=”test.txt”br 内容:br textarea name=”content” cols=”80″
rows=”20″”aaa” “bbb”/textareabr input type=”submit” name=”Submit”
value=”写好了” input type=”reset” name=”Submit2″ value=”重写” /form
/body /html test.php ? $fp=fopen($filename, “w”); fwrite($fp,

先来个函数,是最近WordPress 3.6中刚刚引入的

$content); fclose($fp); echo “OK”; ?

上面的例子是用来测试的,主要是想完成用户可以输入一个文件名,然后可以输入文件的内容。确认后可以在服务器上保存文件。下面简单地说明一个两个文件的内容。
test.html
中有一个表单,里面有一个文本框和一个文本域。文本框用来输入要保存的文件名,文本域
用来输入文件的内容。文件名缺省设为”test.txt”,文件内容缺省设为”aaa”
“bbb”。表单的动作为”post”,执行文件为”test.php”。
test.php则很简单。打开指定文件,写入文件内容,关闭文件,输出”OK”。
原来我想文件内容应该是”aaa” “bbb”,但结果并不是这样,而是”aaa”
“bbb”!在每一个双引号(“)和反斜线()(其实还有单引号和空(nul))前都加上了一个转义用的反斜线。这是为什么?
于是,我查询了PHP中文手册,看到关于PHP.ini的配置中关于magic_quotes_gpc和magic_quotes_runtime的说明,我知道了是因为PHP给自动处理了。这样,我就将PHP.ini配置中的magic_quotes_gpc和magic_quotes_runtime
设成了off,结果就正确了。
但是如果服务器我无法改动怎么办?于是又查阅了一下字串符处理函数,我发现stripslashes()函数就可以完成这个工作。这样首先把PHP.ini改成原来的样子,再修改test.php如下:

/** * Add slashes to a string or array of strings. * * This should be used when preparing data for core API that expects slashed data. * This should not be used to escape data going directly into an SQL query. * * @since 3.6.0 * * @param string|array $value String or array of strings to slash. * @return string|array Slashed $value */function wp_slash { if  { foreach  { if  { $value[$k] = wp_slash; } else { $value[$k] = addslashes; } } } else { $value = addslashes; } return $value;}

先说明1个PHP内置函数:get_magic_澳门新葡萄京官网注册,quotes_gpc()

这个函数的作用就是得到php.ini设置中magic_quotes_gpc选项的值。而magic_quotes_gpc选项如果值为On,PHP解析器就会自动为post、get、cookie过来的数据增加转义字符“”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的致命的错误。

开启时,单引号与
NUL等字符都会被加上反斜线,否则需要手动处理,就用到了addslashes()magic_quotes_gpc值为On时返回1,否则返回0addslashes()
函数在指定的预定义字符前添加反斜杠。也就是上面列出的字符

但在PHP5.4以上取消了get_magic_quotes_gpc()内置函数,为了避免以后出错,所以这样过滤所有输入:

if(!function_exists || !get_magic_quotes_gpc { foreach(array('_COOKIE', '_POST', '_GET') as $v) { foreach { $kk{0} != '_' && $$v[$kk] = addslashes; } } } 

在处理mysql和GET、POST的数据时,常常要对数据的引号进行转义操作。PHP中有三个设置可以实现自动对’和
NULL 字符转转。PHP称之为魔术引号,这三项设置分别是

magic_quotes_gpc

影响到 HTTP 请求数据。不能在运行时改变。在 PHP 中默认值为 on。

这个开启时,通过GET,POST,COOKIE传递的数据会自动被转义。

如 test.php?id=abc’de”fecho $_GET[‘id’]; # 会得到
abc’de”fmagic_quotes_gpc=On;
这个开启了,对写入数据库是没有影响的,比如 上面的$_GET[‘id’]
写到数据库里面,依然是 abc’de”f ,

相反,如果magic_quotes_gpc=Off; 那么字符中要带有引号
,直接写入mysql都会直接变成空白但是,如果你将它写入文档,而非mysql。那么它将是
abc’de”f

magic_quotes_runtime

如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在
PHP 中的默认值为 off。

magic_quotes_sybase

如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖
magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成
”。而双引号、反斜线 和 NULL 字符将不会进行转义。

我表单内容本来是:澳门新葡萄京官网注册 1

澳门新葡萄京官网注册 2

对策一:修改php.ini文件(修改php.ini这个方法就不说了,大家可以google下)

对策二:把转义的给取消了

第一步:找到你提交的数据比如$_POST[‘content’],将其改成$content=stripslashes;

第二步:以后在使用$POST[‘content’]的地方都换成$content

第三步:提交到数据库,数据库储存还是正常的:澳门新葡萄京官网注册 3读出来又成了

澳门新葡萄京官网注册 4(这个应该知道怎么解决了吧?要不我再罗嗦下吧)

第四步:将数据库读取的内容再用stripslashes()过滤一下。

stripslashes() 这个函数
,删除由addslashes()函数添加的反斜杠。用于清理从数据库或 HTML
表单中取回的数据

PHP页面中如果不希望出现以下情况: 单引号被转义为 ‘ 双引号被转义为 ”
那么可以进行如下设置以防止: 在php.ini中设置:magic_quotes_gpc = Off)

1. 对于magic_quotes_gpc=on的情况

我们可以不对输入和输出数据库的字符串数据作addslashes的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

发表评论

电子邮件地址不会被公开。 必填项已用*标注