- ベストアンサー
JavaScriptかPHPでコメントフォーム作成方法とエラー解決方法
- JavaScriptかPHPを使用してコメントフォームを作成する方法について説明します。また、コメントフォームの作成中に発生したエラーの解決方法についても解説します。
- コメントフォームを実現するためには、JavaScriptかPHPを利用する方法があります。具体的な手順としては、フォームのHTMLコードを作成し、バリデーションやデータの送信をJavaScriptで処理するか、PHPでサーバー側で処理するかの選択があります。どちらの方法を選ぶかは、開発者の好みや要件によります。
- 質問文章中で発生しているエラーについては、変数やリクエストの取得方法に誤りがあります。エラーメッセージに従って適切な変数名やリクエスト名を指定することでエラーを解消することができます。具体的には、変数名をクォートで囲んで文字列として扱う必要があります。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
> Warning: mb_send_mail(): SMTP server response: 530 5.7.0 Must issue a STARTTLS command first. h1-v6sm1981113pfg.135 - gsmtp メール送信に使うSMTPサーバー側でメール送信が拒否されています。 (SSLで送るべきSMTPサーバーを使っているのに、平文で送っている) レンタルサーバーやクラウドサーバーから直接メールを出すのであれば、わりと簡単ですが、 自宅サーバーからだとプロバイダにより迷惑メール対策でブロックされているので、 外部のSMTPサーバーの自分用のアカウトで経由させてメールを出す必要があります。 そうなるように、使っているSMTPサーバー(プロバイダとかgmailとか)の仕様に合わせて PHPの設定(php,iniやsendmailini)行いますが、それがきちんとできていないのでしょう。 なお、postfixのインストールは 関係ありません。 このPHPでコメントを追加したときに出るメールが不要ということなら、 mb_send_mail()の行を コメント行になるように殺してしまえば話は早いです。
その他の回答 (7)
- superside0
- ベストアンサー率64% (461/711)
> flock()やfclose()の警告はまだ消えてくれません。 fopenに失敗して $fpが不正なのに、そのままflock()やfclose()に使っているのが 原因なのか $fpは正常なのに、flock()そのもので失敗しているのか どちらなのかを、確定させてその原因を取り除く必要があります。 エラーメッセージは Warning: flock() expects parameter 1 to be resource, boolean given ~ のままですか? また、 $fp = fopen($filename, "w+"); の下に if ( ! $fp ) die ("file open error : $filename <br />\n"); を入れて どんなパスとファイル名で 書き込もうとしているのか 確かめてみてはどうでしょう?
補足
返事が遅くなって申し訳ないです。 iniファイルを色々いじってみて flock()やfclose()のエラーは改善しました。 現在出ているエラーは下記の1つだけです Warning: mb_send_mail(): SMTP server response: 530 5.7.0 Must issue a STARTTLS command first. h1-v6sm1981113pfg.135 - gsmtp in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 54 メールアドレスのエラーらしいですが、メールに送るこだわりはないですが これはSSL 証明のためのpostfixとかいう奴が必要となってくるのでしょうか?
- superside0
- ベストアンサー率64% (461/711)
> 以下のエラーもパーミッション設定というところでしょうか? サーバーがWindowsということなので commentfilesというフォルダのプロパティーで フルコントロールに なっていれば問題ないです。 ですが、いま現在、6つのエラーが出ているということですが これらは、プログラムのコーディング上の問題(というかバグ)と Apache+PHPの環境設定が不足しての問題です。 > Notice: Use of undefined constant comment - assumed 'comment' in C:\Program まえと同じで 未定義の定数を使っている警告です。 本来は$_REQUEST['comment']です。 (修正漏れでは?) > Notice: Undefined variable: value in C:\Program Files\Apache\Apache24\htdocs \commentform_modified\commentform\commentform.php on line 258 変数 $valueの初期化漏れの警告です。この場合だと無視できないことはないですが、 if ( flag ) { の次の行に $value = ''; を挿入すれば 解決するでしょう。 > Warning: fopen(commentfiles/!commentform_modified!sample*html.dat): failed to open stream: No error in C:\Program Files\Apache\Apache24\htdocs ファイル名の一部に*があるので、Windows上では作れないファイルというエラーです。 js側の file_url = file_url.replace(/\./g, '*'); の行を殺せば、解決するでしょう。 (ただ、そもそも、jsでわざわざ ファイル名中のドットを、* に変換している理由が不明です。) そのあとのflock()やfclose()で出ている2つのWarningは、 上記のような理由でファイルがオープンできななったときにエラー分岐しないで、 そのまま処理を続行させているプログラムのバグです。 > Fatal error: Call to undefined function mb_language() in C:\Program Files\Apache \Apache24\htdocs\commentform_modified\commentform\commentform.php on line 47 これは、php.iniで php_mbstring.dll が組み込めていないという 実行環境上の問題です。 .これを解決しないと 進めないでしょう(別件のも同じです)
補足
>file_url = file_url.replace(/\./g, '*'); >の行を殺せば、解決するでしょう コメント行としましたが flock()やfclose()の警告はまだ消えてくれません。 Fatal error: Call to undefined function mb_language() in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 47 php_mbstring.dllは確かにコメントアウトしています。セミコロンが外れています。 それと一つ気になったのがmbstring.language = Japaneseというのがあるのですが、 前日にコメントアウトしたつもりが次の日にまた緑色に戻っているのですが こういうものですか?
- superside0
- ベストアンサー率64% (461/711)
jsのほうをみるとURLとして /commentform/commentform.php?cmd=commentRegist&~ の場合と /commentform.php?file='+GetFileName(location.pathname) の場合とがあって 後者には cmd=がないですね。 なのにphp側ではcmdが常にあるものとしてコーディングされていますので 後者でアクセスすると、Noticeの警告が出てしまいます。 (エラーではないですが、環境によっては警告のでてしまう 多少問題のあるコーディングのようです) このNotice警告を出さないようにするには > 21行目 if ($_REQUEST["cmd"] == 'commentRegist') { を if ( isset($_REQUEST["cmd"]) && $_REQUEST["cmd"] == 'commentRegist') { > 57行目 } elseif ($_REQUEST["cmd"] == 'delete') { を } elseif ( isset($_REQUEST["cmd"]) && $_REQUEST["cmd"] == 'delete') { に修正するとよいでしょう。 ただ、このNoticeの警告がでていても、コメントを追加する動作は動くはずです。 もし 現状でコメントを追加することができてないのなら ファイルのパーミッションなど、ほかの要因を見直しする必要があるでしょう。
補足
何度も補足有難うございます。 ただ、送信した後にエラーがまた出てしまっています。 以下のエラーもパーミッション設定というところでしょうか? httpd.confのポートが許可されてないとかの話でしょうか? Notice: Use of undefined constant comment - assumed 'comment' in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 24 Notice: Undefined variable: value in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 258 Warning: fopen(commentfiles/!commentform_modified!sample*html.dat): failed to open stream: No error in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 302 Warning: flock() expects parameter 1 to be resource, boolean given in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 303 Warning: fclose() expects parameter 1 to be resource, boolean given in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 310 Fatal error: Call to undefined function mb_language() in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 47
- superside0
- ベストアンサー率64% (461/711)
失礼しました。 " "の中で $_REQUEST['file'] のような 連想配列を使うときには { } で囲んで {$_REQUEST['file']} のようにして下さい。 例えば、 if ($_REQUEST['file'] && is_file("$commentdir/{$_REQUEST['file']}.dat")) { や $Comment = file("$commentdir/{$_REQUEST['file']}.dat"); です。
補足
いえいえ何度も補足有難うございます。 ただまだエラーが出ています。 cmdのところのようです。 定義されてない変数のエラーのようです。 cmdをダブルクォーテーションとしています。 Notice: Undefined index: cmd in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 21 Notice: Undefined index: cmd in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 57 21行目 if ($_REQUEST["cmd"] == 'commentRegist') { 57行目 } elseif ($_REQUEST["cmd"] == 'delete') {
- superside0
- ベストアンサー率64% (461/711)
> $Comment = 'file'("$commentdir/$_REQUEST['file'].dat"); $_REQUEST[~] の中 以外のも 書き換えてしまっているのが間違いです。
補足
何度も回答有難うございます。 if ($_REQUEST['file'] && is_file("$commentdir/$_REQUEST['file'].dat")) { $a=1; $Comment = file("$commentdir/$_REQUEST['file'].dat"); とComment=の横のfileのシングルクォーテンションを取ってみましたが まだ以下のエラーが出ています。 Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 17
- superside0
- ベストアンサー率64% (461/711)
Notice: Use of undefined constant ~ のメッセージは 「未定義の定数 ~を使っている」という 警告です。 これは、もともとのソースコード(commentform.php)が本来 $_REQUEST['file'] のように書くべきところを $_REQUEST[file] と文字列でなく定数で書いてあるので、それでこれの警告が出ています。 (ただし、これでも動いてはくれますが、 サーバー側のPHPの設定か.htaccessの設定か、PHP内でのエラーレポートの設定で、 E_NOTICEの警告を出すようにしていると、 このようにNoticeの警告メッセージがブラウザ画面に出てしまします) $_REQUEST[ ~]の部分を、全て'~'に書き換えると でなくなります。 もしくは、PHPの頭のほうで、例えば error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED); を入れて、E_NOTICEを無効にするかです。 でも これが動かない根本原因ではなくて、 他に問題があって、 13行目あたりの $commentdir = 'http://localhost/commentform_modified/commentform'; の文字列の内容がおかしいです。 $commentdir という変数は、 mkdir($commentdir); や is_file("$commentdir/$_REQUEST[file].dat")) { で使われているので、 この変数にセットすべき値は、"http://~"のようなURLの文字列ではなく、 サーバー上のディレクトリ名のはずです。 なので $commentdir = 'http://localhost/commentform_modified/commentform'; でなく $commentdir = 'commentfiles'; とすべきでしょう。 (もちろん独自のディレクトリを自分で作って、それを$commentdirにセットしてもよい訳ですが)
補足
ご回答有難うございます。 下記のように 4ヶ所のfileをシングルクォーテンションで囲み、 $commentdir = 'commentfiles'と したところ新たなエラーが出ました。 $commentdir = 'commentfiles'; /*--------------------------------------------*/ $Comment = array(); if (!is_dir($commentdir)) mkdir($commentdir); if ($_REQUEST['file'] && is_file("$commentdir/$_REQUEST['file'].dat")) { $a=1; $Comment = 'file'("$commentdir/$_REQUEST['file'].dat"); エラー文 Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 17 予期しないダブルクォートがあるエラーらしんですが、カッコが余計に多いですか?
- AsarKingChang
- ベストアンサー率46% (3467/7474)
出てるエラーが全部「文字」になってることに、気が付けば早かったのに! $_REQUEST[cmd] cmd という「マクロ」が見つからないということです。 これが配列変数の文字列とみなされていないだけです。 なので、 $_REQUEST["cmd"]だけでOKです。 ただ、前後がわからないので、なんですけども。 issetなどで変数があるか?も、チェックしたほうがより安全でしょうね。 define (cmd,"cmd");とかアホなことしても動くかもしれんが。
補足
cmdだけをダブルクォーテーションとしてましたが、 Notice: Use of undefined constant file - assumed 'file' in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 17 Notice: Undefined index: cmd in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 21 Notice: Undefined index: cmd in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 57 と3つには減りました。加えて No.2の方のアドバイス通りfileをシングルクォーテンションで囲むと Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 17 と新たなエラーが出てきました。 全文は文字数制限のため載せれませんが途中まで載せてみようと思います。 <?php $root = 'rootpasswd'; $commentdir = 'commentfiles'; $Comment = array(); if (!is_dir($commentdir)) mkdir($commentdir); if ($_REQUEST['file'] && is_file("$commentdir/$_REQUEST['file'].dat")) { $a=1; $Comment = 'file'("$commentdir/$_REQUEST['file'].dat"); } if ($_REQUEST["cmd"] == 'commentRegist') { $m_file=filedecode($_REQUEST[file]); $m_comment=commentdecode($_REQUEST[comment]); REQUEST_Purse(); $value = join("\t", array( "id=". createid(), "date=". time(), "name=$_REQUEST[name]", "pw=$_REQUEST[pw]", "title=$_REQUEST[title]", "comment=$_REQUEST[comment]", "\n" )); /*$value = mb_convert_encoding($value, "UTF-8", "EUC-JP");*/ array_unshift ($Comment, $value); data_save("$commentdir/$_REQUEST[file].dat", $Comment); /*メール送信*/ /*サーバーURL、最後の / は不要*/ $myhost="www.example.com:80"; mb_language("Japanese"); mb_internal_encoding("UTF-8"); $to = '自分のメールアドレスを入れています'; $subject = 'コメントの投稿がありました。'; $body = 'Commented HTML : '.$myhost.$m_file. "\r\n====\r\n".$m_comment; $headers = 'From: 自分のメールアドレスを入れています' . "\r\n"; mb_send_mail($to, $subject, $body, $headers); } elseif ($_REQUEST["cmd"] == 'delete') { $i = 0; foreach ($Comment as $line) { if (preg_match("/^id=$_REQUEST[id]\t/", $line)) { $comment = dbfields($line); if ($comment[pw] == $_REQUEST[pw] || $root == $_REQUEST[pw]) { array_splice($Comment, $i, 1); $match = true; break; } } $i++; } if ($match) data_save("$commentdir/$_REQUEST[file].dat", $Comment); } header("Content-type:text/html; charset=UTF-8"); echo <<<_ <form action="javascript:void(0)" name="commentform" id="commentform"> <ol class=rule> <li>このページに関するご感想・ご質問などをお書き下さい。</li> 中略 </ol> <table> <tr><th align=right style="width:5em;">お名前</th><td><input type="text" name="name" size=20 /></td></tr> <tr><th align=right>パスワード</th><td><input type="password" name="pw" size=8 maxlength=8/>英数字8文字以内</td></tr> <tr><th align=right>件名</th><td><input type="text" name="title" size=60 /></td></tr> <tr><td colspan="2"><textarea name="comment" rows=10 style="width:100%"></textarea></td></tr> <tr><td colspan="2" align=right> <span style="visibility:hidden"><input type="checkbox" name="rulecheck" id="rulecheck" value="1" checked /><label for="rulecheck">上記「コメントに関するお約束」に同意します。</label></span> <input type="reset" value="リセット" class="commandButton" /> <input type="button" value="送信する" class="commandButton" onclick=" if (this.form.name.value=='') { alert('お名前が記入されていません。'); return; } if (this.form.comment.value=='') { alert('コメント本文をご記入ください。'); return; } /*if (this.form.rulecheck.checked==false) { alert('「コメントに関するお約束」にご同意ください。'); return; }*/ if(confirm('送信してもよろしいですか?')) { 中略 getAjaxText ここも触りました ('http://localhost/commentform_modified/commentform/commentform.php?cmd=delete&file='+GetFileName(location.pathname)+'&id='+this.form.id.value+'&pw='+this.form.pw.value, 'commentBox'); }" /> </form> </div> </div> _; ここからforeach文やいくつかの関数がありますが触ってないので大丈夫なはず?です。
お礼
何度もご回答有難うございました。