PHP在HTML表单中转义双引号让我感到困惑

3
我有一个简单的PHP脚本用于前端SQLite数据库。它并不复杂。但是,我注意到从数据库中查看记录时,在带双引号的表单字段中输入的任何内容都会作为转义了反斜杠的引号在表单处理中出现。因此,当我输入以下标题的记录时:
British Light Utility Car 10HP "Tilly"
在数据库中显示的是:
British Light Utility Car 10HP \"Tilly\"
我不知道这些是从哪里来的,更糟糕的是,即使使用以下preg_replace,也似乎无法删除它们: $name = preg_replace('/\\"/', '"', $_REQUEST['kits_name']);
如果我将$name输出,它仍然带有不想要的\字符。
5个回答

5

你很可能在 php.ini 中设置了 magic_quotes_gpcon。如果你想避免这种情况并使用自己的正则表达式,请进行以下检查:

if (get_magic_quotes_gpc())
{
   $mytext = stripslashes($your_text);
}

// and your further code....

3
这意味着您的服务器启用了magic_quotes_gpc设置。
您可以使用ini_set()禁用此设置,或者您可以创建一个方法来过滤$ _REQUEST值。
function getRequest($key)
{
  $val = $_REQUEST[$key];
  if(get_magic_quotes_gpc() == 1) {
    $val = stripslashes($val);
  }
  return $val;
}

echo getRequest('kits_name');

我一直在使用类似的技巧来确保我的代码可以在不同的服务器设置下正常工作;原因是我的代码副本在各种具有不同PHP设置的主机上运行。 - Salman A
当然,您可以使用ini_set()来禁用此设置,但这对解决问题没有任何帮助。答案的其余部分也不是太好。 - Your Common Sense

2

2

您可能已经开启了自动转义功能。

这是一种不好的做法,而且已经被弃用了,建议您关闭它。

查看此文档以了解如何关闭自动转义。


0

由于缺乏好的答案。
就像他们上面说的那样,这是因为魔术引号开启了。
在插入数据之前,你必须摆脱这些斜杠。 因此,要摆脱它,可以使用 .htaccess(如果有)并进行以下设置

php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0

或者手动编写代码,像这样

if ( get_magic_quotes_gpc( ) ) {
  $_GET = array_map_recursive('stripslashes', $_GET) ;
  $_POST = array_map_recursive('stripslashes', $_POST) ;
  $_COOKIE = array_map_recursive('stripslashes', $_COOKIE) ;
  $_REQUEST = array_map_recursive('stripslashes', $_REQUEST) ;
  if (isset($_SERVER['PHP_AUTH_USER'])) stripslashes($_SERVER['PHP_AUTH_USER']); 
  if (isset($_SERVER['PHP_AUTH_PW'])) stripslashes($_SERVER['PHP_AUTH_PW']);
}

如果你的PHP版本不支持array_map_recursive函数,你可以使用像这样的递归函数。
function strips(&$el) { 
  if (is_array($el)) 
    foreach($el as $k=>$v) 
      strips($el[$k]); 
  else $el = stripslashes($el); 
} 

或者编写自己的代码 您可以使用此代码来清理现有数据

至于

如果我倾倒$name,它仍然带有不需要的\字符。

这可能是错误使用htmlspecialchars函数的结果


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接