質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

3756閲覧

PHP 掲示板で画像投稿する場合としない場合の処理

ShimoK

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2018/08/20 01:39

編集2018/08/20 01:41

PHPとデータベースを使って掲示板(筋トレ好きな人が主に使うような簡単なもの)を作っています。投稿フォームでは入力内容を入力して登録ボタンを押すとmuscle_bbd.phpに表示されます。その中で画像投稿もでき、データベースにBLOB型で保存して表示することができています。

 今回私がやりたいのは「画像投稿がなくても文章のみの表示ができる」ことです。スクリーンショット画像でNo.131が画像投稿がある場合でNo.132が画像投稿しなかった場合です。このしなかった場合の表示されている画像?を画像投稿がなかった場合は表示させないようにしたいです。

 そのような場合、データベースには何を挿入させればよいのか、そしてそのあとの処理がわからないので教えていただければ幸いです。ちなみにテーブル設計は以下のようになっています

名前データ型
bbd_idint(11)AUTO_INCREMENT
namevarchar(30)
muscle_levelint(10)
muscle_genreint(10)
messagesmediumblob
filevarchar(30)
passwordvarchar(30)
createddatetime(6)
```PHP
//form.php 投稿フォーム
<?php

$db_user = 'test'; // ユーザー名
$db_pass = '〇〇〇〇'; // パスワード
$db_name = '●●●●●'; // データベース名

// MySQLに接続
$mysqli = new mysqli('localhost', $db_user, $db_pass, $db_name);
$mysqli->set_charset("utf8");

//データベース接続におけるエラー処理
if ($mysqli->connect_errno) {
printf("%s\n", $mysqli->connect_errno);
exit();
}

if (isset($_POST["register"])) { //登録ボタンを押されたときの処理 if (empty($_POST["name"])) { echo '<script>alert("名前を入力してください");</script>'; } else if (empty($_POST["muscle_level"]) && empty($_POST["muscle_genre"])) { echo '<script>alert("レベルまたはジャンルを入力してください");</script>'; } else if (empty($_POST["messages"])) { echo '<script>alert("投稿文を入力してください");</script>'; } else if (empty($_POST["password"])){ '<script>alert("削除・変更用パスワードを入力してください");</script>'; } //ファイルがアップロードされていない時の処理 if (empty($_FILES["upfile"]["tmp_name"])) { //XSSの対策 $name = $mysqli->real_escape_string($_POST['name']); //ニックネーム $muscle_level = $mysqli->real_escape_string($_POST['muscle_level']); //筋肉レベル $muscle_genre = $mysqli->real_escape_string($_POST['muscle_genre']); //ジャンル $messages = $mysqli->real_escape_string($_POST['messages']); //コメント $file = 'null'; //画像ファイル $password = $mysqli->real_escape_string ($_POST['password']); //削除・変更するときに使用するパスワード //INSERTでデータをデータベースに挿入 $insert = $mysqli->query("INSERT INTO `message` ( `name`, `muscle_level`, `muscle_genre`, `messages`, `file` , `password`,`created`) VALUES ('{$name}', '{$muscle_level}', '{$muscle_genre}', '{$messages}','{$file}','{$password}', now())"); if (!$insert) { // insert文におけるエラー処理 printf("%s\n", $mysqli->error); exit(); } echo '<script> alert("登録が完了しました。"); location.href="muscle_bbd.php"; </script>'; } else if ($_FILES["upfile"]["tmp_name"]) { //ファイルがアップロードされた場合の処理 $upfile = $_FILES["upfile"]["tmp_name"]; $file = file_get_contents($upfile); $name = $mysqli->real_escape_string($_POST['name']); //ニックネーム $muscle_level = $mysqli->real_escape_string($_POST['muscle_level']); //筋肉レベル $muscle_genre = $mysqli->real_escape_string($_POST['muscle_genre']); //ジャンル $messages = $mysqli->real_escape_string($_POST['messages']); //コメント $file = $mysqli->real_escape_string($file); //画像ファイル $password = $mysqli->real_escape_string ($_POST['password']); //削除・変更するときに使用するパスワード //画像をDBに格納. $insert = $mysqli->query("INSERT INTO `message` ( `name`, `muscle_level`, `muscle_genre`, `messages`, `file`,`password`,`created`) VALUES ('{$name}', '{$muscle_level}', '{$muscle_genre}', '{$messages}','{$file}', '{$password}', now())"); if (!$insert) { // insert文におけるエラー処理 printf("%s\n", $mysqli->error); exit(); } echo '<script> alert("登録が完了しました。"); location.href="muscle_bbd.php"; </script>'; } }

?>

<!DOCTYPE html> <html lang = "ja"> <head> <meta charset = "UFT-8"> <title>筋肉掲示板</title> </head> <body> <h1>筋肉掲示板</h1> <form method = "POST" enctype="multipart/form-data" action = ""> <div> ニックネーム:<br /> <input type="text" name="name" size="20"maxlength="15"><br><br> 筋トレレベル:<br /> <select name="muscle_level" > <option value="">選択してください</option> <option value="1">初級</option> <option value="2">中級</option> <option value="3">上級</option> </select> <br><br> </div><div> ジャンル:<br /> <select name="muscle_genre"> <option value="">選択してください</option> <option value="1">自慢</option> <option value="2">相談</option> <option value="3">その他</option> </select> <br><br> </div> <div> メッセージ:<br /> <textarea name="messages" cols="50" rows="5"></textarea> </div><br> ※画像・動画(添付する場合)<br> <input type="file" name='upfile'></button> <br><br> <div> 削除・変更用パスワード:<br /> <input type="password"maxlength="4" name="password" value="" placeholder="数字4文字"> </div>
<input type = "submit" name = "register"value = "登録" onClick="disp()"/> <ul> <li><a href="muscle_bbd.php">一覧表示</a></li> </ul> </form>
</body> </html> ```

