header('Location:xx')について

このQ&Aのポイント
  • A画面のPDFダウンロードボタンと戻るボタンの動作について
  • PDFファイルが正しく出力されるが、戻るボタンを押下するとB画面の内容が重複して表示される現象について
  • 共通関数downloadByStreamについて
回答を見る
  • ベストアンサー

header('Location:xx')について

こんにちは、外国人ですから、下記の内容は理解し難いと思ってますが、どうぞよろしくお願いします。 質問: A画面に二つボタンがあります、PDFdownloadボタンと戻るボタン 流れ: (1)A画面のPDFdownloadボタンを押下して、pdfファイルを出力します。 (2)A画面の戻るボタンを押下して、B画面へ遷移します。 現象: pdfファイルが正しく出力しましたが、戻るボタンを押下すると、B画面の内容はA画面の下に縦にダブって表示されました。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー // B画面へ戻る if(isset($_POST["back"])){ header('Location: ./B.php'); goto done; } //PDFを出力する if(isset($_POST["download"])){ if ( isset( $_SESSION["FILEPATH"] ) && $_SESSION["FILEPATH"] != "" && isset( $_SESSION["FILENAME"] ) && $_SESSION["FILENAME"] != "" ) { downloadByStream( $_SESSION["FILEPATH"]."\\".$_SESSION["FILENAME"], $_SESSION["FILENAME"] ); } } done: 関数downloadByStreamは共通関数で管理しています。 function downloadByStream($filename, $title) { $ua = $_SERVER ["HTTP_USER_AGENT"]; $file = $filename; header ( "Cache-Control: public" ); header ( 'Pragma:public' ); if (! preg_match ( "/Firefox/", $ua )) { header ( "Content-Type: application/force-download; charset=Shift_JIS;" ); $title = mb_convert_encoding( $title, 'SJIS-win', 'auto'); $file = mb_convert_encoding( $file, 'SJIS-win', 'auto'); } header ( "Content-Transfer-Encoding: binary" ); header ( 'Content-Disposition: attachment; filename="' . $title . '"' ); header('Content-Length: '.filesize($file)); readfile($file); flush(); ob_flush(); } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー どうぞよろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 1minn
  • ベストアンサー率57% (52/90)
回答No.1

B.phpの中身がわかんないので明確ではないかもしれませんが・・・ header('Location: ./B.php'); の後にgoto使ってますが、これはreturnじゃだめですか? というか、B.phpへ遷移させたいのであれば、以下の処理は不要だと思いますのでdone: 以降にどんなロジックがあるかはわかりませんが、無駄のように思います。 phpでgoto文使ってるの初めてみました。5.3から使えるんですね。

pancanming
質問者

お礼

ご回答ありがとうございました。 原因がわからないですが、この障害が再現できませんでした。 ※こちらのphpバージョンは5.3.8です。

