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

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

ただいまの
回答率

90.46%

  • PHP

    24641questions

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

  • MySQL

    7166questions

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

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 268

ShimoK

score 7

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

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

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

名前 データ型
bbd_id int(11) AUTO_INCREMENT
name varchar(30)
muscle_level int(10)
muscle_genre int(10)
messages mediumblob
file varchar(30)
password varchar(30)
created datetime(6)
//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>
//muscle_bbd.php 投稿内容一覧
<!DOCTYPE HTML>
<html>
<herd>
<meta http-equiv="Content-Type" content="text/html;charset=UFT-8">
<title>投稿一覧</title>
</head>
<body>
   <h1>筋肉掲示板</h1>

  <?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();

    }
      //message内の一覧表示
     $result = $mysqli->query("SELECT * from `message` ORDER BY created DESC");
      // SELECT文におけるエラー処理
    if (!$result) {
      printf("%s\n", $mysqli->error);
      exit();
    }

      foreach ($result as $row) { //データベースに格納されている分だけ表示する
        $bbd_id = htmlspecialchars($row['bbd_id']); //投稿番号
        $name = htmlspecialchars($row['name']); //ユーザー名
        $muscle_level = htmlspecialchars($row['muscle_level']); //筋肉レベル
        $muscle_genre = htmlspecialchars($row['muscle_genre']); //ジャンル
        $created = htmlspecialchars($row['created']); //投稿時間
        $messages = nl2br(htmlspecialchars($row['messages'])); //コメント
        $file = $row['file']; //画像ファイル
        $password = htmlspecialchars($row['password']); //削除・変更するときに使用するパスワード

        $imgType = "image/png";
        $img = '<img src="data:'.$imgType.';base64,'.base64_encode($file).'" width="193" height = "130" />';

        echo "[No. ". $bbd_id . " ]" . "$name";
        if ($muscle_level == 1) {
            echo ' 初級';
        } else if ($muscle_level == 2) {
            echo ' 中級';
        } else {
            echo ' 上級';
        } " ";

        if ($muscle_genre == 1) {
            echo ' 自慢';
        } else if ($muscle_genre == 2) {
            echo ' 相談';
        } else {
            echo ' その他';
        } " ";

        echo " " . $created. "<br>";
        echo "<font size= 4><b>".$messages."</b><br></font>";
        echo $img . "<br>"; //画像
      }

      if (isset($_POST['delete'])) { // 削除ボタンが押され他時の処理
        if (empty($_POST["bbd_id2"])) { //投稿番号が入力されていなかった場合
          echo '<script>alert("ID入力してください");</script>';
        } else if (empty($_POST["delete_pass"])) { //削除・変更パスワードが入力されていなかった場合
          echo '<script>alert("パスワードを入力してください");</script>';
        }
        if (!empty($_POST["bbd_id2"]) && !empty($_POST["delete_pass"])) { //bbd_idとpasswordが入力されている場合
          $bbd_id2 = $mysqli->real_escape_string($_POST["bbd_id2"]); //入力したユーザー名を格納
          $delete_pass = $mysqli->real_escape_string($_POST['delete_pass']); //入力した削除・変更パスワードを核の王

          // SELECT文におけるエラー処理
          if (!$result) {
            printf("%s\n", $mysqli->error);
            exit();
          }

          $delete = $mysqli->query("DELETE FROM `message` WHERE `bbd_id` =$bbd_id2 AND `password` = $delete_pass"); //データベース内の投稿番号・パスワードが入力した投稿番号、削除・変更パスワードと一致したものを削除する
          $delete_count = $mysqli->affected_rows; // sql文によってdeleteされた件数を取得する

          if($delete_count >= 1){ // 1件以上の場合
             print '<script> alert("削除完了!"); location.href = "muscle_bbd.php"; </script>';
          } else if ($delete_count == 0){
             print '<script> alert("パスワードが違います");location.href = "muscle_bbd.php"; </script>';
           // delete文におけるエラー処理
          }else {
             printf("%s\n", $mysqli->error);
             exit();
          }
        }
      }
    ?>

   <ul>
     <a href="form.php">投稿する</a><br><a href="home.php">HOME</a>
   </ul>
   <form method = "POST" enctype="multipart/form-data" action = "muscle_bbd.php">
       削除したいNo<input type="text" name="bbd_id2" size="20"maxlength="15"><br>
       削除・変更パスワード<input type="password" name ="delete_pass"maxlength="4"value="" placeholder="英数字4文字">
     <input type = "submit" name = "delete"value = "削除" />
   </form><br>
   <form method = "POST" action = "change.php">
     <input type = "submit" name = "change2"value = "編集画面へ" />
   </form>
 </body>
</html>


イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+4

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24641questions

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

  • MySQL

    7166questions

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