PHP 『 超 』 初心者勉強会 PHP + MySQL 応用編 2回目に参加して来ました

今日はセッション管理とか。
ああ、今まで適当にごまかして来てたな、とか反省しながら。

PHP 『 超 』 初心者勉強会 PHP + MySQL 応用編 2回目

エスケープ処理がhtmlentitiesとmysql_real_escape_stringとでは微妙に違っていて、間違えそう。
あと、セッション処理はやっぱり自分で作らないと身に付かないよね。やっぱり。

mysql.php

[sourcecode language=”php”]
<?php

// セッションの開始
// php.iniに設定できる。普通20分くらい。
// クッキーと連携しているので、ブラウザを変えると切れる
session_start();

// headerの出力
header("Content-type: text/html; charset=utf-8");

// MySQLに接続する
$con = mysql_connect( ‘localhost’, ‘sample’, ‘123456’ );

// データベースの選択
mysql_select_db( ‘sample’, $con );

// 文字コードの設定
mysql_query( ‘SET NAMES utf8’ ); // Shift JIS = sjis, EUC JP = ujis

// SELECT文

// INSERT文

// UPDATE文

// DELETE文

/*

// SQLの送信
$res = mysql_query( " SELECT * FROM t_title ", $con );

// レコードを取得
$record = mysql_fetch_assoc($res);
var_dump($record);

$record = mysql_fetch_assoc($res);
var_dump($record);

$record = mysql_fetch_assoc($res);
var_dump($record);

// エラーを出力
echo mysql_error($con);

exit;

$val = mysql_real_escape_string($val);
$res = mysql_query($sql, $con);
$err = mysql_errno($con);
$str = mysql_error($con);
$row = mysql_num_rows($res);
$row = mysql_affected_rows($con);
$id = mysql_insert_id($con);

*/

[/sourcecode]

write_form.php

[sourcecode language=”php”]
<?php

include(‘mysql.php’);

?>
<html>
<head>
<title>書き込みフォーム</title>
</head>
<body>
<p>書き込みフォーム</p>
<?php

// 決め打ち
$title_id = 1;

$name = $_SESSION[‘name’];
$email = $_SESSION[‘email’];
$comment = $_SESSION[‘comment’];
var_dump($email);
printf("<br />");
var_dump($_SESSION);

// タグをエスケープ
$name = htmlentities($name, ENT_QUOTES, ‘utf-8’);
$email = htmlentities($email, ENT_QUOTES, ‘utf-8’);
$comment = htmlentities($comment, ENT_QUOTES, ‘utf-8’);

?>
<div style="border:1px solid black; margin:20px; padding:20px;">
<form action="write_confirm.php" method="post" style="margin-top:20px;">
<input type="hidden" name="title_id" value="<?php echo $title_id; ?>">
名前:<input type="text" name="name" value="<?php echo $name; ?>">
E-mail:<input type="text" name="email" value="<?php echo $email; ?>">
<input type="submit" name="" value=" 書き込む "><br/>
<textarea name="comment" style="width:500px; height:120px; "><?php echo $comment; ?></textarea>
</form>
</div>

</body>
</html>

[/sourcecode]

write_confirm.php

[sourcecode language=”php”]
<?php

include(‘mysql.php’);

?>
<html>
<head>
<title>書き込み – 確認画面</title>
</head>
<body>
<p>書き込み – 確認画面</p>
<?php

// 投稿内容を取得
$title_id = $_POST[‘title_id’];
$name = $_POST[‘name’];
$email = $_POST[‘email’];
$comment = $_POST[‘comment’];

// 投稿内容をセッションに保存
$_SESSION[‘name’] = $name;
$_SESSION[‘email’] = $email;
$_SESSION[‘comment’] = $comment;

//↓のようにはしない。これをやるとセッションから取り出す時におかしくなる。
//セッションではエスケープして管理されているので、
//二重にエスケープされてしまうため(?)。
//セッションは変数としてあつかえるので、エスケープする必要は無い。
//$_SESSION[‘name’] = htmlentities( $name, ENT_QUOTES, ‘utf-8’);

// タグをエスケープ
$name = htmlentities( $name, ENT_QUOTES, ‘utf-8’);
$email = htmlentities( $email, ENT_QUOTES, ‘utf-8’);
$comment = htmlentities( $comment, ENT_QUOTES, ‘utf-8’);

if( empty($comment) ){
$error_message = ‘コメントが未入力です’;
}

?>
<strong style="color:red;"><?php echo $error_message; ?></strong>
<div>
名前:<?php echo $name; ?><br/>
E-mail:<?php echo $email; ?><br/>
内容:<br/>
<?php echo nl2br($comment); ?>
</div>

<!– ここは良くないプログラム書き方 –>
<?php
if( empty($error_message) ){
?>
<form action="write_commit.php" method="post">
<input type="submit" value="上記内容でよければ書き込む" />
</form>
<?php
}
?>

<p>
変更する場合は、戻るボタンで戻って書き直して下さい。
</p>

</body>
</html>

[/sourcecode]

write_commit.php

[sourcecode language=”php”]
<?php

include(‘mysql.php’);

?>
<html>
<head>
<title>書き込み – 完了画面</title>
</head>
<body>
<p>書き込み – 完了画面</p>
<?php

// Postからではない。Postからだと、改変の可能性がある。
// セッションから取得
$title_id = $_SESSION[‘title_id’];
$name = $_SESSION[‘name’];
$email = $_SESSION[‘email’];
$comment = $_SESSION[‘comment’];
$_SESSION = array(); // セッションをクリア

// タグをエスケープ
$title_id = (int)$title_id; // 型変換, 型キャスト
/*
しないほうがいい。
$name = htmlentities($name, ENT_QUOTES, ‘utf-8’);
$email = htmlentities($email, ENT_QUOTES, ‘utf-8’);
$comment = htmlentities($comment, ENT_QUOTES, ‘utf-8’);
*/

// エスケープ処理
//SQLインジェクション対策
$title_id = mysql_real_escape_string($title_id);
$name = mysql_real_escape_string($name);
$email = mysql_real_escape_string($email);
$comment = mysql_real_escape_string($comment);
$insert_time = date(‘Y-m-d H:i:s’); // 新規レコード作成時間
//$insert_time = date(‘Y年m月d日 H:i:s’,time()); // 新規レコード作成時間

// t_commentに新規書き込みを挿入
$qu = " INSERT INTO t_comment "
. " ( title_id, name, email, comment, insert_time ) "
. " VALUES ( $title_id, ‘$name’, ‘$email’, ‘$comment’, ‘$insert_time’ ) ";
$re = mysql_query($qu);
//SQl文を表示
echo $qu;

// エラーをチェック
if( mysql_errno($con) ){
// SQLエラーが発生した
echo mysql_error($con);
echo "<p>エラーが発生しました</p>";
}

?>
<p>書き込みました。</p>
<p><a href="write_form.php">戻る</a></p>

</body>
</html>

[/sourcecode]