0

HTMLフォーム(メソッド - ポスト)に複数の選択要素があります。$songs 配列を順序付きリストに変換したい。

<select name="songs" multiple>
  <option>song 1</option>
  <option>song 2</option>
  <option>song 3</option>
  <option>song 4</option>
  <option>song 5</option>
  <option>song 6</option>
  <option>song 7</option>
  <option>song 8</option>
  <option>song 9</option>
  <option>...</option>
</select>

次のphpコードを書きました

 $songs = test_input($_POST["songs"]);
 foreach ($songs as $song) 
 {
   $songs .= "<li>$song</li>";
 };

 $songList = "Songs: <ol> $songs </ol> \r\n";
 echo $songList;

 function test_input($data)
 {
      $data = trim($data);
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      return $data;
 }

しかし、それは私にエラーを与えますInvalid argument supplied for foreach()

foreach()このループの何が問題なのか誰か教えてください


関数 test_input() がString代わりに返される場合、順序付きリストArrayに変換するにはどうすればよいですか?$songs

4

3 に答える 3

1

以下が機能するはずです。

<?php
$songs = $_POST["songs"];
//$songs = Array("one","two","three");
foreach ($songs as $song) 
{
   $songStr = test_input($song);
   $songsOut .= "<li>$songStr</li>";
};

$songList = "Songs: <ol> $songsOut </ol> \r\n";
echo $songList;

function test_input($data)
{
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}

?>

test_input()、配列自体ではなく、配列内の各項目に対して個別に呼び出す必要があります。

投稿データが実際に配列であると確信していますか? get string を使用してコードをテストしました (ブラウザ バーに入力できるようにするため)。次の構文が必要です。

http://localhost/songs.php?songs[]=one&songs[]=two&songs[]=three

foreachエラー メッセージは、値の配列を返さない $POST 関連付け配列を説明します。コードの 2 行目のコメントを解除すると、これをデバッグするのに役立ちます。$POST を生成するコードを投稿すると、それも確認できます。

編集 - 複数選択要素の名前を変更するとうまくいくようです:

<select name="songs[]" multiple>
  <option>song 1</option>
  <option>song 2</option>
  <option>song 3</option>
  <option>...</option>
</select>

参照:配列への複数選択

于 2013-10-26T16:57:55.060 に答える
0

これは、$songsループするときに変更しているためです。html 文字列には別の変数を使用する必要があります。

 $songs = test_input($_POST["songs"]);
 $html = '';
 foreach ($songs as $song) 
 {
   $html .= "<li>$song</li>";
 }

 $songList = "Songs: <ol> $html </ol> \r\n";
 echo $songList;
于 2013-10-26T16:34:43.490 に答える
0

test_input($_POST["songs"]);あなたのコードは完璧です。test_input($_POST["songs"]);ただし、配列を返す必要があります

$songs関数を使用して配列かどうかを確認しますis_array()

$songs = array('a','b');
    if (is_array($songs))
    {
         foreach ($songs as $song) 
         {
           $songs .= "<li>$song</li>";
         }
    }else{
     echo "its not an array";
    }
$songList = "Songs: <ol> $songs </ol> \r\n";
echo $songList;`  //output:  Songs: <ol> Array<li>a</li><li>b</li> </ol> 
于 2013-10-26T16:38:18.230 に答える