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

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

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

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

PHP

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

Q&A

解決済

1回答

981閲覧

MySQL:DB上にアップロードした画像をWeb上に画像として表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

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

0グッド

1クリップ

投稿2019/04/21 12:17

編集2019/04/21 12:25

PHPを使って下記の画像のような商品管理画面を作りたいと思っています。
イメージ説明

DBはMySQLを使用しています。

現在、下のようにコードを書いていて新規商品追加の画面までは、
作成できたのですがファイルを選択し商品を追加してもアップロードした画像が画像として表示されず、
画像のファイル名が表示されてしまいます。
下から7行目のforeach文の引数が違うのかなと思うのですが、
他の変数で試行錯誤しましたができませんでした。
どこのコードを訂正すれば良いかわからず困っています。
初心者のため拙いコードになっていますが、訂正箇所を教えていただけませんか。よろしくお願いいたします。

PHP

1<?php 2 3$drink_name = ''; 4$price = ''; 5$error = array(); 6$data = ""; 7$host = 'localhost'; 8$username = ''; 9$password =''; 10$dbname = ''; 11$charset = 'utf8'; 12$img = ''; 13$value = ''; 14$img_dir = './img/'; // アップロードした画像ファイルの保存ディレクトリ 15$data = array(); 16$err_msg = array(); // エラーメッセージ 17$new_img_filename = ''; // アップロードした新しい画像ファイル名 18 19if ($_SERVER['REQUEST_METHOD'] === 'POST' ) { 20 if (isset($_POST['drink_name'])) { 21 $drink_name = $_POST['drink_name']; 22 } 23 if (isset($_POST['price'])) { 24 $price = $_POST['price']; 25 } 26 if ($drink_name === '') { 27 $error[] = 'ドリンク名を入力してください。'; 28 } 29 if ($price === '') { 30 $error[] = '値段を入力してください。'; 31 } 32} 33var_dump ($_FILES); 34var_dump($drink_name); 35if ($_SERVER['REQUEST_METHOD'] === 'POST') { 36 // HTTP POST でファイルがアップロードされたかどうかチェック 37 if (is_uploaded_file($_FILES['file_select']['tmp_name']) === TRUE) { 38 // 画像の拡張子を取得 39 $extension = pathinfo($_FILES['file_select']['name'], PATHINFO_EXTENSION); 40 // 指定の拡張子であるかどうかチェック 41 if ($extension === 'jpg' || $extension === 'jpeg') { 42 // 保存する新しいファイル名の生成(ユニークな値を設定する) 43 $new_img_filename = sha1(uniqid(mt_rand(), true)). '.' . $extension; 44 // 同名ファイルが存在するかどうかチェック 45 if (is_file($img_dir . $new_img_filename) !== TRUE) { 46 // アップロードされたファイルを指定ディレクトリに移動して保存 47 if (move_uploaded_file($_FILES['file_select']['tmp_name'], $img_dir . $new_img_filename) !== TRUE) { 48 $err_msg[] = 'ファイルアップロードに失敗しました'; 49 } 50 } else { 51 $err_msg[] = 'ファイルアップロードに失敗しました。再度お試しください。'; 52 } 53 } else { 54 $err_msg[] = 'ファイル形式が異なります。画像ファイルはJPEGのみ利用可能です。'; 55 } 56 } else { 57 $err_msg[] = 'ファイルを選択してください'; 58 } 59} 60 61$dsn = 'mysql:dbname='.$dbname.';host='.$host.';charset='.$charset; 62$dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4')); 63$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 64$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 65 66if (count($error) === 0 && isset($_POST['submit'])) { 67 try { 68 $datetime = date("Y-m-d H:i:s"); 69 70 $sql = 'INSERT INTO `test_drink_master`(`drink_name`, `price`, `img`,`create_datetime`) VALUES (?,?,?,?)'; 71 $stmt = $dbh->prepare($sql); 72 $stmt->bindValue(1, $drink_name, PDO::PARAM_STR); 73 $stmt->bindValue(2, $price, PDO::PARAM_STR); 74 $stmt->bindValue(3, $new_img_filename, PDO::PARAM_STR); 75 $stmt->bindValue(4, $datetime, PDO::PARAM_STR); 76 $stmt->execute(); 77 } catch (PDOexception $e) { 78 echo '接続できませんでした。理由:'.$e->getMessage(); 79 } 80} 81 82try{ 83 $sql ='select drink_name,price,img,create_datetime from test_drink_master'; 84 $stmt = $dbh->prepare($sql); 85 $stmt->execute(null); 86 while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 87 $data .= "<p>".$row['create_datetime']." ".$row['drink_name']." ".$row['price']." ".$row['img']."</p>"; 88 } 89} catch(PDOException $e) { 90 echo '接続できませんでした 理由:'.$e->getMessage(); 91} 92?> 93 94<!DOCTYPE html> 95<html lang="ja"> 96 <head> 97 <meta charset="UTF-8"> 98 <title>自動販売機管理ツール</title> 99 </head> 100 <body> 101 <h1>自動販売機管理ツール</h1> 102 <hr> 103 <?php if(count($error) > 0) { ?> 104 <?php foreach ($error as $value) { ?> 105 <?php echo "<p>".$value."</p>" ?> 106 <?php } } ?> 107 <form method = "post" enctype="multipart/form-data"> 108 <h2>新規商品追加</h2> 109 名前:<input type="text" name="drink_name" size="20"><br> 110 値段:<input type="text" name="price" size="20"><br> 111 <input type="file" name="file_select" value="ファイルを選択"><br> 112 <input type="submit" name="submit" value="商品を追加"><br> 113 </form> 114 <hr> 115 <h2>商品情報変更</h2> 116 <p>商品一覧</p> 117 <?php echo $data?> 118 <table> 119 <tr> 120 <th>画像</th> 121 </tr> 122 <?php foreach ($new_img_filename as $img) { ?> 123 <tr> 124 <td><img src="<?php echo $img_dir . $value['img_file_name']; ?>"></td> 125 <tr> 126 <?php } ?> 127 </table> 128 </body> 129</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

