1

$ _GETから値を取得するphpページがあり、この値に従って多次元配列のさまざまな値を選択します

$data =
array(
     "index" => array(
         "name" => "title",
         "title" => "<img src = 'logo.png' alt=''>",
         "fallback_html" => "main.php",
         "gallery" => array("1" => "nothing")),
     "gallery1" => array(
         "name" => "gallery1",
         "title" => "Gallery 1",
         "fallback_html" => "",
         "gallery" => array("1" => "jpg1.jpg","2" => "jpg2.jpg")
     )
);

これがコードです

if(isset($_GET['p'])){
  $page = $_GET['p']; 
} 
else { 
  $page = "index"; 
} 

echo $data[$page]['title'];

そして私はそのような出力を得ています

Notice: Undefined index: 'index' in D:\xampp\htdocs\egliphp\index.php on line 66

$pageの値を「index」または「gallery1」に変更すると問題なく動作します

4

4 に答える 4

4

ロジックは正しいように見えるので、空白と英数字以外の文字の問題である可能性があります。だから私はこれを行うことをお勧めします:

$raw_page = preg_replace('/[^a-zA-Z0-9]+/', '', trim($_GET['p']));
if(!empty($raw_page) && array_key_exists($raw_page, $data)){
  $page = $raw_page; 
} 
else { 
  $page = "index"; 
}

array_key_existsまた、存在しないページまたは配列インデックスに対して行われているリクエストをロジックが処理できるように、を追加しました。

編集:また、配列データに一貫性がありません。ドンアンは次のecho $data['index']['title'];ようになります。

<img src = 'logo.png' alt=''>

しかし、実行するecho $data['gallery1']['title'];と次のようになります。

Gallery 1

だから私はあなたもそれを解決する必要があると思います。

混合配列値スタッフに関する追加情報の編集:さて、プログラミングの観点から、配列が値に対して混合値型を持っている方法にはまだ問題があります$data['title']。私はそれが起こるのを待っている問題として見ています。したがって、$data配列構造を次のように作り直すことをお勧めします。

$data =
array(
     "index" => array(
         "name" => "title",
         "title" => array("type" => "image", "value" => "<img src = 'logo.png' alt=''>"),
         "fallback_html" => "main.php",
         "gallery" => array("1" => "nothing")),
     "gallery1" => array(
         "name" => "gallery1",
         "title" => array("type" => "text", "value" => "Gallery 1"),
         "fallback_html" => "",
         "gallery" => array("1" => "jpg1.jpg","2" => "jpg2.jpg")
     )
);

具体的に$data["index"]["title"]は、画像タグのあるにこれを行いました。

"title" => array("type" => "image", "value" => "<img src = 'logo.png' alt=''>"),

そして、これ$data["gallery1"]["title"]はテキスト文字列を持っています:

"title" => array("type" => "text", "value" => "Gallery 1"),

これは、レンダリング側でそれぞれのケースをより適切に処理するのに役立ちます。したがって、次のようなコードを作成できます。

if ($data["gallery1"]["title"]["type"] == "image") {
  echo $data["gallery1"]["title"]["value"] . "<br clear="all" />";
}
else if ($data["gallery1"]["title"]["type"] == "text") {
  echo "<h1>" . $data["gallery1"]["title"]["value"] . "</h1>";
}

上記の例は、データソースでタイプにタグを付けると、レンダリング時にタイプごとに異なることを実行できることを示しています。大変な作業だと感じたら、それは公平です。しかし、値にデータ型を混在させることは、それらを明確に区別するための何らかの方法がなければ、決して良い考えではありません。

于 2013-01-26T19:00:43.010 に答える
1

var_dumpが提供するものを確認してください

var_dump(isset($_GET['p']));

ただし、許可された値の配列を作成することをお勧めします

$allowed_vals = array_keys($data);

次に、in_array()関数を使用します

if(in_array($_GET['p'], $allowed_vals )){
...
else
....
于 2013-01-26T19:03:23.383 に答える
0

$ data配列は、「$ page」処理コードと同じドキュメントで定義されていますか?(あなたの質問から完全に明確ではありません)。念のため、次のコマンドを使用してデバッグし、$ data配列が存在し、要求された「インデックス」キーが含まれているかどうかを確認します。

// Just to check if the $data array actually exists and contains the 'index' key:
print_r($data);exit();

if(isset($_GET['p']) && array_key_exists(trim($_GET['p']), $data)){
  $page = trim($_GET['p']); 
} 
else { 
  $page = "index"; 
}

[更新]最後の行によると、$ data配列が存在する必要があるため、$ _ GET配列をデバッグすることは、「p」エントリと適切な値が含まれているかどうかを確認するための適切なオプションです。

print_r($_GET);
于 2013-01-26T19:08:59.233 に答える
0

これを試して

  $page = "$_GET['p']";
于 2013-01-26T19:11:24.693 に答える