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

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

ただいまの
回答率

91.35%

  • PHP

    15156questions

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

mysqlでDBへ複数画像保存

解決済

回答 3

投稿 2017/11/28 23:42

  • 評価
  • クリップ 0
  • VIEW 112

shaobao

score 25

こんばんは。

今回、複数画像をアップロードして、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の仕様はこのような感じだとダメのかしら、どのように考えれば良いでしょうか?
すみませんが、どなた方ご教示お願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

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


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

投稿 2017/11/29 10:06

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/30 23:48

    masaya_ohashiさん

    この度、ご回答いただきありがとうございます。
    ご返事が遅くなりました。大変失礼致しました。
    ご丁寧にご説明頂き誠にありがとうございました。
    大変助かりました。

    私は、その辺について、理解不足でした。おかけ様で勉強になりました。
    ありがとうございました。

    キャンセル

+1

全てのファイルの先頭に

<?php

ini_set('display_errors', true);
error_reporting(E_ALL);

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

投稿 2017/11/28 23:48

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 23:56

    kosuke_shibuyaさん
    早速ご回答いただきありがとうございます。
    ご指摘して頂きありがとうございます。

    今後このようにして心掛けるように致します。
    ありがとうございます。

    キャンセル

  • 2017/11/29 00:01

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

    キャンセル

  • 2017/11/30 23:59

    kosuke_shibuyaさん

    この度、ご回答いただきありがとうございます。
    ご返事が遅くなりました。大変失礼致しました。

    今回、masaya_ohashiさんからの回答で、問題を解決致しました。

    ご指摘の点について、今後参考させて頂きます。
    ありがとうございました。

    キャンセル

0

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

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

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

投稿 2017/11/29 09:42

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/30 23:53

    yambejpさん

    この度、ご回答いただきありがとうございます。
    ご返事が遅くなりました。大変失礼致しました。

    ご指摘の点について、ご参考させて頂きます。
    ありがとうございました。

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

  • 解決済

    【PHP】ログイン機能の実装

    PHP初心者です。 PHPの勉強がてら、会員制のページを作成してます。 新規会員登録機能は実装できていますが、 ログイン機能の実装がうまくいきません。 やりたいことを実

  • 解決済

    非同期通信を使用して画像をアップロードしたい。

    現在FuelPHPをりよ空いて開発しているのですが 画像を一度に複数上げるために非同期通信を実装したいです。 参考にしているサイト 実装したい機能イメージ このように画像を複数あげ

  • 解決済

    PHPで最大公約数を出したい。

    PHPで最大公約数を出すものを作りたく、下記のようなソースを書いたのですが、 <!DOCTYPE html> <html lang="ja"> <meta charset=ut

  • 解決済

    [PHP]POSTに失敗してしまいます

    PHP勉強中の者です。現在自動販売機作成ツールの管理画面を作成しているのですが、POSTの処理につまずいてしまっています。 ご教授頂ければ幸いです。 現在作成しているコードは以下の

  • 解決済

    【PHPmySQL】チェックボックス・フリーワードでの検索条件の絞り込み方法

    PHPmySQLでデータベースの検索結果を出力したいです。 接続はPDOで行いました。テーブル\(適当\)の画像は下に貼っておきます。 下記コードでは、フリーワードで入力した値

  • 受付中

    phpでの掲示板編集機能について

    現在phpを用いた掲示板を作成しているのですが、指定した番号のコメントを編集する機能がどうしても実装できません。 改善点を教えて頂けると嬉しいです。 <html> <body>

  • 解決済

    PHPのアンケートに於ける番号表記

    PHPでアンケートフォームを作成しているのですが、アンケートの投稿番号の表記がうまくいきません。 1行ごとに「{番号}<>{名前}<>{コメント}<>{投稿された時間}」と言う形で

  • 解決済

    検索結果ページのnullの場合の条件分岐について

    勤務地等何かを選択すると、 検索結果が表示されるのですが、全件表示がうまくいきません。 問題:何も選択せずに検索ボタンを押すと、 0件と表示される。 試した方法 ●$_PO

同じタグがついた質問を見る

  • PHP

    15156questions

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