0

我有这个文件:

<?php
    define('SITH_PATH', $_SERVER['DOCUMENT_ROOT'].'/new/IndiaCommunity/');

    function getLang()
    {
        if (!isset($_COOKIE['lang']))
        {
            setLang("he");
        }

        return $_COOKIE['lang'];   
    }

    function setLang($lang)
    {
        $date_of_expiry = time() + 604800; // One week.
        setcookie("lang", $lang, $date_of_expiry );
    }
?>

然后我在索引页面中需要这个页面。

<?php
require_once 'config.php';
if (isset($_GET['lang']))
{
    getLang(); // no error
    setLang($_GET['lang']); // error
}

当我调用我应该getLang();得到的函数时,he

但是当我打电话时setLang("en");

从我打电话的同一页getLang();

我收到“调用未定义函数”错误。为什么我可以调用getLang但不能调用setLang它们都在同一页面中定义?

4

2 回答 2

2
<?php
define('THE_PATH', $_SERVER['DOCUMENT_ROOT'].'/new/IndiaCommunity/');

function getLang()
{
    if (!empty($_GET['lang'])) {
        $lang = $_GET['lang'];
        setLang($lang);
    }
    else if (!empty($_COOKIE['lang']))
    {
        $lang = $_COOKIE['lang'];
    }
    else {
        $lang = "he";
        setLang($lang);
    }

    return $lang;
}

function setLang($lang)
{
    $date_of_expiry = time() + 604800; // One week.
    setcookie("lang", $lang, $date_of_expir );
}
?>

现在像这样使用它:

<?php
require_once 'config.php';
$lang = getLang();

与您的代码的不同之处主要在于您确实希望 setcookie 设置 $_COOKIE 中的值。实际上 $_COOKIE 数组只有您通过请求收到的 cookie,而不是您为响应设置的值。其他人说,setcookie 确实为下一个请求设置了 $_COOKIE,它不会更改当前请求的 $_COOKIE。

顺便说一句,我杀了西斯 :) 愿原力与你同在。

于 2013-04-26T21:52:40.677 回答
1

你正在混合你的数组。以及您如何提取值和设置 cookie。您正在检查if (isset($_GET['lang'])),这意味着如果页面的地址不以它结尾,?lang=en则不会检索您的变量。您没有$_COOKIE在页面上检查 a 。如果没有通过尝试重写 $_COOKIE 值来设置 cookie,那么您只是在尝试将新 cookie 设置为“他”。$_GET['lang']然后你用假设它被设置的值替换那个cookie 。如果不是,那么您正在设置一个空 cookie。有人还可以设置一个 '?lang=xxx' 的 cookie 并破坏代码。

这段代码的作用是从$_GETvar 中提取语言(重置 cookie 的机会)。如果他们没有重置 cookie,那么它正在尝试将语言从$_COOKIEvar 中提取出来。如果这不起作用,则将“他”设置为默认语言并设置 cookie。

尝试将代码加载到同一页面中

<?php

define('SITH_PATH', $_SERVER['DOCUMENT_ROOT'].'/new/IndiaCommunity/');

    //This function cleans the input meaning
    //you can use lowercase letters exclusively.
    function getLang($lang)
    {
     //ISO 639-1 Code check - we're looking for a 2-digit code.
      if (!empty($lang)&&preg_match('!^[A-Za-z]{2}$!',$lang)){
      $lang = strtolower($lang);        
      } else {
        $lang='he';  
      }
        return $lang;   
    }

    function setLang($lang)
    {
        $date_of_expiry = time() + 604800; // One week.
        setcookie("lang", $lang, $date_of_expiry );
    }


    if(!empty($_GET['lang'])){
    $lang = getLang($_GET['lang']);

    //to give the option to reset the cookie
        setLang($lang); 

    } elseif (!empty($_COOKIE['lang'])){
            //Rather than trusting the cookie,
            //we're still checking it for
            //2-digit validity 
    $lang = getLang($_COOKIE['lang']);          
    } else {
    $lang = getLang('he');
    }

?>

<form action="#" method="GET">
<input type="text" name="lang" value="<?php echo $lang ?>" /><br />
<input type="submit" value="Set Language" />
</form>
于 2013-04-26T21:39:44.500 回答