2011-04-19 82 views
1

這樣做的正確方法是什麼?
它給我一個錯誤:PHP變量問題

$lingue  = array('IT','EN','FR'); 
$item   = new stdClass(); 
$item->IDCat = 1; 

foreach($lingue as $l){ 
    $item->Desc_{$l} = trim(addslashes($_POST['Desc_'.$l]);  
} 
+2

什麼錯誤yougetting? – Nanne 2011-04-19 10:28:38

+0

「6個新答案已發佈」..大聲笑肯定趕上簡單的解析錯誤球員:p – 2011-04-19 10:31:39

+2

在'trim(addslashes($ _ POST ['Desc _'。$ l]);' – diEcho 2011-04-19 10:32:03

回答

0
$lingue  = array('IT','EN','FR'); 
$item  = new stdClass(); 
$item->IDCat = 1; 
foreach($lingue as $l){ 
    $item->{'Desc_'.$l} = trim(addslashes($_POST['Desc_'.$l])); 
} 

動態訪問必須用大括號和找你在trim()通話結束時缺乏)包圍。

只是爲了突出$item->{'Desc_'.$l} = ...$item->Desc_{$l} = ...之間的區別:

//... 
foreach($lingue as $l){ 
    $item->{'Desc_'.$l} = trim(addslashes($_POST['Desc_'.$l])); 
} 
print_r($item); 
// outputs: 
/* 
stdClass Object 
(
    [IDCat] => 1 
    [Desc_IT] => a 
    [Desc_EN] => a 
    [Desc_FR] => a 
) 
*/ 

//... 
foreach($lingue as $l){ 
    $item->Desc_{$l} = trim(addslashes($_POST['Desc_'.$l])); 
} 
print_r($item); 
// outputs: 
/* 
stdClass Object 
(
    [IDCat] => 1 
    [Desc_] => Array 
     (
      [IT] => a 
      [EN] => a 
      [FR] => a 
     ) 

) 
*/ 

這其實是一樣的

//... 
foreach($lingue as $l){ 
    $item->Desc_[$l] = trim(addslashes($_POST['Desc_'.$l])); 
} 

似乎是在解析器的輕率。

+0

不是一種輕率,只是替代的數組訪問語法(它主要用於字符串偏移訪問,但現在正在棄用) – NikiC 2011-04-19 10:48:31

+0

@nikic:我知道它被用作字符串存取器。 ..不知道它被用作替代數組訪問器,感謝那些信息。 – 2011-04-19 10:50:36

0

如果你的問題是與$item->Desc_{$l} = trim(addslashes($_POST['Desc_'.$l]); 嘗試$item->{'Desc_'.$l} = trim(addslashes($_POST['Desc_'.$l]); 代替

0
$varName = 'Desc_'.$l; 
$item->$varName = trim(addslashes($_POST['Desc_'.$l]); 
2

您將需要整個表達式包裝到彎引號:{"Desc_".$l}

然而,看到了一套語言是怎麼回事爲動態,請考慮使用Array來代替:

$item = new STDClass(); 
$item->Desc = new Array(); 

foreach($lingue as $l){ 
    $item->Desc[$l] = trim(addslashes($_POST["Desc_$l"])); 
} 

echo $item->Desc["IT"]; // outputs the italian description 

補充意見:

請注意,如果您打算在數據庫查詢中使用這些值,則addslashes()不足以防止SQL注入。使用您正在使用的SQL庫的字符串轉義函數。

使用$_POST["Desc_xyz"]而不檢查其設置是否會拋出您希望避免的PHP通知。考慮增加一個檢查:

if (!empty($_POST["Desc_$l"])) 
$item->Desc[$l] = trim(addslashes($_POST["Desc_$l"])); 
+0

或者只是'$ item - > {「Desc_ $ l」}'和'$ _POST [「Desc_ $ l」]'簡稱 – mario 2011-04-19 10:32:15

+1

'trim()'調用後仍然缺少')';-) – 2011-04-19 10:35:02

+0

@Stefan謝謝! @mario真實,看起來更好。固定。 – 2011-04-19 10:35:36

0

嘗試:

$item->{'Desc_' . $l} = ....