関連するQ&A

  • 環境をかえたら header(Location:)に不具合が?

    ローカル環境からWEBサーバに作ったPHPファイルを移動させたのですが、 header(Location:)がうまく動かなくなってしまいました。 アドレスがおかしいのかと思って いくつか試してみたんですが ファイルによってうまく行くのと行かないのがあるようです。 傾向としては $chkに5が入っていたら test.phpに移動する。 if($_SESSION['chk'] != '5'){  header('Location: ./test.php');  exit; } はうまく動くのですが ifでいくつか処理を行ったあとに if(isset($_POST('submit')){  いくつかの処理  header('Location: ./login.php'); } とするとうまく動かないという状態です。 どのようなケースが考えられるでしょうか アドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP CSV 出力

    失礼します。 現在PHPで指定したパスに置いてあるCSVを出力したいのですが、 CSVは出力できているのですが、HTMLが先頭に入ってしまいます。 htmlファイルに設置したボタンに対して phpファイルで処理をしています。 どこかおかしい部分があればご教授頂きたいです。 HTMLファイル <?php $self = $_SERVER["SCRIPT_NAME"]; ?> <form method='POST' action='<?php $self ?>'> <input type='submit' value='CSV出力' name='get_csv'> </form> PHPファイル function This_Month(){ $filepath = 'hoge.csv'; //ダウンロードしたいファイルパス $filename = 'test.csv'; //ダウンロードした際のファイル名 if(!file_exists($filepath)){ die("Error:File(".$filepath.") does not exist"); } //オープンできるか確認 if(!($fp = fopen($filepath,"r"))) { die("Error:Cannot open the file(".$filepath.")"); } fclose($fp); //ファイルサイズの確認 if(($content_length = filesize($filepath)) == 0){ die("Error:File size is 0.(".$filepath.")"); } //ファイルの処理方法 header('Content-Disposition: attachement; filename="'.$filename.'"'); //ファイルタイプ指定 header('Content-Type: application/octet-stream'); header('Content-Transfer-Encoding:binary'); //ファイルサイズ header('Content-Length: '.filesize($filepath)); mb_convert_encoding($filepath,'utf-8','shift-jis'); readfile($filepath); exit(); } //ボタンに合わせて条件を変えていく if(isset($_POST["get_csv"])){ //ユーザーから来たデータをエスケープする $csv_output = htmlspecialchars($_POST["get_csv"], ENT_QUOTES, "UTF-8"); switch ($csv_output) { case "CSV出力": ”This_Month();  break; default: echo "エラー"; exit; } }

    • ベストアンサー
    • PHP
  • header location が飛びません。

    お世話になります。 header location がなぜが飛びません。 お分かりになる方ご教授お願いいたします。 ・<?php の前にはスペースなどを入れておりません。 ・エラー表示にはなりませんが、飛びません。 <?php session_save_path("sess"); session_name("deri_user"); session_start(); require("class/User.class.php"); $end=null; if($_POST[submit]=="送信"){ if(session_is_registered("sesdata1")){unset($_SESSION[sesdata1]);session_register("sesdata1");} if(session_is_registered("sesdata2")){unset($_SESSION[sesdata2]);session_register("sesdata2");} $_SESSION[sesdata1]=htmlspecialchars($_POST[user_name]); $_SESSION[sesdata2]=htmlspecialchars($_POST[user_pass]); $user=new User(); $usn=$user->owner_name(); $usp=$user->owner_pass(); if(trim($usn)==trim($_SESSION[sesdata1]) and trim($usp)==trim($_SESSION[sesdata2])){ header('location:./kanri_gamen.php'); exit(); }else{ $end= "<br>ユーザー名又はパスワードが正しくありません。"; } $user->__destruct(); } ?> <html lang="ja"> <head> <title></title> </head> <body> <center> <h3>管理者ログイン画面</h3> <form action="user_login.php" method="post"> <table style="border:3px ridge #333333"> <tr> <td>名前 </td> <td> <input type="text" name="user_name" size="20"> </td> </tr> <tr> <td>パスワード </td> <td> <input type="text" name="user_pass" size="20"> </td> </tr> <tr> <td colspan="2" style="text-align:center"> <input type="submit" name="submit" value="送信"> </table> </form> <?=$end?> </center> </body> </html>

    • ベストアンサー
    • PHP
  • PHPで複数ファイルのダウンロード

    はじめまして、PHPについて質問させていただきます。 PHPでファイルを複数ダウンロードできるようしたいと思っています。 色々調べ、header関数を使用し、以下のように記述すると ファイルのダウンロードは成功しました。 /*****************************************/ // ダウンロードさせる元ファイル(絶対パス) $filepath = 'test_01.pdf'; // 保存時のファイル名(デフォルト) $filename = 'download001.pdf'; // HTTPヘッダ送信 header("Content-length: " . filesize($filepath)); header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=\"{$filename}\""); // ファイルを読み込んで出力 readfile($filepath); /*****************************************/ 一つのファイルのダウンロードに成功したので、 次に複数のファイルを順番にダウンロードをさせる為にループ処理をしました。 /*****************************************/ //配列 複数ファイル $downfile = array("test_01","test_02","test_03"); //データ数 $max = count($downfile); // ダウンロードさせるディレクトリ(絶対パス) $filepath = "/home/sites/www.eshop-himawari.com/web/test_nihon/form_down/file/"; // 保存時のファイル名(デフォルト) $filename = "download"; $filetype = ".pdf"; $kazu = 1; //ループ処理 for( $i = 0; $i < count( $max ); $i++ ){ $downpath = $filepath.$downfile[$i].$filetype; $filename = $filename.$kazu.$filetype; $kazu = $kazu++; // HTTPヘッダ送信 header("Content-length: " . filesize($downpath)); header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=\"{$filename}\""); // ファイルを読み込んで出力 readfile($downpath); // $fp = fopen( "$downpath", "rb" ); // @fpassthru( $fp ); } /*****************************************/ しかし実行すると最初のファイルはダウンロードしますが 2つ目からのファイルはダウンロードされませんでした。 きちんとループ処理をされて、2つ目以降のファイルをダウンロード するには、どうすればいいのでしょうか?

    • 締切済み
    • PHP
  • ダウンロードが機能しない。

    html,php共に初心者です。教えて頂けますか? ダウンロードボタンを押すと、以下のphpファイルを開きダウンロードを行う様にしたのですが、mac safari ではダウンロード出来たのですが、 windows IE では ダウンロード出来ませんでした。 ファイルの構成は以下です。 /www/category/contentsList.php <-ダウンロードボタンがあります /www/category/downloader.php <-ダウンロードボタンを押すと呼ばれます。 /contentDirectory/ダウンロードするファイル.zip downloader.phpの記述は以下のみです。 <?php $serverDirectory = dirname($_SERVER['DOCUMENT_ROOT']); $contentDirectory = $_POST['contentDirectory']; $fileName = $_POST['fileName']; $filePath = $serverDirectory.'/'.$contentDirectory.'/'.$fileName; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$fileName.'"'); header('Content-Length: '.filesize($filePath)); readfile($filePath); ?> どうすれば良いでしょうか? 大変申し訳ありません。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 画像をダウンロードさせたい。

    いろいろなファイルがサーバーにあがっているとして、 その一覧が<a href="">ファイル名</a>で表示されているとします。 ファイル名を押下した時にダウンロードさせたいと思っています。 -------------------------------------------------- header("Content-Disposition: inline; filename=".$fileDlName); header("Content-Length: ".$fileDlSize); header("Content-Type: application/octet-stream"); readfile($filePath) ------------------------------------------------- ↑でCSV,PDF,ZIPファイルなどはダウンロードできるようになりました。 が、JPEG,GIF,PNGなどはブラウザに表示されてしまい ダウンロードできません。 画像も強制でダウンロードさせたいのですがよい方法はありますか?? ブラウザ:IE7 PHP:5.2.3 Apache:2.0.59 以上、よろしくお願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • header("Location: mailto:

    header("Location: mailto: でメーラを開く時、本文を改行させたらエラーになるのですが、回避する方法はありませんか? <?php // 送信ボタンが押されたら if (isset($_POST["submit"])) { $wk_adrs = "web@test.sakura.ne.jp"; $wk_subject = "サブジェクト"; // これはOK $wk_body = "ボディー"; // これはNG $wk_body = "1行目ボディー".PHP_EOL."2行目ボディー"; // これもG $wk_body = <<< EOM 1行目ボディー 2行目ボディー EOM; // 画面遷移させる $wk_Location="Location: mailto:".$wk_adrs."?subject=".$wk_subject."&body=".$wk_body; header($wk_Location); exit; } ?> 下記のメッセージが出る Warning: Header may not contain more than a single header, new line detected in

    • ベストアンサー
    • PHP
  • 子ウィンドウを閉じる

    今、チェックボックスにチェックを入れると javascriptで子ウィンドウを開き pdfファイルをダウンロードできるようにしています。 ********************************* check.html でのjavascript function down() { if (document.f1.file001.checked == true) { newwin = window.open( "down.php?date=data1" ,"_blank","width=100,height=100"); } if (document.f1.file002.checked == true) { newwin = window.open( "down.php?date=data2" ,"_blank","width=100,height=100"); } if (document.f1.file003.checked == true) { newwin = window.open( "down.php?date=data3" ,"_blank","width=100,height=100"); } if (document.f1.file004.checked == true) { newwin = window.open( "down.php?date=data4 ,"_blank","width=100,height=100"); } } ************************************ 子ウィンドウで開く down.php <?php //ダウンロードするファイル $files = $_GET[date]; //ディレクトリ名 $datedir = "file/"; //拡張子 $filetype = ".pdf"; // ダウンロードさせる元ファイル $filepath = "{$datedir}{$files}{$filetype}"; // 保存時のファイル名(デフォルト) $filename = "{$files}{$filetype}"; // HTTPヘッダ送信 header("Content-length: " . filesize($filepath)); header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=\"{$filename}\""); // ファイルを読み込んで出力 readfile($filepath); fclose($filepath); ?> *************************** これだとファイルのダウンロードはできるのですが 子ウィンドウが残ってしまいます。 javascript で setTimeout("newwin.close()", 8000); と子ウィンドウを閉じるようにしていても 閉じてくれません。 どうすれば、子ウィンドウを閉じることができるでしょうか? また閉じれない場合は、子ウィンドウに閉じるボタンを つけたいのですが down.php には header関数でファイル出力をしている為 その後にhtmlを書いても無効になります。 親ウィンドウの方から子ウィンドウに文字を出させることは できるでしょうか?

  • header(Location:~)で$_SESSION[" "]が保持されない。

    自宅サーバー(apache2+php5+mysql5)のlocalhost環境で、 header(Lcation:~)の記述をすると、 セッションが保持されない現象が起きています。 本番環境のレンタルサーバーは、同じ記述で、 しっかりとセッションが保持されます。 この原因は、何でしょうか? php.iniの設定など、何か考えられることがあれば、 是非教えて下さい。 【やりたいこと】 ■a.php **************************************** <?php echo<<<EOD <form method="POST" action="./b.php"> <INPUT type="text" name="test"> <INPUT type="submit" name="Submit" value="確認画面へ"> </form> EOD; ?> ■b.php **************************************** <?php $_SESSION["test"]=$_POST["test"]; header("Location:./c.php"); ?> ■c.php **************************************** <?php echo $_SESSION["test"]; ?> 自宅サーバーだと、 a.phpで入れたデータが、c.phpで表示されません。 レンタルサーバーだと、 セッションが保持され、表示されます。

    • ベストアンサー
    • PHP
  • header()を使用しCSVファイルの生成はできましたが・・・

    現在、 server:Red Hat Linux Advanced Server 2.1 Apache:Apache1.3.23(Red-Hat RPM) php:4.3.7 DB:Oracle9i 上記の環境にてWEBシステムの開発を行っています。 CSVをユーザー側へダウンロードまで の処理に問題はないのですがボタン自体、検索画面 上に設置している為、ダウンロードボタン押下後に、 別ボタン(例えば検索ボタンなど・・)を押下すると 再度CSVダウンロードのダイアログが表示されてしまう 障害が発生して困っています。 現状把握してる範囲は (1)F5などリロードすると解消されます。 (2)herder()関数でキャッシュをno-cacheに設定しても駄目。 イメージ的にはherder()関数が原因かな?程度しか わかりません。サイトで調査もしましたが、 宣言したherder()自体を初期化するような事って できるのでしょうか? 以下抜粋したソースを添付します。 宜しくお願いします。 //検索結果をCSV形式に保存 if ($_POST["H_OutPutCsv"] == "OutPut"){ //←ダウンロードボタンが押下された時のみ処理 header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=output.csv");

    • 締切済み
    • PHP

専門家に質問してみよう