• 締切済み

PHPでWarning(Cannot modify header information - headers already sent..

初めまして!PHP初心者です。 PHPとMySQLを使ってプログラムを作成しています。 昨日から、 PHP Warning: Cannot modify header information - headers already sent by (output started at /srv/htdocs/Common/add_comment.php3:251) in /srv/htdocs/Common/add_comment.php3 on line 260, referer: http://Pewit3/add_comment.php3?STRNUMBER=11747 というメッセージが、"時々"出ます。 理解出来ないのが、出る時と出ない時があるという点で、指摘されてるソースの部分は以下の通りです。 249: $result = mysql_db_query(DATABASE,"SELECT STRNO, TEXT FROM SOLUTION WHERE STRNO=$STRNUMBER;"); 249: if ($result) { 248: print "<PRE>\n"; 249: while ($row = mysql_fetch_array($result)) 250: { 251: printf("%s\n",$row["TEXT"]); 252: } 253: print "</PRE>\n"; 254: mysql_free_result( $result ); 255: } 256:} 257: 258:if ($COMMENT_ADDED && empty($SUCCESS)) { 259: $url_append="?STRNUMBER=$STRNUMBER&SUCCESS=1"; 260: header("Location: ".$_SERVER['PHP_SELF'].$url_append); 261:} <?php と ?>の前後にスペース、またはタブはありません。 何かヒントを頂けたら幸いです。

  • PHP
  • 回答数2
  • ありがとう数3

みんなの回答

  • nicolish
  • ベストアンサー率72% (13/18)
回答No.2

見るのはそこではない。 最初の行が実行され、かつ($COMMENT_ADDED && empty($SUCCESS))が真となる条件があるかどうかのチェックが必要。だから、最初の行が実行される条件と、この2変数への代入がどこでどう行なわれているかを追う必要がある。 たとえSELECTで返ってくる結果が空だろうと、テーブルが空だろうと、SELECT文が文法的に正しくテーブル定義と一致している限り、mysql_db_queryの結果は常にfalse以外の何かになる。 つまり、一行目が実行されればif($result)は常に成立する(DBが落ちたりDB定義を変更したりしない限りは)。SELECT結果が0件でもな。 するとprint "<PRE>\n";は実行されるので、つまり少なくとも"<PRE>\n"は出力される。これが出力されてしまったあとにheader関数が呼ばれたら、その時点でWarningになる。 DBカラムの中身の精査は不要。STRNOやTEXTの中身がテキストだろうと数値だろうとバイナリだろうとENUMだろうと悪魔だろうと、そんな事は(少なくとも提示された部分では)このエラーとは一切関係ない。 デバッグするなら、headers_sent関数を使い、既に出力があった場合には最後から2行目のheader関数が実行されないようにしてWarningを防いでおく。と同時に、headerの前のどこで出力が起きたのかと、実際に出力された内容をチェックする(ついでに俺なら$_REQUESTを丸ごとログに出力しておく)。 この部分以外で出力がある事も考えられるわけだが、この方法なら原因を突き止めるための情報が手に入るはず。 ついでにちょっと書き換えて、実際に実行されたSQLクエリも記録すると完璧かな。前述の通り、実行内容が何だろうとそうそう問題は起きないはずなのだけれど。 それと、今回の問題とは直接関係ないのだが、SQLインジェクション脆弱性の匂いがする。$STRNUMBERに'1 OR 1=1'という文字列が入ってきたら全件出力される、とか。 どこかで$STRNUMBERが数値のみで構成されていると検証しているならば問題はないのだが。

Snowgirl88
質問者

お礼

nicolishさん、またまた素早い回答を本当にありがとうございます! 先ほどのプログラムの補足をさせてください。 先ほど記述したSQL文の前に、もう1つSQL処理をしています。 $result = mysql_db_query (DATABASE,"SELECT COMMENT,STATUS FROM DFSCOMMENTS WHERE STRNO=$STRNUMBER AND STATUS !=\"incorporated\";"); if ($result) { print "<PRE>\n"; while ($row = mysql_fetch_array($result)) { printf("\n<B>Status: %s</B>\n",$row["STATUS"]); printf("%s\n",$row["COMMENT"]); } print "</PRE>\n"; mysql_free_result( $result ); } 先ほど記述した箇所をコメント化すれば、全く問題なく処理は進むのです。 この2つのSQL処理は同じIF文の中で実行されていて、どちらかだけが実行されるという事はありません。 そこで、データベースのデータに原因があるのかもしれないと思ってしまったのです。 そこで追加質問ですが、PHPソースの中にタブや空白が混在していても問題ないでしょうか?(段落分けのためなど)

  • nicolish
  • ベストアンサー率72% (13/18)
回答No.1

L.248、L.251、L.253のprint文がいずれか一度でも実行された後L.260が実行されるとエラーになる。 header()は画面出力の前に呼ばれなければいけない。 逆に言うと、既に何かが出力されていたらheader()は呼んではいけない。そのWarningはそう言っている。

Snowgirl88
質問者

補足

nicolishさん、早速回答をありがとうございます! エラーの内容は理解出来るのですが、元々既存のプログラムで全く 問題なく稼動していたため、途方に暮れています。 L249で取得しているTEXTエリアに変な文字が入ってるのかとも思い、INT型のSTRNOだけ取得して出力するようにしてみたのですが、結果は同じでした。 正常に処理が実行される場合と、Warningが出る場合の違いが良くわかりません。

関連するQ&A

  • エラー Warning: Cannot modify header information

    10日で覚えるPHP入門教室の本を買ってPHPを学習中の初心者です。 この本のサンプル例題でクッキーを使って初回入力データを2目のアクセスでも表示するコードがあるのですが、どうしても Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\php10\day02-3\cookie_rec.php:6) in C:\xampp\htdocs\php10\day02-3\cookie_rec.php on line 6 のエラーがでます。 下記がそのサンプルコードズバリです。 -----cookie.php------- <html> <head> <title>クッキーでデータを記録する</title> </head> <body> <form method="POST" action="cookie_rec.php"> E-Mailアドレス: <input type="text" name="email" size="30" maxlength="50" value="<?php print($_COOKIE['email']); ?>" /> <input type="submit" value="送信" /> </form> </body> </html> ------cookie_rec.php------- <html> <head> <title>クッキーでデータを記録する</title> </head> <body> <?php setcookie("email",$_POST['email'],time()+(60*60*24*90)); ?> クッキー"email"を保存しました。 </body> </html> cookie.phpでメルアドを送信するとcookie_rec.phpでクッキーにセットして次回cookie.phpを開けたらメルアドが既にinputboxに入力した状態になるはずですが、どうしてcookie.phpの送信ボタンを押すと上記のエラー表示となります。 なにが原因しているのでしょうか? お解りになる方、宜しくお願い致します。 環境はXAMPP Windows Version 1.6.3aのローカルでOSはXPです。

    • ベストアンサー
    • PHP
  • Cannot modify header information

    質問がの仕方が下手なので理解しずらいかもしれませんが、どうかお願いします。 PHPを使っているとタイトルのエラーがが表示されてしまいます(T_T) ソースコードは <?php header(""Location: http://yahoo.co.jp"); exit; ?> という簡単なものです。 自分で調べてタブとか空白という事でしたので調べましたが、わかりませんでした。 試しに2、3行目をコメントにして実行すると画面上はもちろん真っ白なものが表示されます。 しかし、文字コードを変えてみると何かが文字化けしたようなものが表示されます。 これが問題だろうとはわかるのですが、どうしてよいかわからず・・・。 何方かアドバイスいただけないでしょうか

    • ベストアンサー
    • PHP
  • PHPとAPACHEのエラー「Warning: Cannot modify header information」について

    こんばんわ、 現在APACHEとPHPを使用してWEBを作成しています。 PHPLIBを使用して認証頁を作成しようとしているのですが、そのさいに下記のエラーがでます。 Warning: Cannot modify header information - headers already sent by (output started at /home/XXXXXXXXXX/include/login.inc:14) in /usr/local/apache/phplib-7.4/php/session.inc on line 479, 480, 481, 482, 483 です。 ちなみに/home/XXXXXXXXXX/include/login.inc:14には、 1 <?php 2 include ("prepend.php"); 3 page_open( 4 array("sess" => "Example_Session", 5 "auth" => "Example_auth", 6 "perm" => "Example_Perm", 7 "user" => "Example_User")); 8 ?> 9 10 11 12 13 としかなく、14行目はありません。 prepend.phpとsession.incはデータベースをpgslにかえた以外はなにもしておりません。 478 default: 479 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 480 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 481 header("Cache-Control: no-cache"); 482 header("Cache-Control: post-check=0, pre-check=0", false); 483 header("Pragma: no-cache"); 484 break; となっています。 以前までは、prepend.phpのみを.htaccessのauto_prepend_fileに指定していましたが、その部分をこのlogin.incに指定しなおしただけでこのエラーがでました。 なにがわるいのかよく解りません。なにの設定がわるいのでしょうか。 初歩的な質問ですが、宜しくお願いします。

  • PHPエラー Warning: mysql_

    OCNサーバープランをスタンダードからビジネスライトへ変更した際、 OCN側で移動してくれたのはいいのですが、入っていた掲示板システムで、「削除」画面で 削除を押すと前サーバーまでは問題がなかったのですが、今回は削除はされるけれどエラー文がでてきます。 Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /usr/home/△△/www/htdocs/info/●●.php on line 87 問題の87行目: echo "<br>1件削除しました"; <?php if ($_POST["go_1"]==1) { $db_date = htmlspecialchars($_POST['db_date']); $sql="DELETE FROM keiji_t where kdate='".$db_date."'"; mysql_query($sql,$conn) or die("削除できませんでした"); mysql_free_result($res); echo "<br>1件削除しました"; } ?> 「1件削除しました」という文字はでます。 何が原因かわからず、もし原因として考えられそうなこと教えていただければとこちらにいれさせていただきました。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • headers already sent と言われてしまう。

    [portal.php] で、 <?php require ('Smarty.class.php'); require ('Plan.class.php'); session_start(); $smarty = new Smarty; $schedule = new Plan; if(empty($_SESSION["user"])){ Header("Location: login.php"); } 以下略 というコードを打って、実行したら Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\Program Files\Apache Group\*******\Plan.class.php:122) in C:\Program Files\Apache Group\*******\portal.php on line 4 というエラーが出ます。 \Plan.class.php には <?php class Plan{ function __construct(){ $this->Zaikofile="C:Program Files\Apache Group\Apache2\logs\plan.sqlite"; $this->user=$_SESSION["user"]; $this->errorm=""; 以下略 ?>    ←122行目(最終行)です。 となっています。両方のプログラムとも、「<?php」の上の行には何も書いていません。 なぜ、headers already sentとなるのでしょうか? エラーの原因はどこにあるでしょうか?

    • ベストアンサー
    • PHP
  • PHP+MySQLを実行するとエラーが出てパソコンがフリーズする。

    次のphpを実行すると、求めるデータは表示出来ますが、その下に引き続き Warnning:mysql_result()[function.mysql_result]: Unable to jump to row 7 on MySQL result index 3 in C:****test.php on line 10; 同文で on line 11; 以下,Unable to jump toの 「 row 7」 が row 8 row 9・・・・・・ と延々と続き、パソコンがフリーズしてしまいます。 実行したphp文。 <?php $con=mysql_connect(localhost,"root","root"); $selectdb=mysql_select_db("sales",$con); $sql="select * from sample"; $result=mysql_query($sql,$con); $row=mysql_fetch_array($result); $price=mysql_result($result,$i,1); $volume=mysql_result($result,$i,2); echo("$price:$volume<br>\n"); mysql_close($con); ?> 参考書を調べて、いろいろ変えてみましたが、分かりません。 幼稚なphp文で恐縮ですが、悪いところをご指摘頂ければ有難いです。

    • ベストアンサー
    • PHP
  • phpからget送信で持ってきたデータの改行

    こんにちは。 phpから取得したデーターをjavascriptに渡して表示したいと考えています。 しかしながらjavascriptで改行ができません。何が原因でしょうか? <send.phpファイル> <?php $date_db="2012/12/03"; .$title_db="テスト"; $comment_db="送信可能"; echo "日時:".$date_db."\nタイトル:".$title_db."\nコメント:".$comment_db; ?> <htmlファイル(一部)> $.ajax({ type: "GET", url: "send.php", data: data, dataType: "text", success: function(data, dataType) { /** Ajax通信が成功した場合に呼び出される */ //初回アクセス時 if(result == null) { result = data; } //PHPより取得した値が違えばメッセージを<div id="text"></div>に出す if(result != data){ alert("情報が更新されました\n情報を確認してください"); $('#text').text(data); result = data; } }, <div id="text"></div> ブラウザ上で表示されると「 日時:2012/12/03タイトル:テストコメント:送信可能」になってしまいます。 お願いします。

  • 以下エラーの修正方法についてCall to undefined function domxml_new_doc() in

    PHPを全く扱ったことのない初心者です。 技術者向けカテゴリーに投稿してしまい、誠に恐縮ですが、 エラーの対処方法について私の知識では到底及びませんので どなたかご教授頂けますでしょうか。 以下phpをブラウザでみると、Call to undefined function domxml_new_doc() in とのエラーがでてしまいます。 修正方法を教えて頂けますでしょうか。 どうかよろしくお願い致します。 <?php require("sql-info.php"); $doc = domxml_new_doc("1.0"); $node = $doc->create_element("MLB"); $parnode = $doc->append_child($node); $connection=mysql_connect ($hostname, $username, $password); if (!$connection) { die('Not connected : ' . mysql_error()); } $db_selected = mysql_select_db($database, $connection); if (!$db_selected) { die ('Can\'t use db : ' . mysql_error()); } $query = "SELECT * FROM MLB WHERE 1"; $result = mysql_query($query); if (!$result) { die('Invalid query: ' . mysql_error()); } header("Content-type: text/xml"); while ($row = @mysql_fetch_assoc($result)){ $node = $doc->create_element("marker"); $newnode = $parnode->append_child($node); $newnode->set_attribute("stadium", $row['stadium']); $newnode->set_attribute("lat", $row['lat']); $newnode->set_attribute("lng", $row['lng']); $xmlfile = $doc->dump_mem(); echo $xmlfile; ?>

    • ベストアンサー
    • PHP
  • MYSQLでPHPから画像表示したい

    以下でPHPとMYSQLにて画像jpgを表示できたのですが、 header("Content-type: image/jpeg"); $result = mysql_query("SELECT * FROM test"); $row = mysql_fetch_assoc($result); print ($row['image']);これだけなら表示OK。 しかし、 テーブルタグの中にprint ($row['image']);をいれたり while文で囲んだりすると、文字の羅列になってしまいます。好きな場所にprint ($row['image']);で表示するには どうしたらいいのでしょうか?

    • ベストアンサー
    • PHP
  • PHPとMySQLについて

    PHPとMySQLについて PHP、MySQLともに初心者の者です。 ネットの情報を参考に以下のようなプログラムを作成しました。 <?php //ファイルを読み込み require_once("DB47.php"); // クエリを送信する $sql = "SELECT * FROM japanDB ORDER BY PREF_CD"; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "".$row["PREF_CD"]." ".$row["PREF_NAME"]." "; $tempHtml .= "\n"; } $msg = $rows."件のデータがあります。\n\n"; }else{ $msg = "データがありません。\n\n"; } //結果保持用メモリを開放する mysql_free_result($result); ?> <?= $msg ?> <?= $tempHtml ?> これはデータベースに 1、北海道 2、青森 ・  ・ ・  ・ ・  ・ 47、沖縄 といった情報を与えており、PHP側でMySQLに接続し、その内容をコマンドプロンプト上で表示するといったものです。 しかし、PHPプログラムを実行してしまうと、全データが一気に表示されてしまうので、見づらいものとなっています。 そこで、地名や番号を入力すれば、地名を表示するような検索機能を付けたいのですが、PHPからMySQLデータベース内を検索する方法が分かりません。検索機能をこのプログラムに組み込みたいのですが・・・。 どなたかご教授お願いいたします。 ***環境*** OS : Windows XP Pro PHP4.2.3 、MySQLインストール済み **********

    • ベストアンサー
    • PHP

専門家に質問してみよう