忍者ブログ

おやっさんのWEBサイト制作への道

WEBサイト制作ど素人のおやっさんが、HTML、CSS、PHPなど学んでいく技術ブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHP008(画像アップローダー03 配列,getimagesize(),round(),imagecreatefromjpeg(),
imagecreatetruecolor(),imagcopyresampled(),
iimagejpeg(),imagedestroy() )

↓upload_image.phpに書き換えます。
(※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" />
<link rel="stylesheet" type="text/css" href="style.css" />
<style type="text/css">
</style>
<title>画像ファイアップロード</title>
</head>
<body>
<?php
// ファイルの取り出し
$file_name = $_FILES['filename']['name'];
// ファイル(MIMEタイプの取り出し)
$file_type = $_FILES['filename']['type'];
// 一時ファイルの取り出し
$temp_name = $_FILES['filename']['tmp_name'];
// ファイルの容量
$file_size = $_FILES['filename']['size'];
// エラー
$file_error = $_FILES['filename']['error'];

// 保存先のディレクトリ
$dir = 'uploads/'; //「ディレクトリ名+/」で記述すること
// 保存先のファイル名
$upload_name = $dir . $file_name;
// サムネイル画像の保存先ディレクトリ
$dir_s = 'uploads/s/'; //「ディレクトリ名+/」で記述すること
// サムネイル画像の保存先のファイルパス
$upload_name_s = $dir_s . $file_name;

// JPEG,GIF,PNG形式のファイルをアップロードする
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')) {
// アップロード
$result = move_uploaded_file($temp_name, $upload_name);

if ($result) {
// アップロードの成功
echo '<p>■アップロード成功</p>';
// アップロードされた画像情報を取り出す
$image_size = getimagesize($upload_name);
// アップロードされた画像の幅と高さを取り出す
$width = $image_size[0];
$height = $image_size[1];
$type = $image_size[2];
$IMG = $image_size[3];
$MIME = $image_size['mime'];
$chan = $image_size['channels'];
$bit = $image_size['bits'];

// サムネイル画像の幅と高さを決める
$width_s = 120;
$height_s = round($width_s*$height/$width);

// アップロードされた画像からサムネイル画像を取り出す
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg')){
$image = imagecreatefromjpeg($upload_name);
} elseif (($file_type == 'image/gif')) {
$image = imagecreatefromgif($upload_name);
} elseif (($file_type == 'image/png') || ($file_type == 'image/x-png')){
$image = imagecreatefrompng($upload_name);
}

// サムネイルの大きさの画像を新規作成
$image_s = imagecreatetruecolor($width_s,$height_s);

// GIFの場合の透過の設定
$black = imagecolorallocate($image_s, 0, 0, 0);
if (($file_type == 'image/gif'))
imagecolortransparent($image_s, $black);

// PNGの場合の透過の設定
if(($file_type == 'image/png') || ($file_type == 'image/x-png'))
imagealphablending($image_s, false); // アルファブレンディングをoffにする
imagesavealpha($image_s, true); // 完全なアルファチャネル情報を保存するフラグをonにする

// アップロードされた画像からサムネイル画像を作成
$result_s = imagecopyresampled($image_s, $image, 0,0, 0,0, $width_s,$height_s, $width,$height);

if ($result_s) {
// サムネイル画像作成成功
// サムネイル画像の保存
// サムネイル画像の保存
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg'))
{imagejpeg($image_s,$upload_name_s);
echo ' <p>->サムネイル画像保存</p>';
} elseif (($file_type == 'image/gif'))
{imagegif ($image_s,$upload_name_s);
echo ' <p>->サムネイル画像保存</p>';
} elseif (($file_type == 'image/png') || ($file_type == 'image/x-png'))
{imagepng($image_s,$upload_name_s);
echo ' <p>->サムネイル画像保存</p>';
} else {
echo ' <p>->サムネイル画像保存失敗</p>';
}
}
// 画像の破棄(メモリ開放)
imagedestroy($image);
imagedestroy($image_s);

} else {
// アップロードの失敗
echo '<p>■アップロード失敗</p>';
}
} else {
// JPEG、GIF、PNG以外の形式は画像をアップロードしない
echo '<p>■JPEG、GIF、PNG形式の画像をアップロードしてください。</p>';
}

