本やネットを見ながら、画像やテキストの投稿システムを作成しています。
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"> 2… 3<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よろしくお願いいたします。
前回質問にて幾つかアドバイスをしましたが、その辺りはどのようになっていますか?例えば「それぞれの機能を理解し、適切な場面で適切に使えるように試行錯誤していってください。」辺り。コピペはきちんと理解できている上で使うべきです(そうしないと同じ質問を繰り返すことになり一生成長しません) 「php ブラウザバック」などで調べれば原因と対策(のようなもの)は沢山でてくるので、まず調べてください。ここで何かしらの回答を得て、それをコピペするだけでは結局何も進んでいることになりません。
可能な限り調べてマニュアル等も読みますが、経験値がマニュアルを理解出来るほどなく理解が追いつきません。しかし、上司には早くとプレッシャーをかけられており、ほとほと困り果てて質問しております。何が原因そうかだけでも教えては頂けませんか?
あ、すみません。ひとまず「phpブラウザ バック」で調べます。ありがとうございます。
急がば回れです。ただやっただけでは問題を先延ばしにしているだけで、後々確実に今とは比べ物にならないくらい大きなトラブルにみまわれます。
history.back() つまりブラウザバックは前のページの情報の整合性などは保証されないので、ブラウザバックに頼らない実装にすべきです。(あくまでキャッシュから読み出しが基本なのでうまくいかなくて当然です)エンドユーザーには「ブラウザバックは使わないように。使った場合の動作は保証しません」と指導するのが一般的なはずです。
ありがとうございます!調べてみましたが、セッションが影響してるというのが何となくわかりました。history.back()がなぜ良くないのかもわかりました。何せプログラマの経験もなく齧った程度の知識で本を頼りに不安になりながらやってるので、このような現場ならではの知識を教えて頂けると非常に助かります!本にはhistory.back()もセッションも載ってましたが、セッションがhistory.back()に影響するとは載っておりませんでしたので、本当に助かりました!調べたものを踏まえてまた試行錯誤してみます。
影響するかというよりセッションはサーバーで持ってるものでbackはクライアント側で持ってるものなので、クライアント側だけの動作だからセッションは見るはずがありません。
ありがとうございます。すみません、またよくわからなくなりました;結局セッションは関係ないのですか? やっぱり、phpとサーバとブラウザでデータがどう動くかから明確に理解しないと根本的に無理なようですね。ひとまずその辺を意識しつつコード修正してみます。
既に書いているようにhistory.back()、ブラウザバックは利用しない(頼らない)実装にしてください。小手先で修正しても深みにハマるだけです。history.back()をしている以外の理由はなく、セッションは関係ありません。既に書いているように情報管理されている箇所がサーバーとクライアント(アクセスしているPC)で違います。前も書いたように「php 入力 確認 完了」などで調べていくつかの記事を熟読し、オーソドックスな組み方を学んでください。前も少し疑問視はされていましたが、そのタイミングで「txtに保存」という実装はあまり見ません。
結局「調べてみた」という記述だけではどのような記事などを読んだか分からないので、本当に理解につながる情報を得たのかどうかこちらではわかりません。調べた結果も質問に追記してください。初めのうちは正しく取捨選択できるわけではないので、ひとまずすべて試してみて失敗して自身がやりたいことに合うものを探していくことです(遠回りのように見えて結果的に解決と成長が早まります)
いろいろとアドバイスありがとうございます。調べて試したこともすべてうまくいかず理解しきるにも及ばず手詰まりになって昨日の質問に至りました。どう記述すればいいのかまとまらず、時間がないのもあってきちんと対応できず申し訳ないです。
伝わりにくかったですね。言い直します。「中途半端に出来上がったものの枝葉をどうにかするより、いっそ作り直したほうが早い」
もちろんhistory.back()などブラウザバックの仕組みは使わない方向で。
いずれにせよ無料のQAサイトなので私のアドバイスは無責任ですし、気に入らなければ無視してもらって結構です。ただ、現時点で低評価も回答もつかないという状況からこれ以上の回答は望めないのではと思いますけども。(情報が少なすぎて再現確認がとれない、回答者の負荷が高すぎるという観点から)
質問が変わるようで申し訳ないですが、昨日の段階で「戻る」ボタンを押してhistory.back()を使わず<input type="hidden">の形式でinputに戻すというのを試しましたが、$_FILES["photo"]をinputに入れる方法がわからず、どういう理屈になるのか見当がつかずいい調べ方も思いつかず行き詰りました。この辺りの知識が載っているサイトをご存知でしたら教えていただけますか。
$_FILESが持っているのは送信されたファイルの実体なのでinputの初期値に設定することはできません。アップロードした状態で、画像であればその画像を表示、そうでなければファイルへのリンクを設置するかどちらかになります。基本は選択しなおしです。
問題の解決法にはなっていませんが上司とも相談し、history.back()のボタンを置かず確認画面もなしという仕様で完成となりなした(社内で使うごく簡単なシステムなので)。’ひとまずすべて試してみて失敗して自身がやりたいことに合うものを探していく’というのも自分なりにやってるのですが、そのレベルが全然違うというか全く足りないのでしょうね。どのくらいレベルが違うのかも見えないです。次に何か作る機会があれば、 mts10806さんのアドバイスをしっかりと意識して取り組んでいこうと思います。こんな拙い質問に親切にご対応いただき本当にありがとうございました。
回答1件
あなたの回答
tips
プレビュー