🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

1回答

1214閲覧

【PHP】画像名をMySqlに保存して、imgタグで出力したい

ma_3636

総合スコア19

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

1クリップ

投稿2019/11/13 09:42

実現したいこと

画像名をMySqlに保存し、目的の画像を出力したい。

ファイル名の保存はできていたのですが画像の保存ができず、詰まってしまい、いじっているうちにファイル名をMySqlに保存することすらできなくなってしまいました。。。
ご助力いただけないでしょうか。。

考えた処理順

form内のinputタグでファイルをアップロード→is_uploaded_fileでファイルアップロードイベントを検知→ファイルの拡張子確認→move_uploaded_fileにてファイルを保存→ファイル名をMySqlに保存→<img src="../picture/<?php echo $user['picture'] ?>">で出力

コード

PHP

1<?php 2session_start(); 3require('../dbconnect.php'); 4require('../function.php'); 5 6//会委員IDと名前取得 7if (isset($_SESSION['join']['user_id'])) { 8$users = $db->prepare('SELECT user.* FROM user WHERE user_id=?'); 9$users->execute(array($_SESSION['join']['user_id'])); 10$user = $users->fetch(); 11}else{ 12$error['join'] = 'error'; 13} 14 15//商品情報取得 16if (isset($user['user_id'])) { 17 $objects = $db->prepare('SELECT * FROM purchase WHERE user_id=?'); 18 $objects->execute(array($_SESSION['join']['user_id'])); 19} 20//画像アップロード 21 if (is_uploaded_file($_FILES["image"]["name"])) { 22 $fileName = $_FILES["image"]["name"]; 23 $ext = substr($fileName,-3); 24 if ($ext != 'jpg' && $ext != 'gif') { 25 $image = date('YmdHis').$_FILES["image"]["name"]; 26 move_uploaded_file($_FILES["image"]["name"],'../picture'); 27 $set_object = $db->prepare("UPDATE user SET picture= :picture WHERE user_id=:user_id"); 28 $set_object->execute(array( 29 ':picture' => $image, 30 ':user_id' => $_SESSION['join']['user_id'] 31 )); 32 }else{ 33 $error['image'] = 'differenttype'; 34 } 35} 36 ?> 37 38 <!DOCTYPE html> 39 <html lang="ja" dir="ltr"> 40 <head> 41 <meta charset="utf-8"> 42 <title></title> 43 </head> 44 <body> 45 <p><a href="index.php">トップページ</a></p> 46 <?php if($error['join'] !== 'error'): ?> 47 48 <p><img src="../picture/<?php echo $user['picture'] ?>"></p> 49 <p>ユーザー名</p> 50 <p><?php echo $user['name'] ?></p> 51 <p>ユーザーID</p> 52 <p><?php echo $user['user_id'] ?></p> 53 <?php if(!empty($error['image'])): ?> 54 <p>画像の形式が正しくありませn。</p> 55 <?php endif ; ?> 56 <p><?php echo $user['login'] ?></p> 57 <form class="" action="" method="post" enctype="multipart/form-data"> 58 <input type="file" name="" value=""> 59 <input type="submit" name="upload" value="画像を送信する"> 60 </form> 61 <?php else: ?> 62 <p><a href="../join/login.php">ログインしてください</a></p> 63 <?php endif; ?> 64<hr> 65 <h1>出品した商品</h1> 66 <?php if($error['join'] !== 'error'): ?> 67 <?php foreach ($objects as $object): ?> 68 <div class=""> 69 <?php if (empty($object['picture'])): ?> 70 <img src="../picture/no_image.png"> 71 <?php endif; ?> 72 <dt><p><a href="indicate_purchase.php?id=<?php echo $object['id'] ?>"><?php echo $object['purchase_name'] ?></a></p></dt> 73 <dd><p><?php echo $object['price']?></p></dd> 74 <dd><p>在庫数<?php echo $object['stock']?></p></dd> 75 </div> 76 <hr> 77 <?php endforeach; ?> 78 <?php endif; ?> 79 </body> 80 </html> 81

環境

XAMPP

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

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

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

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

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

yambejp

2019/11/13 09:46

画像ファイル名は何のエンコード処理もせずにアップロードするのでしょうか? キャラクターコードの差で動作が不安定になったり、http通らないですが大丈夫ですか?
ma_3636

2019/11/13 09:48

そのあたりに関する知見がなく、逆にお聞きしたいのですが、 一般的に画像ファイルのアップロード時はどのように処理されているのでしょうか?
ma_3636

2019/11/13 09:49

ちなみに今回は画像をユーザーのアイコンとして使用するつもりです。
guest

回答1

0

