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

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

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

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

Q&A

1回答

1181閲覧

[PHP]ボタンクリックイベントでファイルがアップロードできない

pofinpouty

総合スコア20

PHP

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

0グッド

0クリップ

投稿2021/12/08 05:34

編集2021/12/08 09:02

PHPでボタンをクリックしたときに、データベースにファイル名を格納し、指定のフォルダにアップロードできるようにしたいと考えています。
前回の質問で、データベースにファイル名を登録することができたので、次のステップとしてファイルのアップロードを行いたいと思っていたのですが、クリック時にエラーが起こらず、メッセージも表示されない事態となってしまったので質問させていただきます。

insert.php

1<?php 2 3$dsn = 'mysql:host=*****;dbname=Test;charset=utf8;unix_socket=/mysql.sock'; 4$user = 'user'; 5$password = 'pass'; 6 7$pathBe = '/top/Server/before'; 8$pathAf = '/top/Server/after'; 9 10try{ 11 if (!empty($_FILES['beforeFile']['tmp_name']) && is_uploaded_file($_FILES['beforeFile']['tmp_name']) && !empty($_FILES['afterFile']['tmp_name']) && is_uploaded_file($_FILES['afterFile']['tmp_name'])) { 12 $dbh = new PDO($dsn, $user, $password); 13 14 $before = isset($_POST['beforeFile']) ? $_POST['beforeFile'] : ''; 15 $after = isset($_POST['afterFile']) ? $_POST['afterFile'] : ''; 16 17 if( move_uploaded_file( $_FILES['beforeFile']['tmp_name'], $pathBe.'upload_pic.jpg') && move_uploaded_file( $_FILES['afterFile']['tmp_name'], $pathAf.'upload_pic.jpg')) { 18 echo 'アップロードされたファイルを保存しました。'; 19 20 } else { 21 echo 'アップロードされたファイルの保存に失敗しました。'; 22 } 23 24 25 $stmt = $dbh->prepare('insert into Test(beforeFile, afterFile) value (?, ?)'); 26 27 $stmt->bindValue(1, $before); 28 $stmt->bindValue(2, $after); 29 $stmt->execute(); 30 31 $dbh = null; 32 //メッセージのセット 33 $msg = '登録完了'; 34 } 35} 36catch(PDOException $e){ 37 header('Content-Type: text/plain; charset=UTF-8', true, 500); 38 exit($e->getMessage()); 39} 40?> 41 42<head> 43 <title>登録画面</title> 44 <meta http-equiv="content-type" charset="UTF-8"> 45</head> 46 47<html> 48 49 <form action="insert.php" method="post" enctype="multipart/form-data"> 50 <p>before</p> 51 <input type="file" name="beforeFile" accept="image/jpg, image/png" required> 52 <p>after</p> 53 <input type="file" name="afterFile" accept="image/jpg" readonly> 54 55 <p><input type="submit" value="登録"></p> 56 </form> 57 58 <?php if ($msg): ?> 59 <p><?=$msg?></p> 60 <?php

上記コードの場合、データベースに登録できていた処理も通っていないようだったので探っていたところ、htmlのformに「enctype="multipart/form-data"」と記述すると保存も何もされないという状況になることがわかりました。
しかし、いろんなサイトを拝見した結果、ファイルをアップロードするにはこの記述が必要のようなので何がダメなのか確認できませんでした。
前回の質問から、html内の記述はformしか変えておりません。
どこが原因かわかる方がいましたら教えていただきたいです。

追記
データベースへの登録とアップロードを一度にやろうとして混乱していたため、アップロード部分に絞って記述してみました。

PHP

1<?php 2 3$dsn = 'mysql:host=*****;dbname=Test;charset=utf8;unix_socket=/mysql.sock'; 4$user = 'user'; 5$password = 'pass'; 6 7$pathBe = '/top/Server/before'; 8$pathAf = '/top/Server/after'; 9 10try{ 11 if (!empty($_FILES['beforeFile']['tmp_name']) && is_uploaded_file($_FILES['beforeFile']['tmp_name']) && !empty($_FILES['afterFile']['tmp_name']) && is_uploaded_file($_FILES['afterFile']['tmp_name'])) { 12 $dbh = new PDO($dsn, $user, $password); 13 14 if (move_uploaded_file($_FILES["beforeFile"]["tmp_name"], $pathBe. $_FILES["beforeFile"]["name"]) && move_uploaded_file($_FILES["afterFile"]["tmp_name"], $pathAf. $_FILES["afterFile"]["name"])) { 15 chmod($markerpath . $_FILES["beforeFile"]["name"], 0644); 16 chmod($contentspath . $_FILES["afterFile"]["name"], 0644); 17 echo $_FILES["beforeFile"]["name"] . "をアップロードしました。"; 18 echo $_FILES["afterFile"]["name"] . "をアップロードしました。"; 19    //追記// 20                       echo $_FILES["beforeFile"]["error"]; 21                       echo $_FILES["afterFile"]["error"]; 22} else { 23 24 echo "ファイルをアップロードできません。"; 25 //追記// 26                       echo $_FILES["beforeFile"]["error"]; 27                       echo $_FILES["afterFile"]["error"]; 28 } 29 } else { 30 echo "ファイルが選択されていません。"; 31 //追記// 32                       echo $_FILES["beforeFile"]["error"]; 33                       echo $_FILES["afterFile"]["error"]; 34 } 35} 36catch(PDOException $e){ 37 header('Content-Type: text/plain; charset=UTF-8', true, 500); 38 exit($e->getMessage()); 39} 40?> 41 42<head> 43 <title>登録画面</title> 44 <meta http-equiv="content-type" charset="UTF-8"> 45</head> 46 47<html> 48 49 <form action="insert.php" method="post" enctype="multipart/form-data"> 50 <p>before</p> 51 <input type="file" name="beforeFile" accept="image/jpg, image/png" required> 52 <p>after</p> 53 <input type="file" name="afterFile" accept="image/jpg" readonly> 54 55 <p><input type="submit" value="登録"></p> 56 </form> 57 58 <?php if ($msg): ?> 59 <p><?=$msg?></p> 60 <?php

上記のコードがアップロード部分のみとなります。
片方のみにした場合アップロードできることを確認しました。単純に2つ分に増やしたコードだったのですが、原因を教えていただきたいです。

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

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

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

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

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

guest

回答1

0

$_FILES['beforeFile']で受けているのに参照するときに$_POST['beforeFile']をみてるからでは?

とりあえず以下で確認できますよね?

PHP

1<?PHP 2$beforeFile=(isset($_FILES["beforeFile"]) and $_FILES["beforeFile"]["error"]===0)?$_FILES["beforeFile"]:null; 3$afterFile =(isset($_FILES["afterFile"]) and $_FILES["afterFile"]["error"]===0)? $_FILES["afterFile"] :null; 4var_dump([$beforeFile,$afterFile]); 5?> 6<form method="post" enctype="multipart/form-data"> 7<p>before</p> 8<input type="file" name="beforeFile" accept="image/jpg, image/png"> 9<p>after</p> 10<input type="file" name="afterFile" accept="image/jpg" readonly> 11<p><input type="submit" value="登録"></p> 12</form> 13

投稿2021/12/08 05:41

編集2021/12/08 09:24
yambejp

総合スコア114833

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

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

pofinpouty

2021/12/08 06:55

回答ありがとうございます! 自分自身、登録とアップロードを同時に行おうとして困惑していたため、区別をつけるためにアップロード部分のみのコードを質問文に追記させていただきました。 片方のみの場合はアップロードできたのですが、複数やりたい場合にできない状態です。 原因など分かりましたらアドバイスいただきたいです。。
yambejp

2021/12/08 08:03

PDOが宣言されていますが、DBにinsertやupdateする仕組みになってませんね アップロードのエラーチェックもしてください$_FILES["名前"]["error"]>0ならエラーです $pathBe ($pathAf )もrootパスからの絶対パスで大丈夫なんでしょうか? $pathBe.$_FILES["beforeFile"]["name"]とするとスラッシュがないので名前の先頭に beforeという接頭文字がつく仕様になりますが大丈夫なんでしょうか? $_FILES["beforeFile"]["name"]をそのまま利用してるのも感心しません もろもろ一つづつ潰していかないとミスが多発しているような気がします
pofinpouty

2021/12/08 09:11

色々ご指摘いただきありがとうございます。。。 エラーチェックについてなのですが、質問文のコードに echo $_FILES["beforeFile"]["error"]; echo $_FILES["afterFile"]["error"]; を追記させていただきました。 その結果、ボタンクリック後、「ファイルが選択されておりません。」 のみが表示されエラーチェックの数字が表示されませんでした。。 片方のみの場合、想定通りのファイルをアップロードした時に「◯◯をアップロードしました。0」 と表示されていたので処理が通っているようでした。
yambejp

2021/12/08 09:14

DB登録はとりあえずほっておいていいですね?
pofinpouty

2021/12/08 09:18

はい。。DB登録は前回の質問時のコードで消し忘れておりました。申し訳ありません
yambejp

2021/12/08 09:26

追記しておきました。 受け取ったデータを一旦変数$beforeFileと$afterFileに落とし込んで あとは条件分をつけて処理してください
pofinpouty

2021/12/08 09:33

追記していただいたコードのみのphpで動くか?ということですよね。。 array(2) { [0]=> array(5) { ["name"]=> string(7) "No2.png" ["type"]=> string(9) "image/png" ["tmp_name"]=> string(26) "/private/var/tmp/phpAjSJdJ" ["error"]=> int(0) ["size"]=> int(147597) } [1]=> array(5) { ["name"]=> string(12) "Sample3a.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(26) "/private/var/tmp/phpj8JI6v" ["error"]=> int(0) ["size"]=> int(26098) } } 値が入っていることを確認できました。。
yambejp

2021/12/08 09:38

両方に値があるときだけアップロードなら $beforeFile=(isset($_FILES["beforeFile"]) and $_FILES["beforeFile"]["error"]===0)?$_FILES["beforeFile"]:null; $afterFile =(isset($_FILES["afterFile"]) and $_FILES["afterFile"]["error"]===0)? $_FILES["afterFile"] :null; if(!is_null($beforeFile) and !is_null($afterFile)){ print "upload"; } みたいな処理です
pofinpouty

2021/12/09 05:05

返信が遅れてしまい申し訳ありません。 コードありがとうございます。確認してみます
pofinpouty

2021/12/09 05:55

すいません。まだ両方でアップロードできるかの確認はできていないのですが、動画の場合(accept="video/mp4")だと単体でもアップロードできないことがわかりました。 https://webbibouroku.com/Blog/Article/html5-file-accept 上記のURLを参考に動画の場合はvideo/mp4という記述があったので真似ていました。動画のアップロードは難しいのでしょうか
pofinpouty

2021/12/09 06:02 編集

確認不足で申し訳ありません。。 yambejp様に教えていただいたコードがどちらも画像ファイルだったため、もしやと思い、beforeFile、afterFile両方を"image/jpg"にしたところ、昨日のソースコードの時点でアップロードすることができましたね。。 やはり動画に問題があるのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問