2011-04-19 11 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

+0

"6つの新しい回答が掲載されました" ..簡単な解析エラーの人を捕まえることができます:p –

+2

'trim'(addslashes($ _ POST ['Desc _'。$ l)); ' – diEcho

答えて

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()コールの終了時に)を欠く中括弧とyou'rで囲む必要があります。

だけ$item->{'Desc_'.$l} = ...$item->Desc_{$l} = ...の違い強調表示する:

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

はパーサで軽率であるように思わこれは実際には同じである

//... 
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])); 
} 
print_r($item); 
// outputs: 
/* 
stdClass Object 
(
    [IDCat] => 1 
    [Desc_IT] => a 
    [Desc_EN] => a 
    [Desc_FR] => a 
) 
*/ 

を。

+0

ひどいことではなく、代替配列アクセス構文(文字列オフセットアクセスのために主に使用されていましたが、現在は廃止予定です)。 – NikiC

+0

@nikic:文字列アクセサーとして使用されていました。 ..それが代替配列アクセサとして使用されたことを知らなかった。その情報をありがとう –

0

あなたの問題は、あなたが巻き毛の引用符の中に式全体をラップする必要があります代わりに

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

$item->{'Desc_'.$l} = trim(addslashes($_POST['Desc_'.$l]); を試してみてください$item->Desc_{$l} = trim(addslashes($_POST['Desc_'.$l]); である場合は、次の言語のセットが起こっているとして見て、しかし{"Desc_".$l}

代わりにこのために配列を使用することを検討してください:

$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

+1

'trim()'コールの後にまだ ')'がありません... ;-) –

+0

@Stefanありがとう! @ママ本当、よりよく見える。一定。 –

0

はして試してみてください。

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