从与工作函数相同的页面调用函数上的未定义函数

时间:2013-04-26 21:07:37

标签: php

我有这个文件:

<?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

2 个答案:

答案 0 :(得分: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。

顺便说一句,我杀死了SITH :)愿力量与你同在。

答案 1 :(得分:1)

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

这段代码的作用是从$_GET var中提取语言(有机会重置cookie)。如果他们没有重置cookie,那么它正试图将语言从$_COOKIE var中拉出来。如果这不起作用,那么它将'他'设置为语言默认值并设置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>