前提

$new_img_filenameはアップロードして配置した先のファイルパスですよね。
文字列のはずです。

設定されているのは下記のようですね。

php

1$new_img_filename = sha1(uniqid(mt_rand(), true)). '.' . $extension;

そもそも文字列なのでforeachには入れられません。

php

1$test = 'aaa/bbb.jpg'; 2foreach($test as $v){ 3 echo $v.PHP_EOL; 4} 5 6//PHP Warning: Invalid argument supplied for foreach()

学習期には必ずPHPのエラー表示はONにしましょう。

本題

登録したデータを取得しているのは下記ですね。

php

1 $sql ='select drink_name,price,img,create_datetime from test_drink_master'; 2 $stmt = $dbh->prepare($sql); 3 $stmt->execute(null); 4 while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 5 $data .= "<p>".$row['create_datetime']." ".$row['drink_name']." ".$row['price']." ".$row['img']."</p>"; 6 }

$dataという変数に追記で文字列を追加していっているだけです。

HTML上はimgタグを利用することで画像ファイルパスの画像を読み込みに行きます。単なる文字列で書いても何もとりにいきません。

確認すべきは「画面に表示された状態」ではなく「HTMLソースが想定通り出力できているか」です。
ブラウザに右クリックで「ページのソースを表示」という機能があると思うのでそちらで出力結果を確認してください。

PHP側はURLやフォーム送信などのリクエストを受け取って処理し、情報を出力しているだけで、どこから参照されるかというのは知りません。
ブラウザから参照される前提なのであれば必ずブラウザ見る、HTML構文にそった状態で埋め込んであげる必要があります。

php

1 while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 2 $data .= "<p>".$row['create_datetime']." ".$row['drink_name']." ".$row['price']." <img src='".$row['img']."' /></p>"; 3 } 4

※もちろんURLから参照できるパスでないとimgタグに入れ込んでも画像表示できませんので、そこはデータとファイルアップロード先をご確認ください。

若干蛇足

あと、まだ学習元では学んでないのかもしれませんが、画面出力時にHTMLエスケープは必須です。
XSSなどで調べて概念を理解し、適切に対応していくようにしてください。

投稿2019/04/21 12:43

m.ts10806

総合スコア80765

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

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

退会済みユーザー

退会済みユーザー

2019/04/21 14:05

丁寧なご回答ありがとうございます。 いただいたアドバイスをもとに取り組んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問