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

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

ただいまの
回答率

89.63%

php 掲示板 画像投稿

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 95

huku

score 3

現在php掲示板を制作しています。
コメントだけでなく、画像や動画も投稿できるようにしたいため、投稿したらsqlに保存し、表示する際に拡張子で識別したいと考えています。
しかし、調べてある程度はできたのですが、うまく動かない状態です。
具体的には
1、番号、コメント、画像、番号、コメント、画像の順で出したいのですが、画像が一回ですべて出てしまい、順番道理に表示されない。
2、投稿以外の編集ボタンや消去ボタンを一回押すと投稿が表示されなくなる。

この二つが起こって、前に進めない状況です。
sqlは
![イメージ説明](c92194a17b00c7ee57ce0c0c96ffe3f4.png)
このように構成しており

コードは上がindex.php したがimport_media.phpとしています。
文字数が入らなかったため分けていますが、2つ目のhtmlのコードはindex.phpと同じファイルです。
生きず待っているのでどなたか助けていただけないでしょうか?
よろしくお願いします。

<?php
session_start();
// include 'login.php';

$db_host = 'localhost';
$db_name = '';
$db_user = '';
$db_pass = '';

// データベースへ接続する
$link = mysqli_connect( $db_host,$db_user,$db_pass,$db_name );

