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

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

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

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

Q&A

解決済

1回答

12628閲覧

[PHP]画像を表示させることができないです...

newyee

総合スコア213

PHP

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

0グッド

0クリップ

投稿2017/10/17 14:24

編集2017/10/22 07:07

アップロードされ、保存された画像のパスを指定しても画像を表示させることができないです...
以下が自分が作成したコードとなるのですが、全てを載せると長くなってしまうので、画像の処理に関する部分だけ載せさせていただこうと思います。
ファイルに関しましては、control.php,model.php,view.phpの3つのファイルに分けて作成しております。
以下はcontrol.phpのファイルになります。

php

1 2$link = get_db_connect(); 3 4if($_SERVER['REQUEST_METHOD'] === 'POST'){ 5 6 $submit_type = $_POST['submit_type']; 7 //die(var_dump($submit_type)); 8 9 switch ($submit_type) { 10 case 'add_item': 11 12 $product_name = $_POST['product_name']; 13 //var_dump($product_name);exit(); 14 $price = $_POST['price']; 15 $stock = $_POST['stock']; 16 $status = $_POST['public_status']; 17 18 //登録値チェック 19 $err_msg[] = entry_name_check($product_name); 20 $err_msg[] = entry_check_price($price); 21 $err_msg[] = entry_check_stock($stock); 22 //var_dump($price);exit(); 23 //die(var_dump($stock)); 24 25 //アップロードファイル名を変数に代入 26 $temp_file = $_FILES['new_img']['tmp_name']; 27 //var_dump($temp_file);exit(); 28 $file_name = $_FILES['new_img']['name']; 29 30 31 //拡張子取得 32 $check_ext = get_ext($file_name); 33 34 //拡張子チェック 35 //$err_msg[] = extention_check($check_ext); 36 37 38 //拡張子を取得(保存) 39 $ext = ext($file_name); 40 41 //var_dump($product_id);exit(); 42 43 44 //var_dump($upload_file);exit(); 45 46 47 //var_dump($err_msg);exit(); 48 $check_err = array_filter($err_msg); 49 50 if(count($check_err) === 0){ 51 52 //トランザクション開始 53 mysqli_autocommit($link, $false); 54 55 $sql = 'INSERT INTO item_table(product_name,price,img,created_date,status) 56 VALUES(\'' . $product_name . '\',' . $price . ',\'' . $file_name . '\',\'' . $date . '\',' . $status . ')'; 57 58 if(mysqli_query($link,$sql) === TRUE){ 59 60 $product_id = mysqli_insert_id($link); 61 62 //var_dump($product_id);exit(); 63 64 65 //item_stock_tableにinsert 66 $err_msg[] = insert_item_stock_table($link,$product_id,$stock,$date); 67 68 }else{ 69 $err_msg[] = 'item_table:insertエラー' . $sql; 70 } 71 72 //ファイルパス+ファイル名 73 $upload_file = '../include/img/' . $product_id . $ext; 74 75 //アップロード処理 76 $err_msg[] = upload_img($temp_file,$upload_file,$check_ext); 77 78 79 80 81 //トランザクション成否判定 82 $check_err = array_filter($err_msg); 83 84 85 if(count($check_err) === 0){ 86 87 $success_msg[] = '商品追加成功'; 88 89 mysqli_commit($link); 90 91 }else{ 92 $err_msg[] = '商品追加失敗'; 93 mysqli_rollback($link); 94 } 95 } 96 97 break; 98 99 100//item_table取得 101$item_info_list = get_item_table($link); 102 103 104//ファイル名の拡張子を取得 105$item_info_list = img_ext($item_info_list,$file_name); 106//var_dump($item_info_list);exit(); 107 108//特殊文字をHTMLエンティティに変換 109$item_info_list = entity_as_array($item_info_list); 110

以下はmodel.phpになります。

php

1 2//アップロード処理 3function upload_img($temp_file,$upload_file,$check_ext){ 4 5 $err_msg = ''; 6 7 if (is_uploaded_file($temp_file)){ 8 9 10 $err_msg = extention_check($check_ext); 11 12 if(empty($err_msg)){ 13 14 if (move_uploaded_file($temp_file,$upload_file) === FALSE) { 15 16 $err_msg = 'ファイルをアップロードできません。'; 17 18 19 } 20 21 }else{ 22 $err_msg = 'エラーメーッセージが空ではありません'; 23 } 24 } else { 25 $err_msg = 'ファイルが選択されていません。'; 26 } 27 28 return $err_msg; 29} 30 31 32//拡張牛取得 33function get_ext($file_name){ 34 return substr($file_name,strrpos($file_name,'.') +1); 35} 36 37//拡張子チェック 38function extention_check($check_ext){ 39 40 $err_msg = ''; 41 42 if(!($check_ext === 'jpeg' || $check_ext === 'jpg' || $check_ext === 'png')){ 43 $err_msg = 'ファイル形式が異なります。画像ファイルはjpegまたはpngのみ利用可能です'; 44 } 45 46 return $err_msg; 47} 48 49//拡張子取得(拡張子を含む) 50function ext($file_name){ 51 52 return substr($file_name,strrpos($file_name,'.')); 53 54} 55function get_item_table($link){ 56 57 $sql = 'SELECT item_table.product_id,product_name,price,img,status,stock 58 FROM item_table 59 JOIN item_stock_table 60 ON item_table.product_id = item_stock_table.product_id'; 61 62 return get_as_array($link,$sql); 63 64} 65 66function img_ext($item_info_list,$file_name){ 67 foreach($item_info_list as $key => $value){ 68 foreach($value as $keys => $values){ 69 $item_info_list[$key]['img'] = ext($file_name); 70 } 71 } 72 73 return $item_info_list; 74} 75function get_db_connect(){ 76 77 // コネクション取得 78 if (!$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWD, DB_NAME)) { 79 die('error: ' . mysqli_connect_error()); 80 } 81 82 // 文字コードセット 83 mysqli_set_charset($link, DB_CHARACTER_SET); 84 85 return $link; 86} 87 88function get_as_array($link, $sql) { 89 90 // 返却用配列 91 $data = array(); 92 93 // クエリを実行する 94 if ($result = mysqli_query($link, $sql)) { 95 96 if (mysqli_num_rows($result) > 0) { 97 98 // 1件ずつ取り出す 99 while ($row = mysqli_fetch_assoc($result)) { 100 $data[] = $row; 101 } 102 103 } 104 105 // 結果セットを開放 106 mysqli_free_result($result); 107 108 } 109 110 return $data; 111 112} 113 114

以下はview.phpになります。

html

1 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6 <meta charset="UTF-8"> 7 <title>商品管理画面</title> 8 <style> 9 table,tr,th,td{ 10 11 border:solid 1px; 12 13 } 14 </style> 15</head> 16<body> 17 <h1>商品管理画面</h1> 18 19 <?php foreach($err_msg as $value){ ?> 20 21 <p><?php echo $value; ?></p> 22 23 <?php } ?> 24 <?php foreach($success_msg as $value){ ?> 25 26 <p><?php echo $value; ?></p> 27 28 <?php } ?> 29 30 <a href="item_list.php">購入画面</a> 31 32 <section> 33 <h2>新規商品追加</h2> 34 <form method="post" enctype="multipart/form-data"> 35 36 <div>名前<input type="text" name="product_name"></div> 37 <div>値段<input type="text" name="price"></div> 38 <div>個数<input type="text" name="stock"></div> 39 <div><input type="file" name="new_img"></div> 40 <div> 41 <select name="public_status"> 42 <option value="0">非公開</option> 43 <option value="1">公開</option> 44 </select> 45 </div> 46 <div><input type="submit"value="■□■□■商品追加■□■□■"></div> 47 <input type="hidden"name="submit_type" value="add_item"> 48 </form> 49 </section> 50 <section> 51 <h2>商品情報変更</h2> 52 <caption>商品一覧</caption> 53 <table> 54 <tr> 55 <th>商品画像</th> 56 <th>商品名</th> 57 <th>価格</th> 58 <th>在庫数</th> 59 <th>ステータス</th> 60 </tr> 61 <?php foreach($item_info_list as $value){ ?> 62 <tr><!-- アップロードされたファイル名をテーブルに保存する --> 63 <td><img src="../include/img/<?php echo $value['product_id'] . $value['img'] ;?>"></td> 64 <td><?php echo $value['product_name']; ?></td> 65 <td><?php echo $value['price']; ?></td> 66 67 <!-- 在庫数変更フォーム --> 68 <form method="post"> 69 <td> 70 <input type="text" name="update_stock" value="<?php echo $value['stock_number'];?>"> 71 <input type="submit" value="変更"> 72 <input type="hidden" name="submit_type" value="change_value"> 73 <input type="hidden" name="product_id" value="<?php echo $value['product_id']?>"> 74 </td> 75 </form> 76 77 <!-- ステータス変更フォーム --> 78 <form method="post"> 79 <td> 80 <?php if((int)($value['status']) === 0){ ?> 81 <input type="submit" name="change_status" value="非公開->公開"> 82 83 <?php }else{ ?> 84 85 <input type="submit" name="change_status" value="公開->非公開"> 86 <?php } ?> 87 <input type="hidden" name="status" value="<?php echo $value['status']; ?>"> 88 <input type="hidden" name="product_id" value="<?php echo $value['product_id']; ?>"> 89 <input type="hidden" name="submit_type" value="change_status"> 90 </td> 91 </form> 92 93 </tr> 94 <?php } ?> 95 </table> 96 </section> 97</body> 98</html> 99 100

表示されない原因に関しましては、「control.php」の「$item_info_list = img_ext($item_info_list,$file_name);」この部分、「model.php」のimg_ext関数だとの指摘を受けたことがあり、実際にこの関数を排除し、他の方法で一応の解決は出来たのですが、原因が分からないままでして。。。

php

1function img_ext($item_info_list,$file_name){ 2 foreach($item_info_list as $key => $value){ 3 foreach($value as $keys => $values){ 4 $item_info_list[$key]['img'] = ext($file_name); 5 } 6 } 7 8 return $item_info_list; 9}

どなたか教えてくださる方いましたら、ご教示いただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

なかなか追いかけるのが大変なコードですね。

画像が表示できないといわれているのは、view.phpでの下記のimgタグでの画像出力部分との認識です。

PHP

1<?php foreach($item_info_list as $value){ ?> 2 <tr><!-- アップロードされたファイル名をテーブルに保存する --> 3 <td><img src="../include/img/<?php echo $value['product_id'] . $value['img'] ;?>"></td>

画像のURLの組み立てには、$item_info_listの配列の1要素$valueに由来する2つの変数$value['product_id']$value['img']が登場します。
このうち、$value['product_id']はmodel.phpのget_item_table関数でデータベースより取得した値です。
一方、$value['img']については、ファイルの拡張子を取得しているようですが、$item_info_listへの値の追加はimg_ext関数で行っており、img_ext関数ではext関数で拡張子を取得しているといった流れとなっています。
ここで、img_ext関数の引数である$file_nameに渡される値を考えると、control.phpでの下記処理での$file_nameとなっています。

php

1//ファイル名の拡張子を取得 2$item_info_list = img_ext($item_info_list,$file_name);

この$file_nameがどこで設定されているかを見た場合、提示されているコードのみから判断すると、画像アップロード時の処理で代入されている下記の箇所のみであることが分かります。

php

1if($_SERVER['REQUEST_METHOD'] === 'POST'){ 2 3 $submit_type = $_POST['submit_type']; 4 //die(var_dump($submit_type)); 5 6 switch ($submit_type) { 7 case 'add_item': 8 9// (略) 10 11 //アップロードファイル名を変数に代入 12 $temp_file = $_FILES['new_img']['tmp_name']; 13 //var_dump($temp_file);exit(); 14 $file_name = $_FILES['new_img']['name'];

ですので、画像アップロード時以外は$file_nameは値が設定されておらず、拡張子の取得に失敗しているのではないかと考えられます。

一方、データベースのitem_tableテーブルまたはitem_stock_tableテーブルにあると思われるimg列は、上記の画像アップロード時の$file_name由来のデータが格納されています。
img_ext関数はこのimg列の値を上書きするような動きをしています。
データベースの内容をそのままに対応するのであれば、img_ext関数での処理内容は下記となるかと思います。
control.phpでの処理内容として、テーブルへのINSERT後にget_item_table関数でデータを再取得しているので、$file_nameはimg_ext関数の処理には不要です。

php

1function img_ext($item_info_list){ 2 foreach($item_info_list as $key => $value){ 3 foreach($value as $keys => $values){ 4 $item_info_list[$key]['img'] = ext($item_info_list[$key]['img']); 5 } 6 } 7 8 return $item_info_list; 9}

実際の対応としては、上記を行うのではなく、control.phpのINSERT処理の後に組み立てている画像保存用のパス$upload_fileの値をデータベースのテーブルにあるimg列に格納し、

php

1//ファイルパス+ファイル名 2$upload_file = '../include/img/' . $product_id . $ext;

imgタグでの値の参照では、下記のみで画像パスが取得できるようにすればよいのではないかと考えられます。

PHP

1<?php foreach($item_info_list as $value){ ?> 2 <tr><!-- アップロードされたファイル名をテーブルに保存する --> 3 <td><img src="<?= $value['img'] ?>"></td>

また、質問に記載のコードでは、データベースへのINSERT処理後にアップロード画像の保存を行っていますが、画像の保存に失敗した場合に画像の存在しないレコードがテーブルに残ることとなりますので、画像の保存→成功したらテーブルへのINSERTの順番で処理を行うこととした方がよいのではないかと思います。
この場合、$upload_fileの組み立てはINSERT処理の前に行うことになりますので、テーブルへのパスの保存も容易となるかと思います。

投稿2017/10/17 15:08

編集2017/10/17 15:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

newyee

2017/10/20 04:37

返信大変遅くなってしまいすみません。。。 ご丁寧なご回答に感謝いたします。 教えて頂いた、「$upload_file = '../include/img/' . $product_id . $ext;」こちらの画像保存用のパスをデータベーステーブルにあるimg列に格納し、imgタグでの値の参照では、下記のみで画像パスが取得できるようにする、との方法なのですが、画像をデータベーステーブルに保存し、きちんと、画像保存用フォルダにも画像は保存されているのですが、何故か画像を表示させることができません... 修正しました点に関しましては、以下の通りです。 //トランザクション開始 mysqli_autocommit($link, $false); $sql = 'INSERT INTO item_table(product_name,price,created_date,status) VALUES(\'' . $product_name . '\',' . $price . ',\'' . $date . '\',' . $status . ')'; if(mysqli_query($link,$sql) === TRUE){ $product_id = mysqli_insert_id($link); //ファイルパス+ファイル名 $upload_file = '../include/img/' . $product_id . $ext; $sql = 'UPDATE item_table SET img = (\'' . $upload_file . '\') WHERE product_id = ' . $product_id; if(mysqli_query($link,$sql) === FALSE){ $err_msg[] = 'item_table:insertエラー' . $sql; } //var_dump($product_id);exit(); //item_stock_tableにinsert $err_msg[] = insert_item_stock_table($link,$product_id,$stock,$date); }else{ $err_msg[] = 'item_table:insertエラー' . $sql; } 格納するフォルダの位置が悪い...などということは関係しているでしょうか...? //アップロード処理 $err_msg[] = upload_img($temp_file,$upload_file,$check_ext);
newyee

2017/10/20 04:39

すみません。 コードの途中の「//アップロード処理」という所の前にご相談の内容を書いてしまいました...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問