簡易掲示板

こんばんは

1週間ほど前に簡易掲示板を研修で作ったので、記事を書こうと思いながらも時がたってしまいました。

今回はまぁこんな感じです。





簡易掲示板


■名前



■タイトル



■投稿内容



■画像アップロード









入力した内容をサーバ上のCSVに保存していき、保存された内容をフォームの下部にCSVから読み取って表示していく感じです。

index.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>簡易掲示板</title>
</head>

<body>
<?php $maxSize = 1014 * 1024 * 1; ?>
<form method="post" action="/hayama_test/board/done.php" enctype="multipart/form-data">
 	<p>■名前</p>
 	<input type="text" name="id" maxlength="15"><br>
 	<p>■タイトル</p>
 	<input type="text" name="title" maxlength="20"><br>
 	<p>■投稿内容</p>
 	<textarea style="margin-bottom:5px;" name="body" cols="32" rows="4"></textarea><br>
 	<p>■画像アップロード</p>
 	<input style="margin-bottom:5px;" type="file" name="upfile"><br>
 	<input type="submit" name="write" value="投稿">
 	<a style="text-decoration:none;" href="/hayama_test/board/download.php"><input type="button" name="download" value="CSVダウンロード"></a><hr>
</form>

<div style="background-color:#cccccc;">

<?php

require_once ("func.php");

  show_bbs();

?>

</div>
</body>
</html>

done.php

<?php
require_once ("func.php");


// 入力内容に空欄があるかチェック
if($_POST["id"] == "" || $_POST["title"] == "" || $_POST["body"] == ""){
	echo htmlspecialchars("入力項目に空欄があります。");
	exit;
}		

// 画像がアップロードされたか調べる

if(isset($_FILES["upfile"])){
	if($_FILES["upfile"]["error"] == 0){
		save_img();
	}
}

// 画像のファイルサイズ制限
if($_FILES["upfile"]["size"] > 1038336){
	echo "ファイルサイズが上限を超えています";
	exit;
}


// 入力された値を変数に格納

if($_POST["write"]){
	$id = $_POST["id"];
	$title = $_POST["title"];
	$body = $_POST["body"];
}else{
	echo htmlspecialchars("投稿失敗");
	exit;
}

$img = "";

if($_FILES["upfile"]["name"] != NULL){
	$img = "./imgfile/" . $_FILES["upfile"]["name"];
}

$line = array($id, $title, $body, $img);


// CSVファイルへ入力内容を保存

$file_name = "bbs.csv";
$fp = fopen($file_name, "r+");

if (flock($fp, LOCK_EX)) {

	$csvtext = fread($fp, filesize($file_name));

	ftruncate($fp,0);
	rewind($fp);

	$result = fputcsv($fp, $line);

	fwrite($fp, $csvtext);

	flock($fp, LOCK_UN);
}

fclose($fp);

if($result){
	header("location: /hayama_test/board/index.php");
}else{
	echo htmlspecialchars("失敗");
}

func.php

<?php

// アップロードされた画像の保存

function save_img(){

	$tmp_file = $_FILES["upfile"]["tmp_name"];
	

	if(!is_uploaded_file($tmp_file)){
		echo "アップロードされたファイルが不正です";
		exit;
	}


	$finfo = finfo_open(FILEINFO_MIME_TYPE);
	$type = finfo_file($finfo, $tmp_file);
	if($type != "image/jpeg" && $type != "image/png" && $type != "image/gif"){
		echo "送信されたファイルが画像ではありません";
		exit;
	}


	if(!move_uploaded_file($tmp_file, "./imgfile/" . $_FILES["upfile"]["name"])){
		echo "アップロードに失敗しました";
		exit;
	}

}

// CSVファイルから内容を読み込む

function show_bbs(){

	$fp = fopen("bbs.csv", "r");

	flock($fp, LOCK_EX);



	while($data = fgetcsv($fp, 10000)) {

	  $id = htmlspecialchars($data["0"], ENT_QUOTES,"UTF-8");
	  $title = htmlspecialchars($data["1"], ENT_QUOTES,"UTF-8");
	  $body = htmlspecialchars($data["2"], ENT_QUOTES,"UTF-8");
	  $img = htmlspecialchars($data["3"], ENT_QUOTES,"UTF-8");

	  $body = nl2br($body, FALSE);

		if($data["0"] != NULL || $data["1"] != NULL || $data["2"] != NULL){

			  print_r("<p>■名前</p>");
			  print_r("<p style='margin-bottom:10px;'>$id</p>");

			  print_r("<p>■タイトル</p>");
			  print_r("<p style='margin-bottom:10px;'>$title</p>");

			  print_r("<p>■投稿内容</p>");
			  print_r("<p style='margin-bottom:10px;width:400px;'>$body</p>");

			  print_r("<p>■アップした画像</p>");
			  if($img != ""){
			    print_r("<div style='margin-bottom:10px;'><img src='$img'></div><br>");
			  }else{
			    print_r("<p>No image...</p>");
			  }
			  
			  print_r("<hr>");
		}
	}


	flock($fp, LOCK_UN);

}

index.phpは見た目でdone.phpが実際にCSVに入力した値を保存したり変換したりしてるところで、
func.phpは今回は少ないですがユーザ定義関数をいれています。

csvの保存の仕方がエレガントではないって先輩に言われちゃいましたので、その辺はまた後日
説明しますー

そして、はてな記法がなかなかなれない。。。