前提・実現したいこと
PHPで画像とテキストを一枚のカードにして投稿し、表示する掲示板を作成しています。
テキストの保存-->表示はできているのですが、問題はデータベースに保存されている画像を表示する正しい方法がわからなくて困っています。
画像とテキストを投稿・表示された時には、以下のようなエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Undefined index: image in createset.php on line 4 Undefined index: image in mypage.php on (画像を表示する箇所の.. <img src="<?php print(htmlspecialchars($post['image'], ENT_QUOTES)); ?>" class="card-img-top">)
該当のソースコード
createset.php
PHP
1<?php 2if (!empty($_POST)) { 3 if ($_POST['image'] !== '' && $_POST['title'] !== '' && $_POST['description'] !== '') { 4 $image = date('YmdHis') . $_FILES['image']['name']; 5 $_POST['image'] = $image; 6 7 // パーツセットの情報をデータベースに保存 8 $card = $db->prepare('INSERT INTO posts SET card_image=?, title=?, description=?, user_id=?, created_at=NOW()'); 9 $card->execute(array( 10 $_POST['image'], 11 $_POST['title'], 12 $_POST['description'], 13 $user['id'] 14 )); 15 16 header('Location: mypage.php'); 17 exit(); 18 } 19} 20 21?>
posts.php
PHP
1<?php 2// ユーザーidと投稿ユーザーidを照合し、全パーツセットを$limit件ずつ取得 3$posts = $db->prepare("SELECT u.name, u.sns_name, u.picture, p.* FROM users u, posts p WHERE u.id=p.user_id ORDER BY p.created_at DESC LIMIT {$start}, {$limit}"); 4 5// postsテーブルからデータを$limit件取得 6$posts->execute(); 7$posts = $posts->fetchAll(PDO::FETCH_ASSOC); 8 9?> 10
mypage.php
PHP
1<?php 2ini_set('display_errors', 1); 3session_start(); 4require('dbconnect.php'); 5 6include('createset.php'); 7 8include('paging.php'); 9include('posts.php'); 10 11?> 12 13 14 <center> 15 <a href="#" class="btn btn-danger col-12 mb-4 mx-auto" data-toggle="modal" data-target="#myModal">パーツセットを作成する</a> 16 </center> 17 18 <!-- My-Card-Items --> 19 <div class="row"> 20 <?php foreach ($posts as $post): ?> 21 <?php if ($_SESSION['id'] == $post['user_id']): ?> 22 <div class="col-12 col-sm-6 col-md-4 col-lg-4"> 23 <div class="card"> 24 <a href="#"> 25 <div class="row no-gutters card-area"> 26 <img src="<?php print(htmlspecialchars($post['image'], ENT_QUOTES)); ?>" class="card-img-top"> 27 </div> 28 </a> 29 <div class="title-area"> 30 <a href="view.php?card_id=<?php print(htmlspecialchars($post['card_id'])); ?>" class="title"><?php print(htmlspecialchars($post['title'], ENT_QUOTES)); ?></a> 31 </div> 32 <div class="profile-area"> 33 <div class="profile-thum"> 34 <a href="#"> 35 <img src="user_picture/<?php print(htmlspecialchars($post['picture'], ENT_QUOTES)); ?>" class="rounded-circle" alt="画像"> 36 </a> 37 </div> 38 <div class="profile-username"> 39 <a href="#" class="profile-username"><?php print(htmlspecialchars($post['name'], ENT_QUOTES)); ?></a> 40 </div> 41 <div class="sns-username"> 42 <p class="sns-username"><?php print(htmlspecialchars($post['sns_name'], ENT_QUOTES)); ?></p> 43 </div> 44 </div> 45 <div class="description-area"><?php print(htmlspecialchars($post['description'], ENT_QUOTES)); ?></div> 46 </div> 47 </div> 48 <?php endif; ?> 49 <?php endforeach; ?> 50 51 </div> 52 <!-- ./row --> 53 54 </div> 55 <!-- ./container --> 56 57 <!-- セット作成のモーダル設定 --> 58 <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="display: none;" aria-hidden="true"> 59 <div class="modal-dialog" role="document"> 60 <div class="modal-content"> 61 <div class="modal-header"> 62 <h5 class="modal-title" id="exampleModalLabel">パーツセットを作成する</h5> 63 <button type="button" class="close" data-dismiss="modal" aria-label="閉じる"> 64 <span aria-hidden="true">×</span> 65 </button> 66 </div> 67 <form action="" method="post" multipart="enctype/multipart"> 68 <div class="modal-body"> 69 <input type="hidden"> 70 <p> 71 <label for="id_file">セットの写真;</label> 72 <input type="file" name="image" value="test" id="id_file" required> 73 </p> 74 <p> 75 <label for="id_title">Title:</label> 76 <input type="text" name="title" class="form-control" placeholder="セットのタイトル" autofocus="autofocus" maxlength="50" id="id_title" required> 77 </p> 78 <p> 79 <label for="id_description">説明文:</label> 80 <textarea class="form-control" name="description" placeholder="このセットについての説明(280文字以内)" autofocus="autofocus" maxlength="280" id="id_description" required></textarea> 81 </p> 82 </div> 83 <div class="modal-footer"> 84 <button type="button" class="btn btn-secondary" data-dismiss="modal">閉じる</button> 85 <button type="submit" class="btn btn-danger" name="create_folder">作成</button> 86 </div> 87 <!-- ./modal-footer --> 88 </form> 89 </div> 90 <!-- ./modal-content --> 91 </div> 92 <!-- ./modal-dialog --> 93 </div> 94 <!-- ./modal --> 95
試したこと
$_FILESを利用し、画像を'日付 . 画像ファイル名'で保存後、prepareで処理。 (in createset.php)
$posts = $db->prepare("SELECT u.name, u.sns_name, u.picture, p.* FROM users u, posts p WHERE u.id=p.user_id ORDER BY p.created_at DESC LIMIT {$start}, {$limit}");
で、取得。 (in posts.php)
<?php foreach ($posts as $post): ?>
で、投稿、表示しています。 (in mypage.php)
<img src="<?php ?>">この形に沿って、もしくはそれ以外の方法でもいいので画像を出力する正しい方法について、回答をお願いします。
やはり、アクセス権を775, 777に変えて試しみましたが画像のアップロードができません。
画像アップロードができない原因となっているコードを教えていただきたいです。
$_POST['image'] = $image を $_POST['card_image'] = $image に変えました。
createset.php
1if (!empty($_POST)) { 2 if ($_POST['image'] !== '' && $_POST['title'] !== '' && $_POST['description'] !== '') { 3 $image = date('YmdHis') . $_FILES['image']['name']; 4 move_uploaded_file($_FILES['image']['tmp_name'], __DIR__ . 'card_image/' . $image); 5 $_POST['card_image'] = $image; 6 7 // パーツセットの情報をデータベースに保存 8 $card = $db->prepare('INSERT INTO posts SET card_image=?, title=?, description=?, user_id=?, created_at=NOW()'); 9 $card->execute(array( 10 $_POST['card_image'], 11 $_POST['title'], 12 $_POST['description'], 13 $user['id'] 14 )); 15 16 header('Location: mypage.php'); 17 exit(); 18 } 19} 20 21?>
createset.phpの先頭でこのコードを打つと、
createset.php
1<?php 2$uploaddir = __DIR__ . '/card_image' . '/'; 3$uploadfile = $uploaddir . basename(date('YmdHis') . $_FILES['image']['name']); 4var_dump(move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile));
↓
Undefined index: image in /Applications/MAMP/htdocs/Vinyl_App/createset.php on line 3
Undefined index: image in /Applications/MAMP/htdocs/Vinyl_App/createset.php on line 4
と、出力されました。
最終的にこのコードになりました。
createset.php
1<?php 2if (!empty($_POST)) { 3 if ($_FILES['image'] !== '' && $_POST['title'] !== '' && $_POST['description'] !== '') { 4 $image = date('YmdHis') . $_FILES['image']['name']; 5 move_uploaded_file($_FILES['image']['tmp_name'], __DIR__ . '/card_image' . '/' . $image); 6 $card_image = $image; 7 8 // パーツセットの情報をデータベースに保存 9 $card = $db->prepare('INSERT INTO posts SET card_image=?, title=?, description=?, user_id=?, created_at=NOW()'); 10 $card->execute(array( 11 $card_image, 12 $_POST['title'], 13 $_POST['description'], 14 $user['id'] 15 )); 16 17 header('Location: mypage.php'); 18 exit(); 19 } 20} 21 22?> 23
回答2件
あなたの回答
tips
プレビュー