Ben dahil dosyadan dizin dosyasından çağırın ama ne zaman php değişken devreye sokulur?

3 Cevap php

Kodu $lang Bu gibi (dizin dosyasının en üstünde) ilan çalışır:

index.php (with php variable declaration at the top):

   <?php
        $lang = 'es';
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
        <title>New Project</title>
        <link rel="stylesheet" type="text/css" href="styles/global.css" />
    </head>
    <body id="home">
    <div id="header">
        <div class="container">
            <div id="header-top">
                <h1><a href="http://widerdesign.co.nr/">wider design</a></h1>
                <ul id="lang">
                    <li><a href="index.php?lang=en" <?php if($lang=='en') {echo 'class="current"';} ?>>English</a></li>
                    <li><a href="index.php?lang=es" <?php if($lang=='es') {echo 'class="current"';} ?>>Español</a></li>
                    <li><a href="index.php?lang=tw" <?php if($lang=='tw') {echo 'class="current"';} ?>>中文(繁體)</a></li>
                    <li><a href="index.php?lang=cn" <?php if($lang=='cn') {echo 'class="current"';} ?>>中文(简体)</a></li>
                </ul>

ama onun bir yer dosyasında bildirilen zaman çalışmaz:

index.php (with included file which has the php variable declaration):

<?php
include_once 'common.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
    <title>New Project</title>
    <link rel="stylesheet" type="text/css" href="styles/global.css" />
</head>
<body id="home">
<div id="header">
    <div class="container">
        <div id="header-top">
            <h1><a href="http://widerdesign.co.nr/">wider design</a></h1>
            <ul id="lang">
                <li><a href="index.php?lang=en" <?php if($lang=='en') {echo 'class="current"';} ?>>English</a></li>
                <li><a href="index.php?lang=es" <?php if($lang=='es') {echo 'class="current"';} ?>>Español</a></li>
                <li><a href="index.php?lang=tw" <?php if($lang=='tw') {echo 'class="current"';} ?>>中文(繁體)</a></li>
                <li><a href="index.php?lang=cn" <?php if($lang=='cn') {echo 'class="current"';} ?>>中文(简体)</a></li>
            </ul>

common.php:

session_start();
header('Cache-control: private'); // IE 6 FIX

if(isSet($_GET['lang'])) {
    $lang = $_GET['lang'];    
    // register the session and set the cookie
    $_SESSION['lang'] = $lang;    
    setcookie("lang", $lang, time() + (3600 * 24 * 30));
} else if(isSet($_SESSION['lang'])) {
    $lang = $_SESSION['lang'];
} else if(isSet($_COOKIE['lang'])) {
    $lang = $_COOKIE['lang'];
} else {
    $lang = 'en';
}

switch ($lang) {
  case 'en':
      $lang_file = 'lang.en.php';
      break;    
  case 'es':
      $lang_file = 'lang.es.php';
      break;    
  case 'tw':
      $lang_file = 'lang.tw.php';
      break;    
  case 'cn':
      $lang_file = 'lang.cn.php';
      break;    
  default:
      $lang_file = 'lang.en.php';    
}    
include_once 'languages/'.$lang_file;

Onun common.php dosyasında ilan zaman $lang gerçekten herhangi bir değere sahip midir?

edit: the language change in the file is working is just the class .current not being activated, weird.

3 Cevap

$ Lang değişkeni common.php dosyasının en üstünde yer almaktadır; ve sonra index.php içeriğinden kullanmaya çalışıyoruz.

Ancak, common.php ve index.php içeriğinin üst arasındaki, sen languages/lang.XX.php dosyası dahil.


Are you sure there is not something, in that lang.XX.php file, that overrkimlikes the içerik of the $lang variable ?

this other question (To which I answered, and this question here seems like a follow-up of that question there -- I dkimlikn't really notice that the $lang değişken) overrkimliken ediliyordu bakılırsa , lang.en.php Bu içerir:

<?php
$lang = array(
    'h1' => 'Hello World',
);
?>

Hangi $lang değişkeni geçersiz kılar:

  • in common.php bu dil kodunu saklamak için kullanılan
  • lang.en.php bu overrkimliken olduğu içinde, dize dizisi için set
  • ve CSS sınıf başarısız ayarlamak için durum - daha sonra, içinde index.php, bu dil kodu eşit olamaz, anlamına gelir.

Evet, kesinlikle be set, size her blokta değişkeni ayarlamak if / else yapıya sahip olduğunu verilecektir. Yani if ​​/ else sonra, kesinlikle bir değeri vardır. However bu değer (boş dize ''), sadece $_GET adlı değeri kopyalayın verilen veya $_SESSION boş olabilir.

Güvenli olması için, gerçekten güvenli olması için, senin anahtarın varsayılan bölümünde $lang en olarak ayarlamanız gerekir. Sonra her zaman gerçek değeri (aynı zamanda uygulama ile çalışacak) sahip olacaktır.

include_once require_once dışarı geçmek. Eğer hata alıyorsanız, bu sizin yollar yanlış ve böyle dosyalar yüklü değil demektir.

Onun common.php dosyasında bildirilen zaman $ lang gerçekten herhangi bir değere sahip midir?

Mantıken evet, ama var_dump($lang); sonunda common.php emin söyleyecektir.

Edit: poke anlaşılacağı gibi, $lang şey için ayarlanmış olabilir. Dışarı açarak bunu beyaz listeye olmalıdır:

if(isSet($_GET['lang'])) {
    $lang = $_GET['lang'];    
    // register the session and set the cookie
    $_SESSION['lang'] = $lang;    
    setcookie("lang", $lang, time() + (3600 * 24 * 30));
} else if(isSet($_SESSION['lang'])) {
    $lang = $_SESSION['lang'];
} else if(isSet($_COOKIE['lang'])) {
    $lang = $_COOKIE['lang'];
} else {
    $lang = 'en';
}

karşı

// set default value
$lang = 'en';

// which languages are accepted?
$available_languages = array('en', 'es', 'tw', 'cn');

if(isset($_GET['lang']) && in_array($_GET['lang'], $available_languages)) {
    $lang = $_GET['lang'];    
} else if(isSet($_SESSION['lang']) && in_array($_SESSION['lang'], $available_languages)) {
    $lang = $_SESSION['lang'];
} else if(isSet($_COOKIE['lang']) && in_array($_COOKIE['lang'], $available_languages)) {
    $lang = $_COOKIE['lang'];
}

// save new value in each case
$_SESSION['lang'] = $lang;    
setcookie("lang", $lang, time() + (3600 * 24 * 30));