PHP

1//muscle_bbd.php 投稿内容一覧 2<!DOCTYPE HTML> 3<html> 4<herd> 5<meta http-equiv="Content-Type" content="text/html;charset=UFT-8"> 6<title>投稿一覧</title> 7</head> 8<body> 9 <h1>筋肉掲示板</h1> 10 11 <?php 12 $db_user = 'test'; // ユーザー名 13 $db_pass = '〇〇〇〇'; // パスワード 14 $db_name = '●●●●●'; // データベース名 15 16 // MySQLに接続 17 $mysqli = new mysqli('localhost', $db_user, $db_pass, $db_name); 18 $mysqli->set_charset("utf8"); 19 20 //データベース接続におけるエラー処理 21 if ($mysqli->connect_errno) { 22 printf("%s\n", $mysqli->connect_errno); 23 exit(); 24 25 } 26 //message内の一覧表示 27 $result = $mysqli->query("SELECT * from `message` ORDER BY created DESC"); 28 // SELECT文におけるエラー処理 29 if (!$result) { 30 printf("%s\n", $mysqli->error); 31 exit(); 32 } 33 34 foreach ($result as $row) { //データベースに格納されている分だけ表示する 35 $bbd_id = htmlspecialchars($row['bbd_id']); //投稿番号 36 $name = htmlspecialchars($row['name']); //ユーザー名 37 $muscle_level = htmlspecialchars($row['muscle_level']); //筋肉レベル 38 $muscle_genre = htmlspecialchars($row['muscle_genre']); //ジャンル 39 $created = htmlspecialchars($row['created']); //投稿時間 40 $messages = nl2br(htmlspecialchars($row['messages'])); //コメント 41 $file = $row['file']; //画像ファイル 42 $password = htmlspecialchars($row['password']); //削除・変更するときに使用するパスワード 43 44 $imgType = "image/png"; 45 $img = '<img src="data:'.$imgType.';base64,'.base64_encode($file).'" width="193" height = "130" />'; 46 47 echo "[No. ". $bbd_id . " ]" . "$name"; 48 if ($muscle_level == 1) { 49 echo ' 初級'; 50 } else if ($muscle_level == 2) { 51 echo ' 中級'; 52 } else { 53 echo ' 上級'; 54 } " "; 55 56 if ($muscle_genre == 1) { 57 echo ' 自慢'; 58 } else if ($muscle_genre == 2) { 59 echo ' 相談'; 60 } else { 61 echo ' その他'; 62 } " "; 63 64 echo " " . $created. "<br>"; 65 echo "<font size= 4><b>".$messages."</b><br></font>"; 66 echo $img . "<br>"; //画像 67 } 68 69 if (isset($_POST['delete'])) { // 削除ボタンが押され他時の処理 70 if (empty($_POST["bbd_id2"])) { //投稿番号が入力されていなかった場合 71 echo '<script>alert("ID入力してください");</script>'; 72 } else if (empty($_POST["delete_pass"])) { //削除・変更パスワードが入力されていなかった場合 73 echo '<script>alert("パスワードを入力してください");</script>'; 74 } 75 if (!empty($_POST["bbd_id2"]) && !empty($_POST["delete_pass"])) { //bbd_idとpasswordが入力されている場合 76 $bbd_id2 = $mysqli->real_escape_string($_POST["bbd_id2"]); //入力したユーザー名を格納 77 $delete_pass = $mysqli->real_escape_string($_POST['delete_pass']); //入力した削除・変更パスワードを核の王 78 79 // SELECT文におけるエラー処理 80 if (!$result) { 81 printf("%s\n", $mysqli->error); 82 exit(); 83 } 84 85 $delete = $mysqli->query("DELETE FROM `message` WHERE `bbd_id` =$bbd_id2 AND `password` = $delete_pass"); //データベース内の投稿番号・パスワードが入力した投稿番号、削除・変更パスワードと一致したものを削除する 86 $delete_count = $mysqli->affected_rows; // sql文によってdeleteされた件数を取得する 87 88 if($delete_count >= 1){ // 1件以上の場合 89 print '<script> alert("削除完了!"); location.href = "muscle_bbd.php"; </script>'; 90 } else if ($delete_count == 0){ 91 print '<script> alert("パスワードが違います");location.href = "muscle_bbd.php"; </script>'; 92 // delete文におけるエラー処理 93 }else { 94 printf("%s\n", $mysqli->error); 95 exit(); 96 } 97 } 98 } 99 ?> 100 101 <ul> 102 <a href="form.php">投稿する</a><br><a href="home.php">HOME</a> 103 </ul> 104 <form method = "POST" enctype="multipart/form-data" action = "muscle_bbd.php"> 105 削除したいNo<input type="text" name="bbd_id2" size="20"maxlength="15"><br> 106 削除・変更パスワード<input type="password" name ="delete_pass"maxlength="4"value="" placeholder="英数字4文字"> 107 <input type = "submit" name = "delete"value = "削除" /> 108 </form><br> 109 <form method = "POST" action = "change.php"> 110 <input type = "submit" name = "change2"value = "編集画面へ" /> 111 </form> 112 </body> 113</html> 114

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

コードはセキュリティ的にマズイ点が多数あるのでちゃんと読んでないです

そのような場合、データベースには何を挿入させればよいのか、そしてそのあとの処理がわからないので教えていただければ幸いです。

ファイル名称として使用しないファイル名(拡張子なしのno_img)とかnullを使用して、それを取り出したあとのチェックで引っ掛ければ良いかと。

投稿2018/08/20 01:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

画像は別テーブルで管理にする。
bbd_idで紐付ける。

「1投稿につき1画像まで」と「任意の場所に任意の数挿入できる」とで構成変わりますが、
同じテーブルに入るか分からない情報を一緒に持っておくのは非効率と思います。

投稿2018/08/20 02:24

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問