2012-02-24 14 views
0

同じ問題が以前に議論されていましたが、ヘッダー機能を呼び出す前に空白をブラウザに送ることはできません。私はここで間違っている、私は前にHTMLのdivタグを印刷しているので、ソリューションはちょうどすべてが私がしたいと働くように基本的な戦略に従っている! FYI、AJAX(Using jQuery)では、JSONエンコードされた出力をPHPスクリプトからレスポンスとして返すだけで済みます(結果の一部またはエラーが表示される可能性があります)。しかし、それは検索ページなので、私はURLのsearch_queryのためのURL書き換えのようなユーザーに施設を利用していますので、ユーザーが望むならばフォームを記入する必要はありません。したがって、GETメソッドを使用します。以下は、私のコードは、私がこれを達成しています:FYIPHPのヘッダが期待通りに動作しない

<div class="two-third"> 

         <?php if($_GET['err'] == "no_results_found") { 
          echo "<p class='error-box'>No results found for your query. Please search using different specific keywords.</p>"; 
         } ?> 

         <form method="GET" action="<?php echo BASE_URL; ?>/content.php" id="search_content_form"> 
            <fieldset> 
             <div> 
              <label>Search this site: </label> 
              <input type="text" title="Enter your query" class="form-poshytip" id="search_query" name="search_query" value="<?php echo $search_query; ?>"> 
             </div> 
             <p><input type="submit" id="search_content_submit_button" value="Search Content"></p> 
             </fieldset> 
           </form> 

         <?php if(isset($search_query)) { 

         $query = "SELECT * FROM (

            (SELECT 'event' AS content_type, event_id AS content_id, event_title AS content_title, publishing_time AS content_publishing_time FROM event WHERE event_title LIKE '%".$search_query."%' OR content LIKE '%".$search_query."%') 

            UNION 

            (SELECT 'article' AS content_type, article_id AS content_id, article_title AS content_title, publishing_time AS content_publishing_time FROM article WHERE article_title LIKE '%".$search_query."%' OR content LIKE '%".$search_query."%') 

            ) content_result 

            ORDER BY content_result.content_publishing_time DESC 
            LIMIT 500 
           "; 
         $result = mysql_query($query); 
         if(!$result) { 
          header("location:".BASE_URL."/content.php"); 
         } 
         if(mysql_num_rows($result) == 0) { 
          header("location:".BASE_URL."/content.php?err=no_results_found"); 
         } 

         $i = 0; 
         echo "<div id='search_content_results' class='list'>"; 
         echo "Found <strong>".mysql_num_rows($result)."</strong> result(s) for search query: \"<strong>".$search_query."</strong>\""; 
         while($row = mysql_fetch_assoc($result)) { 
          // extract all needed varaibles from $row 
          $content_type = $row['content_type']; 
          $content_id = $row['content_id']; 
          $content_title = $row['content_title']; 
          $content_publishing_time = $row['content_publishing_time']; 

          echo " 
            <ul> 
             <li><a href='".BASE_URL."/".$content_type."s.php?".$content_type."_id=".$content_id."'>".($i+1).") <strong>".$content_title."</strong> <span style='font-size: 12px; text-decoration: italic;'>(Published On: ".date('M jS Y', strtotime($content_publishing_time)).")</span></a></li> 
            </ul> 
          "; 
          $i++; 
         } 
         echo "</div>"; 
        } 

        ?> 


        </div> 
        <!-- ENDS two-third --> 

:上記の$ SEARCH_QUERYは、上記のコードではすべてがどこかのブロックを除いて動作します$ _GETのエイリアス[ 'SEARCH_QUERY']


ですheader()が呼び出されます。私は前に述べたように理由を知っています。ちょうど私が使用しているIFブロックにあるページの最上部にあるすべてをチェックするのに役立ちます。そして、num_rowsが0より大きいときに検索フォームを表示してエコー出力を表示し、num_rowsの場合は上記のようにエラーを表示しますMySQLクエリの結果は0です。私の貧しい言語(申し訳ありませんが適切なformatingも)私は急いでいるように申し訳ありません。 ;)


EDIT: ロジックは単純です:

  • $ _GET [ 'SEARCH_QUERY']その後、クエリを実行し、同じページにリダイレクト送信後、NUM_ROWS
    • NUM_ROWS == 0をチェックします"?err = example_error_message"を指定してエラーメッセージをフォームの上に表示し、同時に出力結果を出力しないでください。
    • num_rows> 0次に、$行の値を出力します上記のコード
  • ません$ _GET [ 'SEARCH_QUERY']のみ検索フォーム

したがって、これらを達成するために私を助けてください。

+0

私は質問が何であるか不明です。見出しの呼び出しがうまくいかないことは知っていますが、コードを見てみるよう人々に求めていますか? – Jim

+0

だから、それは壊れ、あなたはその理由を知っていますか? –

+0

@ジム:はい、私は解決策を知っていますが、期待通りの結果を得るために私のコードをリファクタリングすることができません。 – Vishal

答えて

2

私はあなたの質問を理解するかどうかは完全にはわかりませんが、とにかくそれを行こうと思います。

PHPのheader関数で作業しているときは、header関数を呼び出す前に出力を書き込まないようにする必要があります。

時にはこれを行うのは難しい場合もあります。これを解決するには、出力バッファリングを使用する必要があります。スクリプトの最初の行にob_start()docs)、最後の行として(またはヘッダー機能を使用した後に)ob_end_flushdocs)またはob_end_cleandocs)を入力します。これによりすべての出力が実質的にバッファリングされ、出力が実際にエコーされる前にヘッダー関数を呼び出すことができます(ob_end_flushまたはob_end_cleanを呼び出すまですべての出力がバッファされます)。

+1

チャームのように働いた!私はこれらの2つの機能を利用する以外は何も変更する必要はありません。 --- また、私の期待通りに上記のコードで 'isset($ search_query)'で 'strlen($ search_query)> 0'をチェックしてください。途中でありがとう。 – Vishal

1

としてだけでなく、ヨリスで述べたようにob_startを使用して、(あなたがやっている正確に何を知っていれば、特定の状況を除いて)Locationヘッダを設定した後、必ずexitまたはdie()に覚えています。

+0

はい、私がしなかった場合、私はそうしたくないものをバッファリングします。これを指摘してくれてありがとう。 – Vishal

関連する問題