if ( $link !== false ) {
        $err_msg1 = "";
        $err_msg2 = "";
        $err_msg7= "";
        $err_msg15="";
        $err_msg16="";
        $message ="";
        $passmessage="";
        $name=( isset( $_POST["name"] ) === true ) ?$_POST["name"]: "";
        $text=( isset( $_POST["text"] ) === true ) ?$_POST["text"]: "";
        $password=( isset( $_POST["password"] ) === true ) ?$_POST["password"]: "";
        $upfile=(isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error']) && $_FILES["upfile"]["name"] !== "") ?$_POST["upfile"]: "";


            if ( isset($_POST["posting"] ) === true ) {
              if ( $name     === "" ) $err_msg1 = "名前を入力してください";
              if (($text     === "") && ($upfile    === "")) $err_msg2 = "コメント、画像を入力してください";
              if (($text     === "") && ($upfile    !== "")) $err_msg15 = "コメントを入力してください";
              if (($text     !== "") && ($upfile    === "")) $err_msg16 = "画像を選択してください";
              if ( $password === "" ) $err_msg7 = "パスワードを入力してください";
              if ( ($err_msg1 === "") && ($err_msg15 === "") && ($err_msg7 === "") && ($err_msg2 === "") ) {
                $query = " INSERT INTO board ( "
                       . "    name , "
                       . "    text , "
                       . "    password   "
                       . " ) VALUES ( "
                       . "'" . mysqli_real_escape_string( $link, $name ) ."', "
                       . "'" . mysqli_real_escape_string( $link, $text ) ."', "
                       . "'" . mysqli_real_escape_string( $link, $password ) ."'  "
                       ." ) ";

                $res   = mysqli_query( $link, $query );
                  $message = "投稿に成功しました。";
                }
              }

          if ( isset($_POST["posting"] ) === true ) {
            if ( $name     === "") $err_msg1 = "名前を入力してください";
            if (($text     === "") && ($upfile    === "")) $err_msg2 = "コメント、画像を入力してください";
            if (($text     === "") && ($upfile    !== "")) $err_msg15 = "コメントを入力してください";
            if (($text     !== "") && ($upfile    === "")) $err_msg16 = "画像を選択してください";

            if ( $password === "" ) $err_msg7 = "パスワードを入力してください";
            if ( ($err_msg1 === "") && ($err_msg16 === "") && ($err_msg7 === "") && ($err_msg2 === "") ) {

              // 画像投稿
              try{
                $user = "";
                $pass = "";
                $pdo = new PDO("mysql:host=;dbname=;charset=utf8", $user, $pass);


                  //エラーチェック
                  switch ($_FILES['upfile']['error']) {
                    case UPLOAD_ERR_OK: // OK
                    break;
                    case UPLOAD_ERR_NO_FILE:   // 未選択
                    throw new RuntimeException('ファイルが選択されていません', 400);
                    case UPLOAD_ERR_INI_SIZE:  // php.ini定義の最大サイズ超過
                    throw new RuntimeException('ファイルサイズが大きすぎます', 400);
                    default:
                    throw new RuntimeException('その他のエラーが発生しました', 500);
                  }


                  //画像・動画をバイナリデータにする.
                  $raw_data = file_get_contents($_FILES['upfile']['tmp_name']);

                  //拡張子を見る
                  $tmp = pathinfo($_FILES["upfile"]["name"]);
                  $extension = $tmp["extension"];
                  if($extension === "jpg" || $extension === "jpeg" || $extension === "JPG" || $extension === "JPEG"){
                    $extension = "jpeg";
                  }
                  elseif($extension === "png" || $extension === "PNG"){
                    $extension = "png";
                  }
                  elseif($extension === "gif" || $extension === "GIF"){
                    $extension = "gif";
                  }
                  elseif($extension === "mp4" || $extension === "MP4"){
                    $extension = "mp4";
                  }
                  else{
                    echo "非対応ファイルです.<br/>";
                    echo ("<a href=\"index.php\">戻る</a><br/>");
                    exit(1);
                  }

                  //DBに格納するファイルネーム設定
                  //サーバー側の一時的なファイルネームと取得時刻を結合した文字列にsha256をかける.
                  $date = getdate();
                  $fname = $_FILES["upfile"]["tmp_name"].$date["year"].$date["mon"].$date["mday"].$date["hours"].$date["minutes"].$date["seconds"];
                  $fname = hash("sha256", $fname);


                //画像・動画をDBに格納.
                $sql = "INSERT INTO board (name, text, password, fname, extension, raw_data ) VALUES (:name,:text ,:password,:fname, :extension, :raw_data);";
                $stmt = $pdo->prepare($sql);
                $stmt -> bindValue(":name",$name, PDO::PARAM_STR);
                $stmt -> bindValue(":text",$text, PDO::PARAM_STR);
                $stmt -> bindValue(":password",$password, PDO::PARAM_STR);
                $stmt -> bindValue(":fname",$fname, PDO::PARAM_STR);
                $stmt -> bindValue(":extension",$extension, PDO::PARAM_STR);
                $stmt -> bindValue(":raw_data",$raw_data, PDO::PARAM_STR);
                $stmt -> execute();


                // $res   = mysqli_query( $link, $sql );

              }

              catch(PDOException $e){
                echo("<p>500 Inertnal Server Error</p>");
                exit($e->getMessage());
              }

                $message = "投稿に成功しました。";
              }
            }

            $query  = "SELECT id, name, text, date, password, fname, extension, raw_data FROM board ORDER BY id";
            $res    = mysqli_query( $link,$query );
            $data = array();
            while( $row = mysqli_fetch_assoc( $res ) ) {
              array_push( $data, $row);
            }

        // 編集フォーム
        $err_msg3 = "";
        $err_msg4 = "";
        $err_msg5 = "";
        $err_msg9 = "";
        $message2 ="";
        $renum=( isset( $_POST["renum"] ) === true ) ?$_POST["renum"]: "";
        $rename=( isset( $_POST["rename"] ) === true ) ?$_POST["rename"]: "";
        $retext=( isset( $_POST["retext"] ) === true ) ?$_POST["retext"]: "";
        $pass2ed=( isset( $_POST["pass2ed"] ) === true ) ?$_POST["pass2ed"]: "";

        if (  isset($_POST["edit"] ) ===  true ) {

          if ( $renum   === "" ) $err_msg3 = "番号を入力してください";
          if ( $rename   === "" ) $err_msg4 = "名前を入力してください";
          if ( $retext  === "" )  $err_msg5 = "コメントを入力してください";
          if ( $pass2ed  === "" )  $err_msg9 = "パスワードを入力してください";

          if ( ($err_msg3 === "") && ($err_msg4 === "") && ($err_msg5 === "") && ($err_msg9 === "") ) {
            foreach( $data as $key => $val ){
                  if ($val['id'] !== $renum) {
                  }
                  else {  // <-- 投稿番号と編集番号が一致
                    if ($val['password'] === $pass2ed){
                      // ここに編集のコード書く
                      $sql = "UPDATE board SET name = '$rename', text = '$retext' WHERE id = '$renum'";
                      $res = $link->query($sql);

                      $message2 = "編集に成功しました。";
                    }
                    else {
                      $message2 = "編集に失敗しました。パスワードが間違っています。";
                    }
                  }
                if ($message2 === '') {
                  $message2 = "編集に失敗しました。編集番号が一致しませんでした。";
                }
            }
          }
        }
        // 消去フォーム
        $err_msg6 = "";
        $err_msg8 = "";
        $delete   = ( isset( $_POST["delnum"] )   === true ) ? $_POST["delnum"]   : "";
        $pass3del = ( isset( $_POST["pass3del"] ) === true ) ? $_POST["pass3del"] : "";



        if ( isset($_POST["delete"] ) ===  true ) {
          if ( $delete   === "" ) $err_msg6 = "番号を入力してください";
          if ( $pass3del === "" ) $err_msg8 = "パスワードを入力してください";

          if ( ($err_msg6 === "") && ($err_msg8 === "") ) {
            foreach( $data as $key => $val ){
              if ( $val['id'] !== $delete ) {
              }
              else {
                if ($val['password'] === $pass3del) {
                  // ここに書き変えのコードを書く
                  $sql = "DELETE FROM board WHERE id = '$delete'";
                  $res = $link->query($sql);
                  $err_msg6 = $delete . "番の消去に成功しました。";

                }
                else {
                  $err_msg8 = $delete . "番の消去に失敗しました。パスワードが間違っています。";
                }
              }
            }

            if ( ($err_msg6 === '') && ($err_msg8 === '') ) {
              $err_msg6 = $delete . '番に一致するものを見つけられませんでした。';
            }
          }
         }

    } else {
        echo "データベースの接続に失敗しました";
    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

0

try{
$user = "";
$pass = "";
$pdo = new PDO("mysql:host=;dbname=;charset=utf8", $user, $pass);
の部分がifの中にあり、外部からのあくせくができなくなっていたためこの部分を外に出すことで解決することができました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

追記

<!DOCTYPE html>
<html lang="ja">
<head>
    <!-- <meta charset="UTF-8N"> -->
    <title>掲示板</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <link rel="stylesheet" href="./styles.css" type="text/css">
    <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
</head>
<body>

<h1>掲示板</h1>
<section>
    <h2>新規投稿</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
         名前 : <input type="text" name="name"  value="<?php echo $sessionname ?>" readonly> <?php echo $err_msg1; ?><br>
        コメント: <input type="text" name="text" > <?php echo $err_msg2; ?><br>

        <label>画像/動画アップロード</label>
        <input type="file" name="upfile" enctype="multipart/form-data">
        <?php echo $err_msg15 ?>
        <?php echo $err_msg16 ?>

        <br>
        ※画像はjpeg方式,png方式,gif方式に対応しています.動画はmp4方式のみ対応しています.<br>

        パスワードを設定 <input type="text" name="password" > <?php echo $err_msg7; ?>
        <input type="submit" value="投稿" name="posting"><br>
        <?php echo $message; ?>
    </form>

    <h2>投稿編集</h2>
    <form action="index.php" method="post">
      編集番号 <input type="number" name="renum"> <?php echo $err_msg3; ?><br>
      名前: <input type="text" name="rename" value="<?php echo $sessionname ?>" readonly><?php echo $err_msg4; ?><br>
      コメント: <input type="text" name="retext" > <?php echo $err_msg5; ?><br>
      パスワードを入力 <input type="text" name="pass2ed" ><?php echo $err_msg9; ?><br>
      <input type="submit" value="編集" name="edit"><br>
      <?php echo $message2; ?>
    </form>

    <h2>消去</h2>
    <form action="index.php" method="post">
      消去番号 <input type="number" name="delnum">     <?php echo $err_msg6; ?><br>
      パスワードを入力 <input type="text" name="pass3del" > <?php echo $err_msg8; ?><br>
      <a class="delp" href="#">消去</a><br><br>

      <!-- パスワード確認モーダル -->
      <div class="confirm">
        <div class="confirm-wrapper">
          <p class="batsu"><i class="fas fa-times"></i></p>
          <div class="clear"></div>
          <h1>本当に消去してもいいですか?</h1>
          <input type="submit" value="はい" name="delete">  <br><br>
          <input type="submit" value="いいえ" name="delete3">  <br>
        </div>
      </div>
    </form>

</section>
<section>
    <h2>投稿一覧</h2>
</section>
<?php
   if ($val['id'] === "") {
       echo "投稿がありません";
   } else {
     $sql = "SELECT  * FROM board ORDER BY id;";
     $stmt = $pdo->prepare($sql);
     $stmt -> execute();
     foreach( $data as $key => $val ){
     echo $val['id'] . ' '  . $val['name'] . ' ' . $val['text'] . ' ' . $val['date'] . '<br>';
     while ($row = $stmt -> fetch(PDO::FETCH_ASSOC)){
       // echo ($row["id"]."<br/>");
       // 動画と画像で場合分け
       $target = $row["fname"];
       if($row["id"] === $val['id'] && $row["extension"] == "mp4"){
          echo ("<video src=\"import_media.php?target=$target\" width=\"426\" height=\"240\" controls></video>");
       }
       elseif($row["id"] === $val['id'] && $row["extension"] == "jpeg" || $row["extension"] == "png" || $row["extension"] == "gif"){
         echo ("<img src='import_media.php?target=$target'>");
         // echo '<img src="./import_media.php?id='.$row["id"].'" />';
       }
       // echo ("<br/><br/>");
     }

    }
 ?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function(){
  $('.delp').click(function(){
    $('.confirm').addClass('open');
  });
  $('.batsu').click(function(){
    $('.confirm').removeClass('open');
});
  });
</script>
</body>
</html>
<?php
    if(isset($_GET["target"]) && $_GET["target"] !== ""){
        $target = $_GET["target"];
    }
    else{
        header("Location: index.php");
    }
    $MIMETypes = array(
        'png' => 'image/png',
        'jpeg' => 'image/jpeg',
        'gif' => 'image/gif',
        'mp4' => 'video/mp4'
    );
    try {
        $user = "kadai2_user";
        $pass = "kadai2_pass";
        $pdo = new PDO("mysql:host=localhost;dbname=;charset=utf8", $user, $pass);
        $sql = "SELECT * FROM board WHERE fname = :target;";
        $stmt = $pdo->prepare($sql);
        $stmt -> bindValue(":target", $target, PDO::PARAM_STR);
        $stmt -> execute();
        $row = $stmt -> fetch(PDO::FETCH_ASSOC);
        header("Content-Type: ".$MIMETypes[$row["extension"]]);
        echo ($row["raw_data"]);
    }
    catch (PDOException $e) {
        echo("<p>500 Inertnal Server Error</p>");
        exit($e->getMessage());
    }
?>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/02/15 09:26

    質問は編集できるので回答やコメントを使うのではなく、質問本文を更新してください。

    キャンセル

  • 2020/02/15 14:30

    文字数オーバーでで入らなかったんです(>人<)

    キャンセル

  • 2020/02/15 15:37

    ではコードをもっとミニマムな構成のコードにされては。現象が再現するとのであれば良いわけですし、回答者としても単に全部投げられてもストレスなので。

    キャンセル

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

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

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