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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/04/21 14:05