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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

10999閲覧

PHPで画像を表示できない(本当にあと一歩かも?)

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/04/16 04:33

前提・実現したいこと

PHPで画像の表示させたい。

現在、PHPで画像アップロード処理を初めて勉強しています。
そこで簡易的に画像アップロードの機能を以下のように作りました。
※現在できているところをいかに書きます。

画像を選択し、送信をおす。
イメージ説明

何もバリデーションに引っかからなければ、以下のように成功しましたのメッセージが表示されて、データベースにファイルパスが保存される。+imgディレクトリにも画像ファイルが保存される。
イメージ説明

データベース
イメージ説明

imgディレクトリにも保存されていることが確認できる。
イメージ説明

最後にvar_dumpでファイルパスが取得できるか確認すると、以下のように取得できていることは確認できる
イメージ説明

発生している問題・エラーメッセージ

データベースに保存、ディレクトリに保存、var_dumpでデータの取得はできるところまではできているのですが、肝心の画像を表示させることができません。

img.php(画像投稿フォーム)

php

1<?php 2require_once(ROOT_PATH .'/Models/Post.php'); 3ini_set('display_errors', "On"); 4 5$obj = new Post(); 6$files = $obj->getFile(); 7foreach($files as $file) { 8 var_dump($file); 9} 10 11?> 12<!DOCTYPE html> 13<html lang="en"> 14<head> 15 <meta charset="UTF-8"> 16 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 17 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 18 <title>画像投稿練習</title> 19</head> 20<body> 21 <form action="img_upload.php" method="POST" enctype="multipart/form-data"> 22 <h1>画像の投稿</h1> 23 <div class="file-up"> 24 <input type="hidden" name="MAX_FILE_SIZE" value="1048576"> 25 <input type="file" name="img" accept="image/*"> 26 </div> 27 <input type="submit" name="upload" value="送信"> 28 </form> 29 <div class="file-index"> 30 <?php foreach($files as $file): ?> 31 <img src="<?php echo "{$file['file_path']}"; ?>" alt=""> 32 <?php endforeach; ?> 33 </div> 34</body> 35</html>

img_upload.php(フォーム送信先)

php

1<?php 2require_once(ROOT_PATH .'/Models/Post.php'); 3ini_set('display_errors', "On"); 4 5$file = $_FILES['img']; 6 7$filename = basename($file['name']); 8$tmp_path = $file['tmp_name']; 9$file_err = $file['error']; 10$filesize = $file['size']; 11$upload_dir = 'img/'; 12$save_filename = date('Ymdhis').$filename; 13$save_path = $upload_dir.$save_filename; 14 15// ファイルのバリデーション 16// ①ファイルがそもそもあるか 17if(is_uploaded_file($tmp_path)) { 18 if(move_uploaded_file($tmp_path, $save_path)) { 19 echo "ファイルをアップしました!"; 20 // DBに保存 21 $obj = new Post(); 22 $img_date = $obj->fileSave($save_path); 23 if($img_date) { 24 echo "データベースに保存しました"; 25 } else { 26 echo "データベースへの保存が失敗しました"; 27 } 28 } else { 29 echo "ファイルが保存できませんでした。"; 30 } 31} else { 32 echo "ファイルが選択されていません。"; 33} 34 35// ②拡張子は画像形式か 36$allow_ext = array('jpg', 'jpeg', 'png'); 37$file_ext = pathinfo($filename, PATHINFO_EXTENSION); 38 39if(!in_array(strtolower($file_ext), $allow_ext)) { 40 echo "画像ファイルを添付してください。"; 41} 42 43// ③ファイルのサイズが1MB未満か 44if($filesize > 1048576 || $file_err == 2) { 45 echo "ファイルのサイズは1MB未満にしてください。"; 46} 47 48?> 49 50<!DOCTYPE html> 51<html lang="en"> 52<head> 53 <meta charset="UTF-8"> 54 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 55 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 56 <title>Document</title> 57</head> 58<body> 59 <a href="img.php">戻る</a> 60</body> 61</html>

Post.php 画像投稿ロジック

php

1<?php 2require_once(ROOT_PATH .'/Models/Db.php'); 3ini_set('display_errors', "On"); 4 5class Post 6{ 7 /** 8 * ファイルデータの保存 9 * @param string $save_path 保存先のパス 10 * @param bool $return 11 */ 12 13 public function fileSave($save_path) { 14 $result = false; 15 16 try { 17 $sql = 'INSERT INTO img (file_path) VALUES (:file_path)'; 18 $stmt = connect()->prepare($sql); 19 $stmt->bindValue(':file_path', $save_path); 20 $result = $stmt->execute(); 21 return $result; 22 23 } catch(\Exception $e) { 24 echo "エラーが発生しました。". $e->getMessage(); 25 return $result; 26 } 27 } 28 29 /** 30 * ファイルデータの取得 31 * @param array $fileDate 32 */ 33 34 public function getFile() { 35 $sql = 'SELECT * FROM img'; 36 37 $fileDate = connect()->query($sql); 38 return $fileDate; 39 } 40}

データベース接続