if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo '<p>■画像ファイル:'. $upload_name . '(' . $width . '×' . $height . ')' . '</p>';
} else {echo '<p>■ファイル名が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){ echo'<p>■画像形式:' . $type . '</p>';
} else {echo '<p>■ファイル形式が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){ echo'<p>■img属性:' . $IMG . '</p>';
} else {echo '<p>■img属性が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo'<p>■MIMEタイプ:' . $MIME . '</p>';
} else {echo '<p>■MIMEタイプが見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo'<p>■色相チャンネル数:' . $chan . '</p>';
} else {echo '<p>■色相チャンネル数が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo'<p>■ビット数:' . $bit . '</p>';
} else {echo '<p>■ビット数が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo '<p><img src="' . $upload_name . '" width="250" height="188" /></p>';
} else {echo '<p>■画像が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){echo '<p>■サムネイル画像:' . $upload_name_s . '(' . $width_s . '×' . $height_s . ')' . '</p>';
echo '<p><img src="' . $upload_name_s . '" /></p>';
} else {echo '<p>■サムネイル画像が見つかりません。</p>';}
?>
<p>画像ファイル名:<?php echo $file_name; ?></p>
<p>MIMEタイプ:<?php echo $file_type; ?></p>
<p>一時ファイル:<?php echo $temp_name; ?></p>
<p>データ容量:<?php echo $file_size; ?></p>
<p>データの一時ファイル保存の成否:<?php echo $file_error; ?></p>
</body>
</html>


配列

・・・複数の値を一つの名前で扱えます。(※変数は普通、一つの値しかもてないです。配列[]を使えば複数の値を持てます。 )
$○○[0]
↑これだと○○が配列名(※名前)、0が値だと思います。値は1,2,3・・・と使えます。

値が文字だと

連想配列

と呼ばれます。→$○○['name']とか
変数を入れることも可能です。→$○○[$num]とか
配列の図


getimagesize()

・・・画像サイズなどの画像ファイル情報をとりだします。
たぶんgetimagesize(画像のパス)です。

