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

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

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

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

Q&A

解決済

1回答

537閲覧

戻るボタンとPOST?画像生成?の動作が不安定

3.a.m.op

総合スコア11

PHP

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

0グッド

0クリップ

投稿2018/05/10 07:45

本やネットを見ながら、画像やテキストの投稿システムを作成しています。

input.phpで<input>から画像ファイルをアップ

confirm.phpでPOSTされた画像をリサイズし、その画像ファイルをサーバ上に生成し、
そのファイルを確認表示
POSTされたテキストを確認表示

save.phpでテキストをサーバのファイルへ保存

output.phpでサーバ上のファイルを読み出して表示

という流れとしてます。
この画像の部分で困っています。

input.php

html

1<form action="confirm.php" method="post"> 2<input type="file" name="photo"> 3<button type="submit">確認</button> 4</form>

confirm.php

php

1if (is_uploaded_file($_FILES["photo"]["tmp_name"])) { 2 $file1 = $_FILES["photo"]["tmp_name"]; // 元画像ファイル 3 $file2 = './image/example.jpg'; // 画像保存先のパス 4 $in = ImageCreateFromJPEG($file1); // 元画像ファイル読み込み 5 $width = ImageSx($in); // 画像の幅を取得 6 $height = ImageSy($in); // 画像の高さを取得 7 $min_width = 235; // 幅の最低サイズ 8 $min_height = 155; // 高さの最低サイズ 9 $image_type = exif_imagetype($file1); // 画像タイプ判定用 10 11 if ($image_type == IMAGETYPE_JPEG){ // JPGかどうか判定 12 if($width >= $min_width|$height >= $min_height){ 13 if($width == $height) { 14 $new_width = $min_width; 15 $new_height = $min_height; 16 } else if($width > $height) {//横長の場合 17 $new_width = $min_width; 18 $new_height = $height*($min_width/$width); 19 } else if($width < $height) {//縦長の場合 20 $new_width = $width*($min_height/$height); 21 $new_height = $min_height; 22 } 23 // 画像生成 24 $out = ImageCreateTrueColor($new_width , $new_height); 25 ImageCopyResampled($out, $in,0,0,0,0, $new_width, $new_height, $width, $height); 26 ImageJPEG($out, $file2); 27 } 28 } 29}

html

1<form action="save.php" method="post"> 23<button type="button"onclick="history.back()">戻る</button> 4<button type="submit">更新</button> 5</form> 6```confirmで確認後、戻るボタンを押しinputで画像を指定し直してconfirmに再POSTしても 7訂正前の画像が表示されてしまうことがあります。 8(私のWin10だときちんと動作するのですが、MacやWin7で試した時に動作しないことがある) 9キャッシュなのかと思い、消去したりもしましたが違いました。 10 11confirm.php のphp部分はサンプルからのコピペで細かいとこまでしっかり理解できていません。 12初心者なので何がいけないのか全く見当もつきません。 13調べているときにhistory.back()を使わないほうがいいとも見かけましたが、そのせいでしょうか。 14どうすればきちんと動作するのでしょうか? 15よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2018/05/10 08:06

前回質問にて幾つかアドバイスをしましたが、その辺りはどのようになっていますか?例えば「それぞれの機能を理解し、適切な場面で適切に使えるように試行錯誤していってください。」辺り。コピペはきちんと理解できている上で使うべきです(そうしないと同じ質問を繰り返すことになり一生成長しません) 「php ブラウザバック」などで調べれば原因と対策(のようなもの)は沢山でてくるので、まず調べてください。ここで何かしらの回答を得て、それをコピペするだけでは結局何も進んでいることになりません。
3.a.m.op

2018/05/10 08:17

可能な限り調べてマニュアル等も読みますが、経験値がマニュアルを理解出来るほどなく理解が追いつきません。しかし、上司には早くとプレッシャーをかけられており、ほとほと困り果てて質問しております。何が原因そうかだけでも教えては頂けませんか?
3.a.m.op

2018/05/10 08:20 編集

あ、すみません。ひとまず「phpブラウザ バック」で調べます。ありがとうございます。
m.ts10806

2018/05/10 08:23

急がば回れです。ただやっただけでは問題を先延ばしにしているだけで、後々確実に今とは比べ物にならないくらい大きなトラブルにみまわれます。
m.ts10806

2018/05/10 08:27 編集

history.back() つまりブラウザバックは前のページの情報の整合性などは保証されないので、ブラウザバックに頼らない実装にすべきです。(あくまでキャッシュから読み出しが基本なのでうまくいかなくて当然です)エンドユーザーには「ブラウザバックは使わないように。使った場合の動作は保証しません」と指導するのが一般的なはずです。
3.a.m.op

2018/05/10 12:52 編集

ありがとうございます!調べてみましたが、セッションが影響してるというのが何となくわかりました。history.back()がなぜ良くないのかもわかりました。何せプログラマの経験もなく齧った程度の知識で本を頼りに不安になりながらやってるので、このような現場ならではの知識を教えて頂けると非常に助かります!本にはhistory.back()もセッションも載ってましたが、セッションがhistory.back()に影響するとは載っておりませんでしたので、本当に助かりました!調べたものを踏まえてまた試行錯誤してみます。
m.ts10806

2018/05/10 12:53

影響するかというよりセッションはサーバーで持ってるものでbackはクライアント側で持ってるものなので、クライアント側だけの動作だからセッションは見るはずがありません。
3.a.m.op

2018/05/10 13:07

ありがとうございます。すみません、またよくわからなくなりました;結局セッションは関係ないのですか? やっぱり、phpとサーバとブラウザでデータがどう動くかから明確に理解しないと根本的に無理なようですね。ひとまずその辺を意識しつつコード修正してみます。
m.ts10806

2018/05/10 20:37

既に書いているようにhistory.back()、ブラウザバックは利用しない(頼らない)実装にしてください。小手先で修正しても深みにハマるだけです。history.back()をしている以外の理由はなく、セッションは関係ありません。既に書いているように情報管理されている箇所がサーバーとクライアント(アクセスしているPC)で違います。前も書いたように「php 入力 確認 完了」などで調べていくつかの記事を熟読し、オーソドックスな組み方を学んでください。前も少し疑問視はされていましたが、そのタイミングで「txtに保存」という実装はあまり見ません。
m.ts10806

2018/05/10 20:52

結局「調べてみた」という記述だけではどのような記事などを読んだか分からないので、本当に理解につながる情報を得たのかどうかこちらではわかりません。調べた結果も質問に追記してください。初めのうちは正しく取捨選択できるわけではないので、ひとまずすべて試してみて失敗して自身がやりたいことに合うものを探していくことです(遠回りのように見えて結果的に解決と成長が早まります)
3.a.m.op

2018/05/11 00:03

いろいろとアドバイスありがとうございます。調べて試したこともすべてうまくいかず理解しきるにも及ばず手詰まりになって昨日の質問に至りました。どう記述すればいいのかまとまらず、時間がないのもあってきちんと対応できず申し訳ないです。
m.ts10806

2018/05/11 00:06

伝わりにくかったですね。言い直します。「中途半端に出来上がったものの枝葉をどうにかするより、いっそ作り直したほうが早い」
m.ts10806

2018/05/11 00:07

もちろんhistory.back()などブラウザバックの仕組みは使わない方向で。
m.ts10806

2018/05/11 00:09

いずれにせよ無料のQAサイトなので私のアドバイスは無責任ですし、気に入らなければ無視してもらって結構です。ただ、現時点で低評価も回答もつかないという状況からこれ以上の回答は望めないのではと思いますけども。(情報が少なすぎて再現確認がとれない、回答者の負荷が高すぎるという観点から)
3.a.m.op

2018/05/11 00:12 編集

質問が変わるようで申し訳ないですが、昨日の段階で「戻る」ボタンを押してhistory.back()を使わず<input type="hidden">の形式でinputに戻すというのを試しましたが、$_FILES["photo"]をinputに入れる方法がわからず、どういう理屈になるのか見当がつかずいい調べ方も思いつかず行き詰りました。この辺りの知識が載っているサイトをご存知でしたら教えていただけますか。
m.ts10806

2018/05/11 00:15 編集

$_FILESが持っているのは送信されたファイルの実体なのでinputの初期値に設定することはできません。アップロードした状態で、画像であればその画像を表示、そうでなければファイルへのリンクを設置するかどちらかになります。基本は選択しなおしです。
3.a.m.op

2018/05/11 04:51 編集

問題の解決法にはなっていませんが上司とも相談し、history.back()のボタンを置かず確認画面もなしという仕様で完成となりなした(社内で使うごく簡単なシステムなので)。’ひとまずすべて試してみて失敗して自身がやりたいことに合うものを探していく’というのも自分なりにやってるのですが、そのレベルが全然違うというか全く足りないのでしょうね。どのくらいレベルが違うのかも見えないです。次に何か作る機会があれば、 mts10806さんのアドバイスをしっかりと意識して取り組んでいこうと思います。こんな拙い質問に親切にご対応いただき本当にありがとうございました。
guest

回答1

0

自己解決

history.back()のボタンを置かず確認画面もなしという仕様に変更。

投稿2018/05/11 04:53

3.a.m.op

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問