みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

JavascirptかPHPでコメントフォーム

http://qitailang.small.jp/webtech/commentbox/commentform.html
このサイトのコメントフォームを使おうと思っているのですが
行き詰っています。
アパッチのhtdocsの直下にフォルダを置き、
フォルダ名をcommentform_modifiedとしてその下にsample.htmlを置き
さらにその下に
commentform
commentform.php
commentform.js
commentform.css
commentfiles
としました。今の所パーミッションというのは触っていません。
元々このサイトとは違う練習用のPHPファイルはうまくいっています。ただ今回、
http://localhost/commentform_modified/sample.htmlとして実行した所PHPのエラーが出ています。
Notice: Use of undefined constant file - assumed 'file' in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 17

Notice: Use of undefined constant cmd - assumed '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 21

Notice: Use of undefined constant cmd - assumed 'cmd' in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 57

Notice: Undefined index: cmd in C:\Program Files\Apache\Apache24\htdocs\commentform_modified\commentform\commentform.php on line 57

まず17行目から21行目辺りですが
$commentdir = 'http://localhost/commentform_modified/commentform';
/*--------------------------------------------*/
$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') {
としています。
57行目は
} elseif ($_REQUEST[cmd] == 'delete') {
となっています。

双方とも何がいけないんでしょうか?

投稿日時 - 2018-05-09 22:07:17

QNo.9496841

困ってます

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

> 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()の行を コメント行になるように殺してしまえば話は早いです。

投稿日時 - 2018-05-16 14:33:18

お礼

何度もご回答有難うございました。

投稿日時 - 2018-05-27 13:16:10

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

> 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");
を入れて どんなパスとファイル名で 書き込もうとしているのか
確かめてみてはどうでしょう?

投稿日時 - 2018-05-15 10:28:48

補足

返事が遅くなって申し訳ないです。
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とかいう奴が必要となってくるのでしょうか?

投稿日時 - 2018-05-16 13:38:56

ANo.6

> 以下のエラーもパーミッション設定というところでしょうか?

サーバーが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 が組み込めていないという
実行環境上の問題です。
.これを解決しないと 進めないでしょう(別件のも同じです)

投稿日時 - 2018-05-14 12:13:23

補足

>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というのがあるのですが、
前日にコメントアウトしたつもりが次の日にまた緑色に戻っているのですが
こういうものですか?

投稿日時 - 2018-05-14 13:21:36

ANo.5

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の警告がでていても、コメントを追加する動作は動くはずです。
もし 現状でコメントを追加することができてないのなら
ファイルのパーミッションなど、ほかの要因を見直しする必要があるでしょう。

投稿日時 - 2018-05-13 14:42:09

補足

何度も補足有難うございます。
ただ、送信した後にエラーがまた出てしまっています。
以下のエラーもパーミッション設定というところでしょうか?
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

投稿日時 - 2018-05-13 18:51:16

ANo.4

失礼しました。
" "の中で  $_REQUEST['file']  のような 連想配列を使うときには
{ } で囲んで {$_REQUEST['file']}  のようにして下さい。

例えば、
if ($_REQUEST['file'] && is_file("$commentdir/{$_REQUEST['file']}.dat")) {

$Comment = file("$commentdir/{$_REQUEST['file']}.dat");
です。

投稿日時 - 2018-05-12 09:35:47

補足

いえいえ何度も補足有難うございます。
ただまだエラーが出ています。
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') {

投稿日時 - 2018-05-12 19:07:21

ANo.3

> $Comment = 'file'("$commentdir/$_REQUEST['file'].dat");

$_REQUEST[~] の中 以外のも 書き換えてしまっているのが間違いです。

投稿日時 - 2018-05-11 21:20:28

補足

何度も回答有難うございます。

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

投稿日時 - 2018-05-12 00:55:16

ANo.2

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にセットしてもよい訳ですが)

投稿日時 - 2018-05-10 11:55:06

補足

ご回答有難うございます。
下記のように
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

予期しないダブルクォートがあるエラーらしんですが、カッコが余計に多いですか?

投稿日時 - 2018-05-11 19:09:17

出てるエラーが全部「文字」になってることに、気が付けば早かったのに!
$_REQUEST[cmd]
cmd という「マクロ」が見つからないということです。
これが配列変数の文字列とみなされていないだけです。
なので、
$_REQUEST["cmd"]だけでOKです。
ただ、前後がわからないので、なんですけども。
issetなどで変数があるか?も、チェックしたほうがより安全でしょうね。

define (cmd,"cmd");とかアホなことしても動くかもしれんが。

投稿日時 - 2018-05-10 01:45:02

補足

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文やいくつかの関数がありますが触ってないので大丈夫なはず?です。

投稿日時 - 2018-05-11 19:27:24