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

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

20100907
Category:梅原 /Tags:

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

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

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

mysql.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);

*/

write_form.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>

write_confirm.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>

write_commit.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>

関連記事:

Comments are closed.