↓第1引数に画像の画像のパスを渡すと、その画像の7種類の情報を配列で返します。
キー
0画像の幅
1画像の高さ
2画像形式を表す値(GIF=1 JPG=2 PNG=3)
3IMGタグ属性(width="画像の幅" height="画像の高さ")
’mime’MIMEタイプ
’channels’色相チャンネル数(RGB=3,CMYK=4)
’bits’色のビット数(1bit=モノクロ,8bit=256色、24bit=フルカラー




サムネイルの算出

(※サムネイルとは画像一覧とか縮小された画像のことです。)
ここではサムネイルの横幅を120pxにしてます。
それに対してのサムネイルの縦幅を計算します。
だから計算式は
$width_s = 120;
に対して
height_s = round($width_*$height/$width);
になるわけです。計算式です。$widthは$heightの何%かをだし(※割り算です)その答えを$width_sにかけるわけです。その答えがheight_sになるわけです。

round()

・・・四捨五入する関数です。上の式ではpxには自然数しかないので少数は四捨五入するわけです。

ちなみにround(10.55)だと11です。
round(10.55,1)だと10.6です。(※1の意味が小数点第一位まで残すと言う意味です。)
round(1255,-2)だと1260です。(※下二桁のところで四捨五入するという意味になります。)

その他に
ceil(□□);・・・切り上げ
floor(□□);・・・切り捨て
などの関数があります。


imagecreatefromjpeg(ファイルパス)

・・・JPEG画像を取り出します。
そのほかにGIF,PNG,BMPに対応する関数もあります。

imagecreatetruecolor(幅,高さ)

・・・新規画像作成です。
ここではサムネイルの幅と高さをきめたので、そのサイズで、つまり、
imagecreatetruecolor(width_s,height_s);で新規画像つくります。
トゥルーカラーとはフルカラーのことで1677万色だそうです。この状態で画像は四角い黒です。

imagecopyresampled(貼付画像,元画像,貼付画像座標,元画像座標,貼付先サイズ(※幅、高さ),元画像サイズ(幅、高さ))

・・・画像の貼付(合成)
ここではさっき作った新規画像に貼付画像を貼り付けます。
imagecopyresampled($image_s, $image, 0,0, 0,0, $width_s,$height_s, $width,$height);となるわけです。
貼付画像の座標を元画像の座標と変えることで(※ここでは同じです)画像の合成ができるそうです。今の自分には無理そうなので、とりあえず置いときます。

●imagejpeg(画像データ,保存先のファイルパス);

・・・JPEG形式で保存です。
ちなみに元画像の形式不問です。

これでサムネイル画像の保存終了です。

このままだと一時データとしてサーバーのキャッシュメモリにバイナリデータが残ったままなので、サーバーの負担を減らす為データーを破棄します。

imagedestroy(画像データ)

・・・画像の破棄です。
メモリの解放(ガーベコレクション、ガベコレ)っていうらしいです。
ここでは
imagedestroy($image);
imagedestrou($images);
で元画像、サムネイルのデータを破棄します。

これでsディレクトリの中にサムネイル画像が保存されているはずです。

↓画像アップローダのここまでの流れを図にしてみました。
サムネイルができるまでの流れの図

ここまでの流れがうまくいくと、サーバーに画像をアップロードすると

↑のような表示がされます。(※画像はクリックで拡大できます。)これはCSSで装飾してあるので、本当はもっとシンプルな表示です。
PR

PHP007(画像アップローダー02 パーミッション,論理演算子,move_upload_file() )

画像をアップロードしましょう。
画前回の状態で(画像アップローダー01)で、送信されたファイルはサーバーのキャッシュメモリに保存されたままです。この一時ファイルを移動して保存する場所(アップロード先)をサーバー上に作成します。ここではupload.htmlと同じ場所に「uploads」というディレクトリを作り、その中にファイルを保存します。

パーミッション(属性)


ディレクトリやファイルに対するアクセス権の設定らしいです。
アクセス権は、
①読み込み(4,r)・・・例えば、abc.textがあったすればそれを開いて見ることができるって感じです。
②書き込み(2,w)・・・abc.textを開いて読むだけではなく書き込み保存できます。
③実行(1,x)・・・あるアプリケーション(※ここではPHP)を実行できるかどうからしいです。
パーミッション図
↑図にしてみました。自分も完全に理解できません。とりあえず777は危険ですと覚えておきましょう。

とりあえずファイルの移動の為にupload._image.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" />
<style type="text/css">
</style>
<title>画像ファイアップロード</title>
</head>
<body>
<?php
//ファイルの取り出し
$file_name = $_FILES['filename']['name'];
//ファイル(MIMEタイプの取り出し)
$file_type = $_FILES['filename']['type'];
//一時ファイルの取り出し
$temp_name = $_FILES['filename']['tmp_name'];
//ファイルの容量
$file_size = $_FILES['filename']['size'];
//エラー
$file_error = $_FILES['filename']['error'];

//保存先のディレクトリ
$dir = 'uploads/'; //「ディレクトリ名+/」で記述すること
//保存先のファイル名
$upload_name = $dir . $file_name;

//JPEG形式のファイルをアップロードする
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png')) {
//アップロード
$result = move_uploaded_file($temp_name, $upload_name);

if ($result) {
//アップロードの成功
echo '<p>■アップロード成功</p>';
} else {
//アップロードの失敗
echo '<p>■アップロード失敗</p>';
}
} else {
//JPEG、GIF、PNG以外の形式は画像をアップロードしない
echo '<p>■JPEG、GIF、PNG形式の画像をアップロードしてください。</p>';
}
?>
<p>■画像ファイル:<?php echo $upload_name; ?></p>
<p><img src="<?php echo $upload_name; ?>" width"400" height="300" /></p>

<p>画像ファイル名:<?php echo $file_name; ?></p>
<p>MIMEタイプ:<?php echo $file_type; ?></p>
<p>一時ファイル:<?php echo $temp_name; ?></p>
<p>データ容量:<?php echo $file_size; ?></p>
<p>データの一時ファイル保存の成否:<?php echo $file_error; ?></p>
</body>
</html>


↑の赤い部分を加えてください。

論理演算子


①or演算子「||」か「or」

・・・条件を一つ以上満たすもの(※どちらかがtrueの場合)
if (($file_type == image/jpeg) || ($file_type == image/pjpeg))
これだとimage/jpegかimage/pjpegどっちかであればいいと言う事です。
image/pjpegとはよくわかりませんがIEの仕様がこっちみたいです。
本来ならimage/jpegです。

