2013-03-05 61 views
-8

我是PHP新手,我真的很困惑我的代碼似乎是正確的,它的工作原理,但不完全。我試圖實現一個翻譯使用會話爲用戶實現一些其他功能,當條件被調用時,如果elseif elseif,我需要使用海恩if語句與其他人,或者是否有可能像我一開始做的那樣。是if elseif ifif possible vs if else?

<?php 

if ($_GET['lang']=='fr') { 
include('fr.php'); 
session_start(); 
$_SESSION['lang']='fr'; 
} 


elseif ($_GET['lang']=='en') { 
include('gb.php'); 
session_start(); 
$_SESSION['lang']='en'; 
} 

elseif ($_GET['lang']=='it') { 
include('it.php'); 
session_start(); 
$_SESSION['lang']='it'; 
} 

elseif ($_SESSION['lang']=='fr') 
{ 
include('fr.php'); 
} 

elseif ($_SESSION['lang']=='en') 
{ 
include('gb.php'); 
} 

elseif ($_SESSION['lang']=='it') 
{ 
include('it.php'); 
} 

else 
{ 
include('fr.php'); 
} 
?> 
+3

我完全不知道你想問什麼。沒有絲毫的線索。 – 2013-03-05 23:37:11

+0

你發佈的是完全有效的PHP代碼。這不是最好的方法(見奧利的答案),但它是完全有效的。 – BenM 2013-03-05 23:39:04

回答

5

您可以使用switch語句的整潔的代碼看起來:

 

switch($_SESSION['lang']) { 
    case 'it': 
     include(..); 
     break; 
    case 'en': 
     include(..); 
     break; 

    etc.. 
} 
 

看到http://php.net/manual/en/control-structures.switch.php

+0

對不起,我的問題不是非常清楚,這很難解釋,我已經很困惑,我很難在英文中具體。謝謝你的回答,所以如果我得到它的權利,交換機結構是一個類似於elesif語句的鏈但更像一個鏈條。我會看看手冊,非常感謝。 – mikker 2013-03-05 23:46:48

0

使用會話,你總是要打電話session_start(),無論你是初始化會話或者只是恢復它,所以把它從你的陳述中拿出來放在你的頁面上。此外,我不完全明白你想要達到什麼目的,或者什麼失敗。

+0

現在好了我認爲它應該始終開始session_start(); if($ _GET ['lang'] =='fr'){ include('fr.php'); session_start(); $ _SESSION ['lang'] ='fr'; } – mikker 2013-03-05 23:48:55

+0

是的,那麼爲什麼不把它放在if/switch-statement之上呢?這樣,你不必爲每個案例重複一遍。 – Rick 2013-03-05 23:55:16

+0

這就是我最先做的,但因爲它沒有改變任何我確信它失敗。 – mikker 2013-03-06 00:02:07

1

我在這裏注意到的第一件事是,有很多重複的代碼,並且本質上是從多個位置進行查找。如果你重構你的代碼,你可以消除很多複雜性。下面是一個簡單得多的方式做同樣的事情:

<?php 

define('DEFAULT_LANG', 'fr'); 
$lang_inc = array(
    'fr' => 'fr.php', 
    'en' => 'gb.php', 
    'it' => 'it.php', 
); 

session_start() 

if ($_GET['lang'] && array_key_exists('lang', $_GET)) { 
    $lang = $_GET['lang']; 
} elseif ($_SESSION['lang'] && array_key_exists('lang', $_SESSION)) { 
    $lang = $_SESSION['lang']; 
} else { 
    $lang = DEFAULT_LANG; 
} 

$lang_file = $lang_inc[$lang]; 
include($lang_file); 

$_SESION['lang'] = $lang; 
+0

謝謝我試圖用數組來實現它,但它起初並不奏效,因爲你給了我現在的方式,現在我會像你一樣再試一次,非常感謝,再次抱歉,不是很清楚。我沒有現在你可以像這樣格式化:if($ _GET ['lang'] && array_key_exists('lang',$ _GET)){ – mikker 2013-03-05 23:55:18

+0

我的PHP是一個很大的生鏽,我認爲正確的寫法可能會如果(isset($ _ GET ['lang'])&& array_key_exists(...'看看這個值是否存在。這個想法仍然是一樣的。 – 2013-03-06 00:16:52

+0

謝謝你所有的答案,我設法讓它現在工作它真的幫助我理解結構,這個錯誤甚至不是來自這段代碼,而是來自另一個相關的頁面menulang.php,我稱之爲會話「我現在是noob」..但現在我會嘗試你的代碼重複性更低,並且它更乾淨,並感謝你分享的資源。 – mikker 2013-03-06 00:19:02

0

我不認爲有需要的if/else或開關,因爲所有你做的是包括一個文件,該文件名的動態部分已經在語言變量中定義。

除非明確定義$ _GET ['lang'],否則您也不應該重置$ _SESSION ['lang']。

根據lang值,這會更有效,並且少於使用if/else或switch條件的代碼的一半。

<?php 
session_start(); 

// Only set $_SESSION[$lang] if it is not set 
// or if $_GET['lang'] is explicitly defined 
if (isset($_GET['lang']) || !isset($_SESSION['lang'])) { 

    // Array of allowed languages 
    $allowed = array('fr', 'en', 'it'); 

    // Set fr to default if lang isn't defined or not allowed 
    $_SESSION['lang'] = isset($_GET['lang']) && in_array($_GET['lang'], $allowed) ? $_GET['lang'] : 'fr'; 
} 

// dynamically include file 
include($_SESSION['lang'] . '.php'); 
+0

謝謝你,這是一個非常好的方式,比我所做的要簡單得多。 – mikker 2013-03-06 00:20:12