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

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

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

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

Q&A

解決済

2回答

1524閲覧

phpで画像ファイルがアップロードできない

bigin

総合スコア67

PHP

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

0グッド

1クリップ

投稿2017/09/10 14:16

編集2017/09/11 14:36

やりたいこと

フォームからPOSTで送信した<画像>と<値>を受け取って、
<画像>→指定したファイルにアップしたい
<値>→テキストファイルにして、出力したい

フォームhtml

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>プレゼント入力フォーム</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="form.css" > <script src="js/bootstrap.min.js"></script> </head> <body> <form action="present_index.html" method="post" class="form" align="left" enctype="multipart/form-data"> <div class="form-group"> 商品名 <input type="text" name="name" placeholder="商品名" class="form-control" required> </div> <div class="form-group"> 商品説明<br> <TEXTAREA name="introduce" maxlength="150" cols="40" rows="6" wrap="off" required></TEXTAREA> </div> <div class="form-group"> 画像 <input type="file" name="image" required> </div> <div class="form-group"> 会社名 <input type="text" name="companyname" placeholder="会社名" class="form-control" required maxlength="2"> </div> <div class="form-group"> URL <input type="url" name="url" value="" class="form-control"> </div> <button type="submit" class="btn btn-default registration">登録</button> </div> </form> </body> </html>

フォーム送信先のphpファイル

<?php $upload = "/Applications/XAMPP/xamppfiles/htdocs/festa"; if(!file_exists($upload)){ mkdir($upload,755,true) }; move_uploaded_file($_FILES['image'],$upload); touch('answer.txt'); $file ='answer.txt'; $value = $_POST['name']."\t".$_POST['introduce']."\t".$_POST['gazou']."\t".$_POST['companyname']."\t".$_POST['url']."\n"; file_put_contents($file, $value, FILE_APPEND | LOCK_EX); echo "投稿完了しました"; ?>

結果として、festaというファイルもanswer.textというテキストも生成されず、「投稿完了しました」ともブラウザに表示されません。

MacでXAMPPを使っています。
php記述内に不備があるかと考えているのですが、ご教示いただけますと幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/09/10 14:38

html部分も合わせて提示してください。
m.ts10806

2017/09/10 23:25

ブラウザに何も出ないということはPHPがエラーをはいて処理がとまっているものと思われます。何かエラーが出力されていないか、エラーログなどをご確認の上、ご提示ください。
bigin

2017/09/11 14:43

html部分を提示させていただきました。
bigin

2017/09/11 14:44

エラーログについてですが、XAMPPのlogsファイルの内のerror_logを見るということでいいでしょうか?すみません、エラーの確認方法がいっぱいでどれがどれやら理解できておらず
guest

回答2

0

move_uploaded_fileの第一引数で$_FILE['image']としていますが
少なくともtmp_nameを指定してあげないと処理がおかしいと思います

投稿2017/09/11 00:27

yambejp

総合スコア114769

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

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

bigin

2017/09/11 14:45

ありがとうございます。しかし、tmp_nameを指定しても結果が変わりませんでした。
guest

0

ベストアンサー

yambejpさんのいうとおり、tmp_name の指定がないと一時ファイルの場所がわかりません。
また、下記のようにしないと保存先のファイル名がないので、フォルダに上書きしようとして
エラーになるので、期待した結果にはならないと思います。

$out = $upload.'/'.basename($_FILES['image']['name']);
$ret = move_uploaded_file($_FILES['image']['tmp_name'], $out);

また、move_uploaded_fileの戻り値も確認した方がいいと思います。

if (!$ret) {

echo 'ファイルの取得失敗';

}

投稿2017/09/11 23:42

n884

総合スコア100

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

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

bigin

2017/09/12 00:32

ありがとうございます。よく理解できました。やって見たのですが、結果として、festaというファイルもanswer.textというテキストも生成されず、「投稿完了しました」ともブラウザに表示されません。。。何か他に原因がありそうですね。。。
n884

2017/09/12 01:19

確認ですが、サンプルの記述はすべて、present_index.html の中ですよね? セミコロン「;」の位置がまちがっているのと、パーミッション指定が違ってます。 単にPHPのエラーなんでは? > if(!file_exists($upload)){ > mkdir($upload,755,true) > }; ↓ > if(!file_exists($upload)){ > mkdir($upload,0755,true); > }
bigin

2017/09/13 12:22

>サンプルの記述はすべて、present_index.html の中ですよね? はい、そうです。 >セミコロン「;」の位置がまちがっているのと、パーミッション指定が違ってます。 単にPHPのエラーなんでは? ご指摘ありがとうございます。確かに!でも、やはり表示されずm(._.)mエラーを出力してみます。
n884

2017/09/14 23:48

>>サンプルの記述はすべて、present_index.html の中ですよね? >はい、そうです。 「フォームhtml」と「フォーム送信先のphpファイル」の内容は1つのファイル(present_index.html)に記述されていて。その部分を抜粋したのが「フォームhtml」と「フォーム送信先のphpファイル」ということで間違いないですか? 前質問が正しいのでしたら、「やって見た」内容で「フォームhtml」と「フォーム送信先のphpファイル」の記述を変えてください。 内容によっては理解してないのかもしれません。
n884

2017/09/15 00:39

パーミッションの問題もありましたね ユーザーとグループってわかりますかね? Apacheで動作するときは、その他のユーザになるので、 0755だと、一番右の5が権限です。実行と読み込みしか許可してないので、書き込みができません。 対処としては 1.ファイルの書き込み先のフォルダのパーミッションを0777で作っておく 2.ファイルの書き込み先のフォルダのパーミッションを0775で作り、グループ属性をapacheにする いずれかの対処が必要ですね。 出典: phpのmove_uploaded_fileのエラーについて - Qiita http://qiita.com/sysy/items/fb25a84b3d130898cb46
bigin

2017/09/16 12:19

お返事遅くなり大変申し訳ありません。 「フォームhtml」と「フォーム送信先のphpファイル」の内容は1つのファイル(present_index.html)に記述→すみません、これは別ファイルに記述されています。 パーミッションもありがとうございます。 確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問