②and演算子「&&」か「and」

・・・条件を全て満たすもの(※両方ともtrueの場合)
(($a)&&($b))
これだとaでありbでなければならないって事です。

③xor演算子「xor」

・・・条件を一つだけ満たす。(※どちらかがtrueであり、両方ともtrueでない場合。わけわからん。)

④!演算子

・・・否定です。(※falseの時)
!$a
ならaでないときです。

move_upload_file関数


move_upload_file(一時ファイルパス、保存先、ファイルパス)
この関数でファイルの移動ができます。

アップロード成功
↑画像のアップロード成功です(画像はクリックで拡大できます。)、uploadsディレクトリに画像が入ってるか確かめてみましょう。

↓久しぶりの先生お勧めのサイトシーイングです。
NIKE Air Jorden2012
↑すごい手間のかかるサイトだそうです。作った人達は大変にちがいないそうです。
これはflashじゃなくてjavascriptでつくられています。現時点でjavascriptも将来やらなければと考えたほうがよさそうです。

PHP006(画像アップローダー01 enctype="multipart/form-data",$_FILES,MIMEタイプ)

★画像アップローダーを作ってみます。
アップロードの流れ図
lessonディレクトリにchap3ディレクトリを作ります。その中に
↓upload.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" />
<style type="text/css">
</style>
<title>画像ファイアップロード</title>
</head>
<body>
<p>アップロードする画像ファイル(JPEG形式)を入力してください。</p>
<form action="upload_image.php" method="POST" enctype="multipart/form-data">
<p>画像ファイル:<br />
<input type="file" name="filename" size="50" accept="image/jpeg,image/gif,image/png" />
</p>
<p>
<input type="submit" value="アップロード">
</p>
</form>
</body>
</html>


enctype="multipart/form-data"

・・・ファイルをアップロードする時はenctype属性は"multipart/form-data"になります。これはバイナリ(※2進数、0と1)でデータを送信する方式です。method属性がPOSTの時しか使えません。
ちなみにenctype属性はデフォルトで、
enctype="application/x-www-form-urlencode"になってます。これはURLクエリで、つまりURLで使える文字列で送信します。
<input type="file" name="filename" size="50" accept="image/jpeg,image/gif,image/png" />はtype="file"でファイルの選択ができるようになります。ちなみにaccept属性でファイルのMIMEタイプを指定できますが、対応しているブラウザが少ないので、あまり意味はないかもです。

↓upload.htmlはChromeでみると、こんな感じです。(※画像はクリックすると大きくなります。)
アップロード画面

次に、
upload_image.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" />
<style type="text/css">
</style>
<title>画像ファイアップロード</title>
</head>
<body>
<?php
//ファイルの取り出し
$file_name = $_FILES['filename']['name'];
//ファイル(MIMEタイプの取り出し)
$file_type = $_FILES['filename']['type'];
//一時ファイルの取り出し
$temp_name = $_FILES['filename']['tmp_name'];
//ファイルの容量
$file_size = $_FILES['filename']['size'];
//エラー
$file_error = $_FILES['filename']['error'];
?>
<p>■アップロードファイル情報</p>
<p>画像ファイル名:<?php echo $file_name ?></p>
<p>MIMEタイプ:<?php echo $file_type ?></p>
<p>一時ファイル:<?php echo $temp_name ?></p>
<p>データ容量:<?php echo $file_size ?></p>
<p>データの一時ファイル保存の成否:<?php echo $file_error ?></p>
</body>
</html>



$_FILES変数


アップロードされたファイルの各種情報を取得します。
ちなみに
$_FILES変数はスーパーグローバル変数と言われています。

スーパーグローバル変数とは

・・・定義ずみの変数のことです。
変数と値の内容が決まっています。ちなみに、
$_POST['title']とか$_POST['message']とかもスーパーグローバル変数です。
あと$GET['~']も、スーパーグローバル変数です。

↓ブラウザで表示するとこんな感じです。(※クリックすると画像は拡大します。)
アップロード情報画面

$FILES['filename']['name'];でファイル名。
$FILES['filename']['type'];でMIMEタイプ。
$FILES['filename']['size'];でデータの容量(バイト単位です。)
$FILES['filename']['tmp_name'];で一時保存のファイル名です。
$FILES['filename']['error'];でエラーコードです。「0」意外は異常らしいです。ほとんど使わないそうです。

