我有这个文件:
<?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
?
答案 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>