PHPについてのご質問です。現在テキストと画像を投稿できる簡易掲示板をつくっています。今回はテキストと画像の投稿を一緒に行いたいのですが、なかなか解決できません。。個人の投稿欄の中に一緒に画像を入れたいです。。。
PHPの経験が少ないため、どなたかお詳しい方に教えて頂けると幸いです。。
ページは test100.wkeya.com/review3/review.php です。ソースは下記に掲載します。。
よろしくお願いします。m+ +m
review.phpです。
<?php // 外部ファイルからデータを読み込み $dataFile = "bbs.dat"; $posts = file($dataFile, FILE_IGNORE_NEW_LINES); // もし投稿があったら、読み込んだデータに入力されたデータを追加して書き込み if ($_SERVER['REQUEST_METHOD'] == "POST" && !empty($_POST['message'])) { $message = preg_replace("/\r|\n/","",$_POST['message']); if (empty($_POST['user'])) { $newData = $_POST['title']."|".$_POST['rate']."|".$message."|名無しさん"; } else { $newData = $_POST['title']."|".$_POST['rate']."|".$message."|".$_POST['user']; } $newData .= date("|Y/m/d"); array_unshift($posts, $newData); $fp = fopen($dataFile, "w"); fwrite($fp, implode("\n", $posts)); header("Location: http://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}"); exit; } ?> <?php require_once('config.php'); $images = array(); $imageDir = opendir(IMAGES_DIR); while ($file = readdir($imageDir)) { if ($file == '.' || $file == '..') { continue; } if (file_exists(THUMBNAIL_DIR.'/'.$file)) { $images[] = 'thumbnails/'.$file; } else { $images[] = 'images/'.$file; } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>口コミレビュー</title> <link rel="stylesheet" href="reset.css" media="all"> <link rel="stylesheet" href="review.css" media="all"> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/validator.js"></script> <script type="text/javascript" src="js/util.js"></script> </head> <body> <h1>口コミレビュー</h1> <p><a href="#postform">投稿する</a></p> <!--口コミ一覧--> <div id="reviewwrap"> <h2>口コミ投稿一覧 (<?php echo count($posts); ?>件)</h2> <div class="reviewbox"> <?php if (count($posts)) : ?> <?php foreach ($posts as $post) : ?> <?php list($title, $rate, $message, $user, $posted) = explode("|", $post); ?> <ul class="review"> <ul class="reviewhead"> <li class="title"><?php echo htmlspecialchars($title); ?></li> <li class="userate">評価: <img src="<?php echo ($rate); ?>" ></li> </ul> <li class="massage"><?php echo nl2br(htmlspecialchars($message)); ?></li> <li> </li> <li class="user"><?php echo htmlspecialchars($user); ?>さんからの口コミ</li> <li class="day"><?php echo htmlspecialchars($posted); ?></li> </ul> <?php endforeach; ?> <?php else : ?> <p>まだ投稿はありません。</p> <?php endif; ?> </div> </div><!--/reviewwrap--> <!--口コミ一覧--> <!--写真表示ゾーン--> <hr> <?php foreach ($images as $image) : ?> <?php if (strpos($image, 'thumbnails/') === 0) : ?> <a href="images/<?php echo basename($image); ?>" target="_blank"><img src="<?php echo $image; ?>"></a> <?php else : ?> <img src="<?php echo $image; ?>"> <?php endif; ?> <?php endforeach; ?> <!--写真表示ゾーン--> <!--ここから投稿--> <div id="postform"> <form action="" method="post" onSubmit="return Validator.submit(this)"> <dl> <dt>タイトル</dt> <dd><input type="text" name="title" size="50" maxlength="27" onBlur="Validator.check(this)"></dd> <dt>ユーザー評価</dt> <dd> <input type="radio" name="rate" value="img/star201.gif"><img src="img/star201.gif" alt="1つ星" width="78" height="16"> <input type="radio" name="rate" value="img/star202.gif"><img src="img/star202.gif" alt="2つ星" width="78" height="16"> <input type="radio" name="rate" value="img/star203.gif"><img src="img/star203.gif" alt="3つ星" width="78" height="16"> <input type="radio" name="rate" value="img/star204.gif"><img src="img/star204.gif" alt="4つ星" width="78" height="16"> <input type="radio" name="rate" value="img/star205.gif"><img src="img/star205.gif" alt="5つ星" width="78" height="16"> </dd> <dt>口コミ本文</dt> <dd><textarea type="text" name="message" cols="80" rows="10" onBlur="Validator.check(this)"></textarea></dd> <dt>ニックネーム</dt> <dd><input type="text" name="user"></dd> </dl> <input type="submit" value="投稿"> </form> </div> <!--ここまで投稿--> <!--写真投稿--> <form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_FILE_SIZE; ?>"> <input type="file" name="image"> <input type="submit" value="アップロード"> </form> <!--写真投稿--> </body> </html>
upload.phpです。
<?php require_once('config.php'); // エラーチェック if ($_FILES['image']['error'] != UPLOAD_ERR_OK) { echo "エラーが発生しました : ".$_FILES['image']['error']; exit; } $size = filesize($_FILES['image']['tmp_name']); if (!$size || $size > MAX_FILE_SIZE) { echo "ファイルサイズが大きすぎます!"; exit; } // 保存するファイル名 $imagesize = getimagesize($_FILES['image']['tmp_name']); switch($imagesize['mime']){ case 'image/gif': $ext = '.gif'; break; case 'image/jpeg': $ext = '.jpg'; break; case 'image/png': $ext = '.png'; break; default: echo "GIF/JPEG/PNG only!"; exit; } $imageFileName = sha1(time().mt_rand()) . $ext; // 元画像を保存 $imageFilePath = IMAGES_DIR . '/' . $imageFileName; $rs = move_uploaded_file($_FILES['image']['tmp_name'], $imageFilePath); if (!$rs) { echo "could not upload!"; exit; } // 縮小画像を作成、保存 $width = $imagesize[0]; $height = $imagesize[1]; if ($width > THUMBNAIL_WIDTH) { // 元ファイルを画像タイプによって作る switch($imagesize['mime']){ case 'image/gif': $srcImage = imagecreatefromgif($imageFilePath); break; case 'image/jpeg': $srcImage = imagecreatefromjpeg($imageFilePath); break; case 'image/png': $srcImage = imagecreatefrompng($imageFilePath); break; } // 新しいサイズを作る $thumbHeight = round($height * THUMBNAIL_WIDTH / $width); // 縮小画像を生成 $thumbImage = imagecreatetruecolor(THUMBNAIL_WIDTH, $thumbHeight); imagecopyresampled($thumbImage, $srcImage, 0, 0, 0, 0, 200, $thumbHeight, $width, $height); // 縮小画像を保存する switch($imagesize['mime']){ case 'image/gif': imagegif($thumbImage, THUMBNAIL_DIR.'/'.$imageFileName); break; case 'image/jpeg': imagejpeg($thumbImage, THUMBNAIL_DIR.'/'.$imageFileName); break; case 'image/png': imagepng($thumbImage, THUMBNAIL_DIR.'/'.$imageFileName); break; } } // index.phpに飛ばす header('Location: http://'.$_SERVER['SERVER_NAME'].'/review3/review.php'); exit; ?>
こちらが作成中のページです。。。 連続投稿すみません。。_○ v ○:_
form要素のenctype属性をmultipart/form-dataで設定したら文字も画像も両方受けれるよ。<form action="URL" method="post" enctype="multipart/form-data" onSubmit="return Validator.submit(this)">
。。。とか、すみませんとかいうより、何をどうしたいのか具体的に書くべき。普通こういうところに張られた怪しいURLなんて誰も踏まない。
画像は書き込めてんのか、どういう問題で投稿と一緒に表示できないのか、画像は1投稿に複数あるようだけどどの投稿にどのファイルってどうやって見分けてんの。
仕事でやってるなら、外注に出したらいくらかかるか調べてからまたきてね!
このコメ主さんの言うとおりですね。トピ主さんもう少し整理してからきてね。
教えてくださいと、やってくださいは違うよね。基本的に後者には誰も寄りつかないし、それを期待するのは都合が良すぎる話。で、コードをぺっと貼って、盛大にどうぞと言われても、やってくださいとしか受け取れないな。
そうとしか受け取れないよね…
そんなのわかっててダメ元で頼んでんじゃねーの。こわーい。www
みんなの回答 6 件
review.phpです。
<?php
// 外部ファイルからデータを読み込み
$dataFile = "bbs.dat";
$posts = file($dataFile, FILE_IGNORE_NEW_LINES);
// もし投稿があったら、読み込んだデータに入力されたデータを追加して書き込み
if ($_SERVER['REQUEST_METHOD'] == "POST" && !empty($_POST['message'])) {
$message = preg_replace("/\r|\n/","",$_POST['message']);
if (empty($_POST['user'])) {
$newData = $_POST['title']."|".$_POST['rate']."|".$message."|名無しさん";
} else {
$newData = $_POST['title']."|".$_POST['rate']."|".$message."|".$_POST['user'];
}
$newData .= date("|Y/m/d");
array_unshift($posts, $newData);
$fp = fopen($dataFile, "w");
fwrite($fp, implode("\n", $posts));
header("Location: http://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}");
exit;
}
?>
<?php
require_once('config.php');
$images = array();
$imageDir = opendir(IMAGES_DIR);
while ($file = readdir($imageDir)) {
if ($file == '.' || $file == '..') {
continue;
}
if (file_exists(THUMBNAIL_DIR.'/'.$file)) {
$images[] = 'thumbnails/'.$file;
} else {
$images[] = 'images/'.$file;
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>口コミレビュー</title>
<link rel="stylesheet" href="reset.css" media="all">
<link rel="stylesheet" href="review.css" media="all">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/validator.js"></script>
<script type="text/javascript" src="js/util.js"></script>
</head>
<body>
<h1>口コミレビュー</h1>
<p><a href="#postform">投稿する</a></p>
<!--口コミ一覧-->
<div id="reviewwrap">
<h2>口コミ投稿一覧 (<?php echo count($posts); ?>件)</h2>
<div class="reviewbox">
<?php if (count($posts)) : ?>
<?php foreach ($posts as $post) : ?>
<?php list($title, $rate, $message, $user, $posted) = explode("|", $post); ?>
<ul class="review">
<ul class="reviewhead">
<li class="title"><?php echo htmlspecialchars($title); ?></li>
<li class="userate">評価: <img src="<?php echo ($rate); ?>" ></li>
</ul>
<li class="massage"><?php echo nl2br(htmlspecialchars($message)); ?></li>
<li>
</li>
<li class="user"><?php echo htmlspecialchars($user); ?>さんからの口コミ</li>
<li class="day"><?php echo htmlspecialchars($posted); ?></li>
</ul>
<?php endforeach; ?>
<?php else : ?>
<p>まだ投稿はありません。</p>
<?php endif; ?>
</div>
</div><!--/reviewwrap-->
<!--口コミ一覧-->
<!--写真表示ゾーン-->
<hr>
<?php foreach ($images as $image) : ?>
<?php if (strpos($image, 'thumbnails/') === 0) : ?>
<a href="images/<?php echo basename($image); ?>" target="_blank"><img src="<?php echo $image; ?>"></a>
<?php else : ?>
<img src="<?php echo $image; ?>">
<?php endif; ?>
<?php endforeach; ?>
<!--写真表示ゾーン-->
<!--ここから投稿-->
<div id="postform">
<form action="" method="post" onSubmit="return Validator.submit(this)">
<dl>
<dt>タイトル</dt>
<dd><input type="text" name="title" size="50" maxlength="27" onBlur="Validator.check(this)"></dd>
<dt>ユーザー評価</dt>
<dd>
<input type="radio" name="rate" value="img/star201.gif"><img src="img/star201.gif" alt="1つ星" width="78" height="16">
<input type="radio" name="rate" value="img/star202.gif"><img src="img/star202.gif" alt="2つ星" width="78" height="16">
<input type="radio" name="rate" value="img/star203.gif"><img src="img/star203.gif" alt="3つ星" width="78" height="16">
<input type="radio" name="rate" value="img/star204.gif"><img src="img/star204.gif" alt="4つ星" width="78" height="16">
<input type="radio" name="rate" value="img/star205.gif"><img src="img/star205.gif" alt="5つ星" width="78" height="16">
</dd>
<dt>口コミ本文</dt>
<dd><textarea type="text" name="message" cols="80" rows="10" onBlur="Validator.check(this)"></textarea></dd>
<dt>ニックネーム</dt>
<dd><input type="text" name="user"></dd>
</dl>
<input type="submit" value="投稿">
</form>
</div>
<!--ここまで投稿-->
<!--写真投稿-->
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_FILE_SIZE; ?>">
<input type="file" name="image">
<input type="submit" value="アップロード">
</form>
<!--写真投稿-->
</body>
</html>
upload.phpです。
<?php
require_once('config.php');
// エラーチェック
if ($_FILES['image']['error'] != UPLOAD_ERR_OK) {
echo "エラーが発生しました : ".$_FILES['image']['error'];
exit;
}
$size = filesize($_FILES['image']['tmp_name']);
if (!$size || $size > MAX_FILE_SIZE) {
echo "ファイルサイズが大きすぎます!";
exit;
}
// 保存するファイル名
$imagesize = getimagesize($_FILES['image']['tmp_name']);
switch($imagesize['mime']){
case 'image/gif':
$ext = '.gif';
break;
case 'image/jpeg':
$ext = '.jpg';
break;
case 'image/png':
$ext = '.png';
break;
default:
echo "GIF/JPEG/PNG only!";
exit;
}
$imageFileName = sha1(time().mt_rand()) . $ext;
// 元画像を保存
$imageFilePath = IMAGES_DIR . '/' . $imageFileName;
$rs = move_uploaded_file($_FILES['image']['tmp_name'], $imageFilePath);
if (!$rs) {
echo "could not upload!";
exit;
}
// 縮小画像を作成、保存
$width = $imagesize[0];
$height = $imagesize[1];
if ($width > THUMBNAIL_WIDTH) {
// 元ファイルを画像タイプによって作る
switch($imagesize['mime']){
case 'image/gif':
$srcImage = imagecreatefromgif($imageFilePath);
break;
case 'image/jpeg':
$srcImage = imagecreatefromjpeg($imageFilePath);
break;
case 'image/png':
$srcImage = imagecreatefrompng($imageFilePath);
break;
}
// 新しいサイズを作る
$thumbHeight = round($height * THUMBNAIL_WIDTH / $width);
// 縮小画像を生成
$thumbImage = imagecreatetruecolor(THUMBNAIL_WIDTH, $thumbHeight);
imagecopyresampled($thumbImage, $srcImage, 0, 0, 0, 0, 200, $thumbHeight, $width, $height);
// 縮小画像を保存する
switch($imagesize['mime']){
case 'image/gif':
imagegif($thumbImage, THUMBNAIL_DIR.'/'.$imageFileName);
break;
case 'image/jpeg':
imagejpeg($thumbImage, THUMBNAIL_DIR.'/'.$imageFileName);
break;
case 'image/png':
imagepng($thumbImage, THUMBNAIL_DIR.'/'.$imageFileName);
break;
}
}
// index.phpに飛ばす
header('Location: http://'.$_SERVER['SERVER_NAME'].'/review3/review.php');
exit;
?>
こちらが作成中のページです。。。 連続投稿すみません。。_○ v ○:_
テスト掲示板
http://test100.wkeya.com/review3/review.phpform要素のenctype属性をmultipart/form-dataで設定したら文字も画像も両方受けれるよ。
<form action="URL" method="post" enctype="multipart/form-data" onSubmit="return Validator.submit(this)">
。。。とか、すみませんとかいうより、何をどうしたいのか具体的に書くべき。
普通こういうところに張られた怪しいURLなんて誰も踏まない。
画像は書き込めてんのか、どういう問題で投稿と一緒に表示できないのか、
画像は1投稿に複数あるようだけどどの投稿にどのファイルってどうやって見分けてんの。
仕事でやってるなら、外注に出したらいくらかかるか調べてからまたきてね!
教えてくださいと、やってくださいは違うよね。
基本的に後者には誰も寄りつかないし、それを期待するのは都合が良すぎる話。
で、コードをぺっと貼って、盛大にどうぞと言われても、やってくださいとしか受け取れないな。
関連するトピックス