<?php require_once(ROOT_PATH .'/env.php'); ini_set('display_errors', "On"); // 接続チェックOK function connect() { $host = DB_HOST; $db = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4"; try { $pdo = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); return $pdo; } catch(PDOException $e) { echo "接続失敗です!". $e->getMessage(); exit(); } }

試したこと
img_upload.phpの絶対パスが違うのではないか?

$upload_dir = 'img/';

$upload_dir = '/Applications/MAMP/htdocs/アプリ名/public/img/';

imgファイルはpublic配下にある。
MAMPのドキュメントルートは、Applications ▹ MAMP ▹ htdocs ▹ アプリ名 ▹ public
なので、絶対パスは

$upload_dir = 'img/';

で問題ないと思われる。

foreach($files as $file) { var_dump($file); }

の結果は、

array(2) { ["id"]=> string(2) "10" ["file_path"]=> string(29) "img/202104160402212448564.png" }

var_dump($files);の結果は、

object(PDOStatement)#3 (1) { ["queryString"]=> string(17) "SELECT * FROM img" }

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

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

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

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

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

guest

回答3

0

おす!

あのさぁ、

引用テキストvar_dump($files);の結果は、

object(PDOStatement)#3 (1) { ["queryString"]=> string(17) "SELECT * FROM img" }

なんだろ?

結果がPDOStatementなんだから、そりゃダメだろ。

$files->fetchAll(\PDO::FETCH_ASSOC)

すりゃぁ、連想配列に展開されっから、

<div class="file-index"> <?php foreach($files->fetchAll(\PDO::FETCH_ASSOC) as $file): ?> <img src="<?php echo "{$file['file_path']}"; ?>" alt=""> <?php endforeach; ?> </div>

これで行けるんじゃねぇか?

投稿2021/04/16 05:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/04/16 06:22

多分、 $files = $obj->getFile(); foreach($files as $file) { var_dump($file); } したところでカーソル末尾までいってんじゃねぇか? だから、 $files = $obj->getFile()->fetchAll(\PDO::FETCH_ASSOC); すんのがいいかもしんねぇな。 https://www.php.net/manual/ja/pdostatement.fetch.php cursor_orientation スクロール可能なカーソルを表す PDOStatement オブジェクトの場合、 この値により呼び出し側に返される行を定義します。 この値は、PDO::FETCH_ORI_* 定数のどれかと する必要があり、 PDO::FETCH_ORI_NEXT がデフォルトとなっています。 PDOStatement に対してスクロール可能なカーソルを要求するためには、 PDO::prepare() を用いて SQL ステートメントを 準備する際、 PDO::CURSOR_SCROLL に PDO::ATTR_CURSOR 属性を設定する必要があります。
退会済みユーザー

退会済みユーザー

2021/04/16 07:39

ご回答ありがとうございます! ご教示いただいた内容で実装してみましたが、画像は表示されませんでした。 ただ、新しい観点からご指摘いただいたので、勉強になりましたし、感謝しております。 <img src="<?php echo "/"."{$file['file_path']}"; ?>" alt=""> このように、$fileの前に/を追加したところ画像が表示できました。 重ねてありがとうございます。
guest

0

ベストアンサー

私ならまずは、
画像を表示させようとしているHTMLソースのチェックをやるよね。
HTML上にIMG要素のsrc属性で、相対パス指定しているのか絶対パス指定しているのか。
相対パス指定なら、表示処理のPHPファイルの置き場所から画像のディレクトリまでを相対的に指定することになる。
絶対パス指定なら、対外的にドキュメントルートが/として見えているのだから、そこからの指定になるよね。

ドキュメントルートの下に直にphpを置いてあって、
ドキュメントルートの下にimgディレクトリがある想定であれば、
<img src="img/~~.jpg">とかいうHTMLを出力することで表示できるはずだけど、
ファイル名に空白を含んだりして変な記号を含んだりしているならurlエンコードが必要。
共用レンタルサーバーなんかなら、それでうまくいくはず。

あとは、保存先のimgディレクトリのアクセス権が0755とか0775にでもなっていればいいと思う。

SELinuxが有効だったりすると、保存先ディレクトリのコンテキストが気になるところだけれども。

投稿2021/04/16 04:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/04/16 07:41

ご回答いただきましてありがとうございます。 HTMLでも確認したところ、 <img src="/img/202104160410392448564.png" alt="">で画像表示できる <img src="img/202104160410392448564.png" alt="">で画像表示できない ことがわかったので、 foreach文の中で、 <img src="<?php echo "/"."{$file['file_path']}"; ?>" alt="">と/つけたところ画像がうまく表示できました。
guest

0

ディレクトリ名から始まると「相対パス」です。
絶対パスでしたいのなら/から始めてください。

投稿2021/04/16 04:44

m.ts10806

総合スコア80875

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

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

m.ts10806

2021/04/16 04:46

ファイルが破損していても表示できないのでそこはご確認を。
退会済みユーザー

退会済みユーザー

2021/04/16 07:42

ご回答ありがとうございます! <img src="<?php echo "/"."{$file['file_path']}"; ?>" alt=""> このように$fileの前に/つけたところうまく画像が表示できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問