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

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

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

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

Q&A

解決済

3回答

5346閲覧

mysqlでDBへ複数画像保存

shaobao

総合スコア33

PHP

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

0グッド

0クリップ

投稿2017/11/28 14:42

こんばんは。

今回、複数画像をアップロードして、DBに登録したいと考えています。
複数画像をアップロードするまでうまく行っていましたが、DBへ登録するまでうまくいけませんでした。
DBの設計は、単純に

create table painting ( id int not null auto_increment, gazo varchar(30), primary key(id) );

のようにしてみました。

ソースコードは
gallery.php

<?php session_start(); ?> <div class="staff_add"> <?php //errorがあったら表示 if(isset($_SESSION['error'])){ foreach($_SESSION['error'] as $value){ echo '<span class="error">' . h($value) . '</span>' . '\n'; } } ?> <form action="ImageUploader.php" method="post" enctype="multipart/form-data"> Send these files:<br /> <input type="hidden" name="MAX_FILE_SIZE" value="300000" /> <input name="userfile[]" type="file" multiple/><br /> <--- ここにmultiple指定 <input type="submit" value="Send files" /> </div>

ImageUploader.php

<?php session_start(); if($_SERVER["REQUEST_METHOD"] == "POST"){ $files = $_FILES['userfile']['name']; var_dump($files); $count = count($_FILES['userfile']['name']); for ($i=0; $i<$count; $i++) { if (is_uploaded_file($_FILES["userfile"]["tmp_name"][$i])) { if($_FILES["userfile"]["size"][$i] > 1000000){ $error[] = '画像サイズが大きすぎる!'; }else{ move_uploaded_file($_FILES["userfile"]["tmp_name"][$i],"files/" . $_FILES["userfile"]["name"][$i]); } } else { echo "ファイルが選択されていません。<br>"; } } $_SESSION['error'] = $error; //error数の確認 if(count($error) > 0){ header('Location: ./gallery.php'); //確認画面を表示 }else{ ?> <div class="staff_add"> <form action="pro_add_done.php" method="post"> <input type="hidden" name="userfile[]" value="<?php echo $files; ?>" multiple> <!--<p><img src="./images/<?php echo h($gazou['name']); ?>"></p>--> <div> <input type="button" onclick="history.back()" value="戻る"> <input type="submit" value="確認"> </div> </form> </div> <?php } }

Imgdone.php

コード <?php session_start(); require '../lib/functions.php'; require '../header.php'; if($_SERVER["REQUEST_METHOD"] !== "POST"){ die("不正アクセス"); } //DBへ接続 try{ //変数にpostされた変数を代入します $gazou_name = h($_FILES['userfile']); var_dump($gazou_name); $pdo = new PDO('mysql:host=localhost;dbname=boren;charset=utf8', 'root', ''); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $sql = 'insert into painting(gazo) values(?)'; for($i=1; $i<count($gazou_name); $i++){ $product = $pdo->prepare($sql); $product->bindValue(1, $gazou_name[$i]); } // $product = $pdo->prepare($sql); // $product->bindValue(1, $gazou_name); $product->execute(); //var_dump(); $pdo = null; }catch(Exception $e){ die('接続エラー:' . $e->getMessage()); } ?>

複数画像をDBに登録するなら、DBの仕様はこのような感じだとダメのかしら、どのように考えれば良いでしょうか?
すみませんが、どなた方ご教示お願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

複数画像を登録するなら、PDOのexecuteをその回数分やらないとだめです。あと、prepareは1回でいいです。ついでにforが1から始まってるのもおかしいので0に直しました。

PHP

1 $product = $pdo->prepare($sql); 2 for($i=0; $i<count($gazou_name); $i++){ 3 $product->bindValue(1, $gazou_name[$i]); 4 $product->execute(); 5 }

prepareは「?の部分を後から置き換えられるSQL文を作る」処理であり、bindValueが「?の部分に埋め込む」処理であり、executeが「そのSQL文を実行する」処理です。まずprepareでinsert用のSQL文が作られ、bindValueでファイル名を埋め込み、executeで実際にDBに書き込まれます。

投稿2017/11/29 01:06

masaya_ohashi

総合スコア9206

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

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

shaobao

2017/11/30 14:48

masaya_ohashiさん この度、ご回答いただきありがとうございます。 ご返事が遅くなりました。大変失礼致しました。 ご丁寧にご説明頂き誠にありがとうございました。 大変助かりました。 私は、その辺について、理解不足でした。おかけ様で勉強になりました。 ありがとうございました。
guest

0

全てのファイルの先頭に

php

1<?php 2 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5

を記述して実行しましょう。
開発時には必須です。

投稿2017/11/28 14:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shaobao

2017/11/28 14:56

kosuke_shibuyaさん 早速ご回答いただきありがとうございます。 ご指摘して頂きありがとうございます。 今後このようにして心掛けるように致します。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2017/11/28 15:01

とりあえず、コピペで動作確認できるだけの情報があれば、今は暇なので、検証できるけど、さしあたって、../lib/functions.php ../header.php の中身が提示されていません。
shaobao

2017/11/30 14:59

kosuke_shibuyaさん この度、ご回答いただきありがとうございます。 ご返事が遅くなりました。大変失礼致しました。 今回、masaya_ohashiさんからの回答で、問題を解決致しました。 ご指摘の点について、今後参考させて頂きます。 ありがとうございました。
guest

0

$gazou_nameが配列でバルクで流し込みたいなら、こんなふうにしてみては?

PHP

1if(count($gazou_name)>0){ 2 $sql ='insert into painting(gazo) values'; 3 $sql.=implode(',',array_fill(0,count($gazou_name),'(?)')); 4 $stmt = $pdo->prepare($sql); 5 $stmt->execute($gazou_name); 6}

gazoがvarchar(30)だと心もとない感じがしますね

投稿2017/11/29 00:42

yambejp

総合スコア114583

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

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

shaobao

2017/11/30 14:53

yambejpさん この度、ご回答いただきありがとうございます。 ご返事が遅くなりました。大変失礼致しました。 ご指摘の点について、ご参考させて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問