2016-10-25 7 views
0

私はPHPをLynda.comのコースと一緒に学習しています。構築されているウェブサイトでは、ナビゲーションメニューはデータベースに「件名」と「ページ」を照会してから表を作成することによって作成されます。配列やヌルの変数を比較すると、PHPの "不正な文字列オフセットの警告"が表示されないようにする

これらの「件名」と「ページ」はそれぞれ、ID番号を$ _GETに送信してページを更新し、特定のコンテンツを読み込むリンクです。問題は件名配列かページ配列が常にnullになることです(一度に1つのタイプしかクリックできないため)。これは、ウェブページが常に「不正な文字列オフセット警告」をスローする原因となっています。

if (isset($_GET['subj'])) { 
    $sel_subject = get_subject_by_id($_GET['subj']); 
    $sel_page = "NULL"; 
} elseif (isset($_GET['page'])) { 
    $sel_page = get_page_by_id($_GET['page']); 
    $sel_subject = "NULL"; 
} else { 
    $sel_subject = "NULL"; 
    $sel_page = "NULL"; 

これは.phpの先頭にあり、少なくとも1つの変数が配列ではなくNULLであることを示しています。

$subject_set = get_all_subjects(); 

while ($subject = mysqli_fetch_array($subject_set)) { 
    echo "<li"; 
    if ($subject['id'] == $sel_subject['id']) { 
     echo " class =\"selected\""; 
    } 
    echo "><a href=\"content.php?subj=" . urlencode($subject['id']) . 
    "\"> 
    {$subject["menu_name"]}</a></li>"; 

    $page_set = get_pages_for_subject($subject['id']); 

    echo "<ul class=\"pages\">"; 

    while ($page = mysqli_fetch_array($page_set)) { 
     echo "<li"; 
     if ($page['id'] == $sel_page['id']) { 
      echo " class =\"selected\""; 
     } 
     echo "><a href=\"content.php?page=" . urlencode($page["id"]) . "\">  {$page["menu"]}</a> </li>"; 
    } 
    echo "</ul>"; 
} 

これは、ナビゲーションメニューを生成するコードの一部です。 ifステートメントの1つは、常にnullの変数から配列値を取得しようとします。

何か間違っていますか?これは、サイトのナビゲーションメニューを作る本質的に悪い方法ですか?私が使用しているコースは古く、おそらくPHPプログラミングによってこのメソッドは時代遅れになっています。

+0

まずOR条件を使用し、次にどの条件が設定されているかを判断します。 if(is_array($ var)またはis_null($ var)){} else {} '? –

+0

' if(isset($ _ GET ['subj']) ? – RamRaider

答えて

2

私はの巨大なファンです()。私は、それが空の文字列またはnullとして設定されていることをissetが教えてくれるのを気にしません。文字列でも配列でも、データがあるかどうかを知りたい。

あなたのisset呼び出しを!空()

if (! empty($_GET['subj'])) { 
    // 
} elseif (! empty($_GET['page'])) { 
    // 
} else { 
    // 
} 

また、ユーザーから直接入力していないことを確認してください。これらの_GET変数が整数であることがわかっている場合は、使用する前にそれらを消去してください。

$page_id = (integer) $_GET['page']; 
if (! empty($page_id) { 
    // check it out, they can't send us junk anymore! 

整数でない場合は、それらを使用する前に確認するためのより分かりやすい方法が必要です。しかしそれは別の質問ですね。

関連する問題