MIMEタイプ

・・・ファイル形式名。間違ってるかもしれないけど拡張子ではなくホントのファイル名的な意味合いですかね?Windowsだと拡張子は偽装できます。拡張子はなにか黒い香りがしますね~。
image/jpeg
image/gif
image/png
text/html
みたいに
タイプ/サブタイプ
で表示されます。
ここまででバイナリでファイルデータがサーバーのキャッシュメモリに一時保存されています。たぶん。

PHP005(お問い合わせフォーム02 htmlspecialchars(),mb_language(),
imd_internal_encoding(),md_encode_mimeheader(),_)

データの流れ
↑で図解にしてみました。
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エンティティー

・・・特殊文字を文字列として扱うときのコードです。
「"」・・・&quot;
「&」・・・&amp;
「<」・・・&lt;
「>」・・・&gt;
「'」・・・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」です。

PHP004(お問い合わせフォーム01 phpタグ,echo文,コメントアウト,nl2br関数,変数,関数,引数)

★お問い合わせフォームを作ってみます。
lessonディレクトリにchap2ディレクトリを作ります。
chap2ディレクトリに↓こんな感じでファイルを作っていきます。
お問い合わせ流れ
(※めんどくさい人はhtdocsディレクトリに放り込んでもいいです。たぶん。)
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>
<p>■お問い合わせ内容を入力してください。</p>
<form action="check_inquiry.php" method="POST">
<p>お問い合わせタイトル:
<br />
<input type="text" name="title" size="50" />
</p>
<p>お問い合わせ内容詳細:
<br />
<textarea name="message" cols="40" rows="5"></textarea>
</p>
<p>
<input type="submit" value="お問い合わせ内容の確認" />
</p>
</form>
</body>
</html>


XHTMLで文字コードはとりあえず、UTF-8にしてみました。
formのaction属性にはリンク先へのパスを入れます。
method属性は送信方式を入れます。
送信方式
POST・・・送信できるデータ帳に制限がありません。ボリュームのあるデータを送るときなどに使う。パスワードやクレジットカード情報など外部に漏れたくない情報を扱うときに使う。なので、ここではPOSTを使いましょう。

GET・・・送信可能なデータ帳に制限あり(2083字)
URLクエリ形式で送信。
http://~com/~.php?○○=△△&□□=△△&・・・(※httpから始まって2083字)
php?○○=△△&□□(パラメータ名)=△△(値)&・・・とデータがURLで送られるので、サーバー側にアクセスログにも、このURLが記憶されます。情報がダダ漏れになる可能性があるので使い道がないと思われますが、あるそうです。聞いてもよくわからなかったです。とりあえず覚えておきましょう。

<input type="text" name="title" size="50" />
titleは受け取り側での項目名です。
50は入力欄の幅です。
(※ここでは書いてないけどvalueの値が受け取り側での項目内容です。)

textareaのmessageが受け取り側での項目名です。

<input type="submit" value="お問い合わせ内容の確認"/>
submitが送信ボタンです。valueの値が表示名です。






お問い合わせフォーム


■お問い合わせ内容を入力してください。



お問い合わせタイトル:




お問い合わせ内容詳細:












↑こんな感じになります。
次に入力画面から送信されたお問い合わせタイトル、お問い合わせ内容詳細を受け取り、その内容を表示するPHPプログラムを作ります。

check_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>
<p>■お問い合わせ内容を入力してください。</p>
<p>お問い合わせタイトル:
<br />
<?php echo $_POST['title']; ?>
</p>
<p>お問い合わせ内容詳細:
<br />
<?php echo $_POST['message']; ?>
</p>
<p>
<?php echo 'こんにちは’; ?>
<?php echo 1234; ?>
</p>
<input type="submit" value="お問い合わせ内容の確認" />
</p>
</form>
</body>
</html>


PHPタグ


<?php ~;?>
改行可です。(※基本、PHPコードは少ないときは改行なしで、多いときは改行したほうが見やすいそうです。)

<?php echo $_POST['title']; ?>
↑POSTメゾットの項目(title)の値を受け取って出力するって事です。
文字列は(※ここではtitle)は「'」「"」でコーテーションで囲みます。命令と区別する為です。

