↑で図解にしてみました。
send_inquiry.phpにデータ受け渡す為check_inquiry.phpにformタグを埋め込みます。↓
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>お問い合わせフォーム</title>
</head>
<body>
<form action="send_inquiry.php" method="POST">
<input type="hidden" name="title" value="<?php $_POST['title'] ?>" />
<input type="hidden" name="message" value="<?php $_POST['message'] ?>" />
</form><p>■お問い合わせ内容を入力してください。</p>
<p>お問い合わせタイトル:
<br />
<?php echo $_POST['title']; ?>
</p>
<p>お問い合わせ内容詳細:
<br />
<?php
//改行部分ににBRを埋め込む
echo nl2br($_POST['message']);
?>
</p>
<p>
<?php echo 'こんにちは’; ?>
<?php echo 1234; ?>
</p>
<input type="submit" value="お問い合わせ内容の確認" />
</p>
</form>
</body>
</html>
hidden・・・ブラウザには表示されない、隠しフィールドを作る事ができます。
name・・・送信するデータのパラメータ名を記述します。入力画面と同じく、「title」と「message」のパラメータを記述します。
value・・・データの値を記述します。入力画面からPOSTメソッドで送信された、データをecho文で出力し、データの値としてvalue属性に書き込みます。
↓http://127.0.0.1/lesson/chap2/inquiry.htmlでinquiry.htmlアクセスして、
↑(画像はクリックで拡大できます。)
入力フォームに
お問い合わせタイトル:
">"や"<"などの比較演算子についてお問い合わせ内容:
">"や"<"などの比較演算子の使い方を教えてください。と入力して確認ボタンを押してください。(※記号は半角で入力してください。)
↑
なんか赤く囲ったところがおかしいです。(※画像はクリックで拡大できます。)
↑これはvalueの値が空で「”」や「<」や「>」がHTMLのタグに使う特殊記号として認識されちゃう為に起こるバグです。これを利用して悪意のあるjavascriptのプログラムを記述されるとプログラムが動いてまずい事になるらしいので(※クロスサイトスプリティング(XSS)微弱性問題)、対策をします。(画像はクリックで拡大できます。)
inquiry.html↓
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>お問い合わせフォーム</title>
</head>
<body>
<?php
//お問い合わせタイトル、詳細のセット
$title = htmlspecialchars($_POST['title'], ENT_QUOTES);
$messege = htmlspecialchars($_POST['message'], ENT_QUOTES);
?><form action="send_inquiry.php" method="POST">
<input type="hidden" name="title" value="<?php $_POST['title'] ?>" />
<input type="hidden" name="message" value="<?php $_POST['message'] ?>" />
</form>
<p>■お問い合わせ内容を入力してください。</p>
<p>お問い合わせタイトル:
<br />
<?php echo
$title; ?>
</p>
<p>お問い合わせ内容詳細:
<br />
<?php
//改行部分ににBRを埋め込む
echo nl2br(
$message);
?>
</p>
<p>
<?php echo 'こんにちは’; ?>
<?php echo 1234; ?>
</p>
<input type="submit" value="お問い合わせ内容の確認" />
</p>
</form>
</body>
</html>
<hr />
↑赤くなってるところを変更してください。
●htmlspacialchars()関数
・・・「<」「>」「"」をHTMLエンティティに変換すします。(※htmlspecialchars関数でクロスサイトスプリクティング(XSS)微弱性問題をサニタイズ(※除去)します。)
第2引数にENT_QUOTESを指定する「'」を対象になります。
●HTMLエンティティー
・・・特殊文字を文字列として扱うときのコードです。
「"」・・・"
「&」・・・&
「<」・・・<
「>」・・・>
「'」・・・S#309;
●代入・・・変数に値を入れることです。(※↓イメージ的にはこんな感じです。)
$title = htmlspecialchars($_POST['title'], ENT_QUOTES);
$_POST['title']をhtmlspecialchars関数の引数にして変数$titleに代入したので$titleを使わない手はないわけです。なので、
<?php echo 'title'; ?>と出力を'title'にします。
$messege = htmlspecialchars($_POST['message'], ENT_QUOTES);
もtitleと同じ理由で
<?php echo 'message'; ?>と出力をmessageとします。
↓htmlspecialchars関数でサニタイズした後の確認画面です。(※画像はクリックで拡大できます。)
↑バグが消えています。
↓ソースも正常になりました。(※画像はクリックで拡大できます。)
↓次はメール送信画面、send_inquiry.phpを作ります。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>お問い合わせフォーム</title>
</head>
<body>
<?php
// お問い合わせタイトル、詳細のセット
$title = htmlspecialchars($_POST['title'], ENT_QUOTES);
$message = htmlspecialchars($_POST['message'], ENT_QUOTES);
$username = htmlspecialchars($_POST['username'], ENT_QUOTES);
// 日本語(UTF-8)の指定
mb_language('ja');
mb_internal_encoding('UTF-8');
// FROMアドレスの設定(自動送信<送信者アドレス>)
$name = '自動送信';
$email = '<送信者アドレス>';
$header = 'From: '. mb_encode_mimeheader($name) . '<' . $email .'>';
// メール送信
$result = mb_send_mail("<送信先のアドレス>", $title, $message, $header);
// メール送信の確認
if ($result) {
// メール送信の成功
echo '■お問い合わせ内容を担当者に送信しました。';
} else {
// メール送信の失敗
echo '■担当者への送信に失敗しました。';
}
?>
</form>
</body>
</html>
●mb_language()
・・・言語設定です。
mb_language('ja')・・・日本語です。
mb_language('en')・・・英語です。
●mb_internal_encoding('UTF-8')
・・・PHP側の文字コード指定です。(※ブラウザではなくサーバーに対する文字コード指定です。)とりあえずUTF-8で。
●
$header ='From: ' . ' 送信者名' . '<送信者のアドレス>’;たぶんメールのヘッダー部分を設定しています。教本やり方とは違いますがこれでできます。送信者のアドレスは別になんでも出来ちゃいます。
.は結合を意味します。mb_encode_mimeheader()
についてはMIME ヘッダ エンコーディング方式によって文字列 str をエンコードします。この関数は、ASCII 表現の文字列を返します。らしいです。メールのヘッダーで日本語を使用したい場合「mb_encode_mimeheader」を使用してメールのMIMEヘッダに設定する文字列をエンコードする。らしいです。ようは文字化け対策ですね。たぶん。
だから
$header = 'From: ' . mb_encode_mimeheader('送信者名') . <送信者のアドレス>;でいけると思います。こっちがわかれば教科書のソースの意味も分かります。
/h2>●
$reslut = md_send_mail("<送信先アドレス>", $title ,$message ,$header);でメール送信ができます。
●if文
ここではメール送信の処理結果の一致(true)か不一致(false)を判断してブラウザに表示させています。if文は条件分岐です。
if (条件※ここでは$reslutです。) {
echo '■お問い合わせ内容を担当者に送信しました。';
(↑条件に一致(true)した時の命令文※)
}else(※不一致) {
echo '■担当者への送信に失敗しました。';
(↑条件と不一致(false)の時の命令文※)
}
になるわけです。
●比較演算子
==・・・等しい
!=・・・等しくない
<・・・小なり
>・・・大なり
<・・・以下
>・・・以上
●if (!reslut) {}の時(※falseの時)
($reslut==false)になるわけです。
●if (~) {~}で1行だけの時、if (~) ~と{}を省略できます。
●条件が複数ある場合(※段階的)
if ($num>=10000) {
$numが10000以上の時
else if ($num>=5000) {
$numが10000未満5000以上の時
}
となるわけです。
●
文字列$name = '児島さん';
の時
echo '$name';での出力は「$name」です。変数が文字列として認識されます。
echo "$name"での出力だと「児島さん」です。ダブルコーテーションで囲むと変数として認識されます。改行コードも改行コードとして認識されます。
$price = 1000
の時
echo "$priceyen" ではそんな変数がないのでエラーになります。
echo "$price yen ";では出力は「1000 yen」です。
echo $price . 'yen';では出力は「1000yen」です。(※このやり方はPHPだからできるそうです。)
echo "{$price}yen";では出力は「1000yen」です。
PR