0

所以基本上当我输入带有撇号的东西时,比如约翰的自行车,它会呼应约翰的自行车。下面的代码:

<?php
$searchname = $_POST["name"] ;
echo "$searchname";

我的表单使用 POST 方法。有没有办法阻止这种情况?

还要使输入不区分大小写,我将如何在这个部分进行?

$searchsport = $_POST['sport'];
$sportarray = array(
"Football" => "Fb01",
"Cricket" => "ck32",
"Tennis" => "Tn43",
);
if(isset($sportarray[$searchsport])){
header("Location: ".$sportarray[$searchsport].".html");
die;
}
    //what code is needed to make the if statement work? I've looked up some weird ways such as using array_change_key_case (which I clearly don't understand).
4

5 回答 5

5

这很可能是因为您打开了魔术引号,请尝试以下操作:

if (get_magic_quotes_gpc())
{
  $searchname = stripslashes($_POST["name"]);
  echo "$searchname";
}
else
{
  $searchname = $_POST["name"];
  echo "$searchname";
}

实际上,您可以创建一个函数来自动为您执行此操作:

function fixIt($str)
{
    if (is_array($str))
    {
        foreach ($str as &$value)
        {
            $value = fixIt($value);
        }

        return $str;
    }
    else
    {
        return stripslashes($str);
    }    
}

然后你可以简单地做:

$searchname = fixIt($_POST["name"]);
echo $searchname;

注意:您还可以禁用 php.ini 中丑陋的魔术引号,因为它们存在问题并且被正确地弃用并且在 PHP 的未来版本中被淘汰。

于 2010-05-23T12:55:19.433 回答
4

有几种方法。

  1. 在 php.ini 中关闭magic_quotes_gpc

    magic_quotes_gpc = 0
    
  2. 在请求的开头,运行 stripslashes

    if (get_magic_quotes_gpc() && !function_exists('FixMagicQuotesGpc')) {
        function FixMagicQuotesGpc($data) {
            if (is_array($data)) {
                foreach ($data as &$value) {
                    $value = FixMagicQuotesGpc($value);
                }
                return $data;
            } else {
                return stripslashes($data);
            }
        }
        $_GET = FixMagicQuotesGpc($_GET);
        $_POST = FixMagicQuotesGpc($_POST);
        $_REQUEST = FixMagicQuotesGpc($_REQUEST);
    }
    

编辑:添加了 !function_exists 部分。这样,如果您之前运行过它,您不必担心,如果它已经运行过(通过另一个文件等),它会跳过它

于 2010-05-23T13:01:19.000 回答
2

这由magic_quotes_gpc配置变量控制。这真的很烦人(并且已弃用!)。

您应该在 中将其关闭php.ini,或者询问您的网络主机他们是否可以对此做些什么。

如果他们不能,您可以使用addslashesandstripslashes手动转义/取消转义。不过要当心——你应该使用比addslashes提交到数据库更安全的东西。mysql_real_escape_string是更好的选择,或者特定于您的数据库的功能:

于 2010-05-23T12:56:12.917 回答
0

如果需要,我在我的配置文件中包含以下脚本来修复魔术引号。这样我就不必担心主机的魔术引号设置。

<?php

set_magic_quotes_runtime(0);

function _remove_magic_quotes(&$input) {
    if(is_array($input)) {
        foreach(array_keys($input) as $key) _remove_magic_quotes($input[$key]);
    }
    else $input = stripslashes($input);
}
if(get_magic_quotes_gpc()) {
    _remove_magic_quotes($_REQUEST);
    _remove_magic_quotes($_GET);
    _remove_magic_quotes($_POST);
    _remove_magic_quotes($_COOKIE);
}

return true;

?>
于 2010-05-24T14:45:01.960 回答
0

Magic Quotes... 当 PHP 6 终于到来并消除了这个不兼容的怪物时,我会非常高兴。

最好的解决方案是在 php.ini 中通过设置将其关闭

magic_quotes_gpc = Off

如果您无权访问 php.ini 但正在使用 Apache,您也可以在.htaccess文件中禁用它:

php_flag magic_quotes_gpc Off

最后一种方案是在您的应用程序中禁用它。PHP 手册的Disabling Magic Quotes页面建议使用这个:

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>
于 2010-05-24T14:53:44.033 回答