echo文

・・・出力する。という意味です。関数ではないらしいです。自分の脳みそではここまでしかわかりません。

○タイプ1・・・文字列
<?php echo 'ドリームウィーバー買ってください。’; ?>
文字列をそのまま出力します。(※''で囲みます。)

○タイプ2・・・数値
<?php echo 1200; ?>
数値をそのまま出力します。(※''で囲まなくても大丈夫です。)

○タイプ3・・・変数
<?php echo $_POST['title']; ?>


変数

・・・文字列や数値等の値を格納するもの(※自分には値を入れておく箱的なイメージしか覚え浮かびません。サーバーのメモリに記憶させるみたいです。)
変数の考え方としてはinquiry.htmlではtitleというパラメータでデータが送信されているので、その値を$_POST['title']変数で受け取ります。例えばお問い合わせタイトルに、「PHPについて」と入力して、お問い合わせ内容の確認をボタンをクリックすると、$_POST['title']変数には、「PHPについて」という文字列が入ります。

○変数書き方
「$~」・・・という形式です。
変数名$の後はアルファベット(大文字・小文字)か_(※アンダースコア)で始まります。その後はアルファベット(大文字・小文字)か_(※アンダースコア)か数値が任意の数続く。(基本この法則に従って入力すれば好きな名前が付けられます。でもお決まりの名前的なものがあるようです。基本英語でローマ字はだめだとか・・・英語圏に生まれた人は優遇されてます。)
例)
$123×
$abc○
$_XYZ○


これら2つのファイルを(※inquiry.htmlとcheck_inquiry.php)chap2フォルダに放り込みます。そしたら、apacheを起動してhttp://127.0.0.1/lesson/chap2/inquiry.htmlにアクセスします。↓
お問い合わせフォーム
何か入力して「お問い合わせ内容の確認」ボタンを押してみます。
そうすると確認画面を表示されます。↓
確認画面
↑ドリームウィーバー買ってください。→<?php echo 'ドリームウィーバー買ってください。’; ?>
12000→<?php echo 12000; ?>
で出力してます。おまけでやってみたので別にいれなくてもいいです。

nl2br関数・・・改行タグを<br>、<br />で記述します。
(※最近のPHPのバージョンでは<br />になっています。)
PHPで出力したデータでは改行タグが入っていません。
なのでnl2br関数で改行タグを入れます。

改行コードは\r(CR)か\n(LF)です。最近のphpのバージョンで入る改行タグのデフォルトは<br />なっています。なのでhtmlで作ったものだとw3cの勧告に引っかかるのでfalseを入れます。


<?php echo $_POST['message'], false; ?>


これで、<br>になります。(※このソースはXHTMLで作っているので、本当はfalseは必要ないです。)

check_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>
<p>■お問い合わせ内容を入力してください。</p>
<p>お問い合わせタイトル:
<br />
<?php echo $_POST['title']; ?>
</p>
<p>お問い合わせ内容詳細:
<br />
<?php
//改行部分ににBRを埋め込む
echo nl2br($_POST['message'] , false);
?>

</p>
<p>
<?php echo 'こんにちは’; ?>
<?php echo 1234; ?>
</p>
<input type="submit" value="お問い合わせ内容の確認" />
</p>
</form>
</body>
</html>


↑赤く表示されたところを上のように書き換えます。
//や#はコメントアウトのとき使います。(※記号から行末までがコメントアウト扱いです。)

関数とは

・・・なんか難しいのですが引数というデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群らしいです。引数を入れれば、それに従った結果がでるって感じでいいのかな?

引数とは

・・・プログラムの中で関数やメソッド、サブルーチン等を呼び出すときに使う値のことです。とりあえず今は引数を入れれば関数がそれに従った結果を出すと言う事で覚えます。脳みそが限界です。
関数と引数の関係図解
↑図解にしてみました。
関数から出された結果を戻り値(※返り値)といいます。

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

フリーエリア

にほんブログ村 IT技術ブログ HTML/CSSへ にほんブログ村 IT技術ブログ PHPへ

最新コメント

[11/23 テスト]

プロフィール

HN:
おやっさん
性別:
非公開

バーコード

ブログ内検索

P R

忍者ツールズプロフィール

忍者ツールズプロフィールは終了しました

カウンター