ファイル名の保存はできていたのですが画像の保存ができず、詰まってしまい、いじっているうちにファイル名をMySqlに保存することすらできなくなってしまいました。。。

if ($ext != 'jpg' && $ext != 'gif') { }

jpggif 以外を受け付ける設定になっていますが、コレは仕様として正しいのでしょうか?
また、画像であることの保証がされていないため、画像以外のファイルをアップロードできるのはまずいでしょう。

$ext = substr($fileName, -3);

拡張子をコレで判断してはいけません。
.jpeg という拡張子も正しい jpeg 形式の拡張子です。

$mimetype = $_FILES['userfile']['type'];

↑百歩譲ってもこれで。(ほんとはだめ。)

Fileinfo で判断するのがベスト。

$set_object = $db->prepare("UPDATE user SET picture= :picture WHERE user_id=:user_id");

UPDATEになっているけど、コレは??
INSERT すべきでは?

$image = date('YmdHis').$_FILES["image"]["name"]; move_uploaded_file($_FILES["image"]["name"],'../picture');

ユーザーがアップロードしたそのままのファイル名を使うのは、思わぬ不具合が発生します。
ユーザーがwindowsでサーバーがlinuxの時など。
システムの文字コードが異なるため、パスが正しく引けなくなるためです。

$image = sha1_file($_FILES["image"]["tmp_name"]); move_uploaded_file($_FILES["image"]["tmp_name"],'../picture/'. $image);

また、$_FILES["image"]["name"] はファイルの実態ではないので、
$_FILES["image"]["tmp_name"] でないと move_uploaded_file できませんよ。

投稿2019/11/13 09:54

編集2019/11/13 10:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ma_3636

2019/11/13 10:32

的確なご指摘ありがとうございます。 ご指摘の内容を反映させようとしましたが、理解が及ばず、うまくできませんでした。 INSERTとUPDATEですが、空でない場合もあるのでUPDATEも良いかと思いましたがどうでしょうか? それともやはり、MySqlのデータがNULLの場合のみUPDATEにするのが良いですか? アップロード部分の摘出です。 //画像アップロード if (is_uploaded_file($_FILES["image"]["tmp_name"])) { $finfo = finfo_open(FILEINFO_MIME_TYPE); // mimetype 拡張モジュール風に mime タイプを返します foreach (glob("*") as $filename) { echo finfo_file( $filename); } finfo_close($finfo); // $fileName = $_FILES["image"]["tmp_name"]; // $ext = substr($fileName,-3); if ($filename = 'jpg' OR $filename = 'gif') { $image = sha1_file($_FILES["image"]["tmp_name"]); move_uploaded_file($_FILES["image"]["tmp_name"],'../picture/'. $image); $set_object = $db->prepare("UPDATE user SET picture= :picture WHERE user_id=:user_id"); $set_object->execute(array( ':picture' => $image, ':user_id' => $_SESSION['join']['user_id'] )); }else{ $error['image'] = 'differenttype'; } } 思ったように理解できずこうなってしまいました>< もう一度ご指摘お願いします><
退会済みユーザー

退会済みユーザー

2019/11/13 10:35

> もう一度ご指摘お願いします こう言われても、実行できなきゃ意味がないのよ…。 提示された情報だけじゃ、実行できませんよね? require しているファイル情報もないし。 せめて、あなたの手元で動かしてみて、「ダメだった」ではなく、「どうなったか」をリターンしてください。
ma_3636

2019/11/13 10:51

dbconnect.php <?php try { $db = new PDO('mysql:dbname=mini_db;host=127.0.0.1;charset=utf8','root', ''); } catch (PDOException $e) { echo 'DB接続エラー: ' . $e->getMessage(); } ?> require('../function.php'); は使っていないので、削除しました。 誤解を招いてしまいすいませんでした。 userテーブルのカラムは以下のとおりです id user_id name password picture created modified となっています。 アバウトすぎる要望をしてしまってすいません。 現状でも、変わらずファイル名の保存もできず、ファイル自体の保存もできておりません。 先程教えて頂いたFileinfo構文の変数の意味が理解できず、どう指定したらよいか どのようにFileinfoの返り値を取得して、比較したらよいか そもそもファイルの保存ができていなく致命的な記述ミスがあるかもしれないと思われたのですがわかない これらの意味をぶん投げたような表現でした。こちらの質問の仕方のミスでした!すいません。>< これらについて教えていただけませんか?
退会済みユーザー

退会済みユーザー

2019/11/13 10:53

とりあえず、拡張子のチェックを一旦外してみるとか、どこに原因があるんかを色々なパターンで試してください。 拡張子のチェックを外して、保存できれば、そこに間違いがあるとか判明しますよね?
ma_3636

2019/11/13 10:55

試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問