- 締切済み
header.locationで、画面遷移、GET
送り側(file_upload.php) header("Location: bbs_test.php?photo=$upfilename"); 受け側(bbs_test.php) $photo = $_GET['photo']; var_dump($photo); を実行すると、var_dump()の値がNULLになってしまい、 $upfilenameが、GET渡しできません。 ちなみに、$photo = $_GET['photo']; var_dump($photo); の、この2文は、 function()disprecords{ } という関数の中にあるのですが、 なぜ、var_dump($photo); の値がNULLになってしまうのか、どうすれば、 $upfilnameの値を渡せるのか、ご指導いただきたいです。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
他のやり方としては、cookie(セッション)を使うのが順当な所ではないでしょうか。 JavaScriptがわかるならJavaScriptでもできますが。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
HTTPの規格(RFC)では、Locationヘッダ(302ステータスコード)でリダイレクトした場合、POSTで送信した内容をGETで送り直すことになっています。 Locationヘッダの中にクエリー文字列が含まれている場合、どのような扱いになるかは、RFCでは未定義なようです。 もしかすると、何も送られていないのかもしれませんし、最初のPOSTの内容が送られているかもしれませんし、"photo=$upfilename"が送られてるけれども受け取り方に不備があるのかもしれません。 ご参考まで。
お礼
ご指導、どうもありがとうございました。
補足
(1)昨日、「$_GET["upfilename"]が空文字列ではないでしょうか。」というお話でしたが、確かにその通りでして、talooさんのご指摘をふまえて、現在は下記のようにスクリプトを書くと、ログファイルには、期待したファイル名が入ってました。 ---------------------------------------------------- 送り側(file_upload.php) <?php $upload_dir = './files/'; $filename = $_FILES['sendfile']['name']; $upfilename = $upload_dir.urlencode($filename); file_put_contents('log.txt', $upfilename); print "Location: bbs_test.php?photo=".$upfilename; exit; } ?> ------------------------------------------------ (受け側)bbs_test.php function disp_records(){ $photo = $_GET['photo']; var_dump($photo); ⇒NULL です。 ~ } どうすればdisp_records(){ }の$photo変数に添付画像ファイル名が入ってくるのでしょうか? header(Location:)関数でのGET渡しにこだわっているわけではありませんので、なんらかの良い方法があれば、ご指導願えませんでしょうか。 ちなみにFTPサーバーへのアップロード部分は先ほども申しましたが、期待通りのファイルが事実FTPサーバーの、/files/直下にアップされております。あとはFTPサーバーにアップした画像を、disp_records(){}関数で表示させたいだけなのですが。 (2)また、これはGoogle検索したのですが、 画面遷移なしで、ファイルをアップロードする方法という 文面を見つけまして、こういうjavascriptが添えられていたのですが、このスクリプトが何をしているのか、わかりません。(今、javascript勉強中です。)このスクリプトをうまく活用する方法はあるのでしょうか? <script type="text/javascript"><!-- var container = parent.document.getElementById('container'); image = parent.document.createElement('img'); image.src = './<?php print($filename);?>'; container.appendChild(image); //--></script> </body></html>
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
送り側の$upfilenameには期待された値が入ってますか? たとえば動的に値を生成するのではなく、直接記述してみたり、 送り側(file_upload.php) header("Location: bbs_test.php?photo=photo.jpg"); ログファイルに書きだして確認してみるとどうでしょうか。 送り側(file_upload.php) file_put_contents('log.txt', $upfilename); header("Location: bbs_test.php?photo=$upfilename"); No.1補足のとおりなら >前略 >$upfilename = $upload_dir.$filename; >$upfilename=urlencode($_GET["upfilename"]); >header("Location: bbs_test.php?photo=$upfilename"); >後略 $_GET["upfilename"]が空文字列ではないでしょうか。 投稿時のコピーミスでなければ。
お礼
ご指導、どうもありがとうございました。
補足
今、ログファイルに$upfilnameを書き出したところ、 ./files/画像ファイル名(.jpg) と、値がちゃんと入っておりました。 しかし、受け側(bbs_test.php)で、var_dump()したところ NULLと表示されます。 header()関数でbbs_test.phpにクエリー文字列を 連れて、リダイレクトした場合、bbs_test.phpの どの関数ブロック内からでも、$_GET['photo']で参照できるのでしょうか?そこらへんがちょっとよく理解できておりません。
- yambejp
- ベストアンサー率51% (3827/7415)
何か見落としている気がするのですが・・・ とりあえず >if(move_uploaded_file($tmpname, $upfilename)){ >header("Location: bbs_test.php?photo=".$upfilename); >exit; >} のところを if(move_uploaded_file($tmpname, $upfilename) and !empty($upfilename)){ print "Location: bbs_test.php?photo=".$upfilename; exit; } にしてみてください。 それでだめならbbs_test.php側で print_r($_GET); とかでチェックするとか・・・
お礼
ご回答、どうもありがとうございます。 恐縮しております。
補足
とりあえず、ご報告を。 file_upload.php側で、yambe.jpさまのように書いてみたのですが、やはり、NULLでした。 そして、bbs_test.php側でも、print_r($_GET); を試させていただいたのですが、Array ( ) NULL と表示されました。 何かを見落としてる可能性がありますので、yambe.jpさまの 書かれたソースをもう一回じっくり拝見いたします。
- yambejp
- ベストアンサー率51% (3827/7415)
思いなおしてurlencodeの位置を変えてみました これでもダメでしょうか? その場合phpのバージョンはなにをお使いでしょうか? <?php $upload_dir = './files/'; $filename = $_FILES['sendfile']['name']; $upfilename = $upload_dir.urlencode($filename); $tmpname=$_FILES['sendfile']['tmp_name']; if(move_uploaded_file($tmpname, $upfilename)){ header("Location: bbs_test.php?photo=".$upfilename); exit; } ?> <form enctype="multipart/form-data" method="post"> <input type="file" name="sendfile"> <input type="submit" value="go"> </form>
お礼
ご回答、どうもありがとうございました。
補足
やはりだめでした。NULLのままです。 PHPのバージョンは5.4 でした。
- yambejp
- ベストアンサー率51% (3827/7415)
細かいtypoとかですかね 以下テストしてみてください もちろん「$upload_dir」で指定されるディレクトリに書き込み属性がないと move_uploaded_file()は失敗しますね <?php $upload_dir = './files/'; $filename = $_FILES['sendfile']['name']; $upfilename = $upload_dir.$filename; $tmpname=$_FILES['sendfile']['tmp_name']; if(move_uploaded_file($tmpname, $upfilename)){ header("Location: bbs_test.php?photo=".urlencode($upfilename)); exit; } ?> <form enctype="multipart/form-data" method="post"> <input type="file" name="sendfile"> <input type="submit" value="go"> </form>
お礼
お答えいただき、ありがとうございました。
補足
typo というのはわかりませんが、簡易BBSです。 ※move_uploadは成功しており、./filesディレクトリに アップされてはいるのですが、FTPサーバーにアップした 画像ファイルをbbs_test.php側で表示したいのですが、 できません。($photo の中身がNULLなので。) 送り側 header("Location: bbs_test.php?photo=".urlencode($upfilename)); を使わせていただいたのですが、やはり受け側で $photo = $_GET['photo']; var_dump($photo); がNULLになります。どこか間違ってるのでしょうか?
- yambejp
- ベストアンサー率51% (3827/7415)
意味がよくわからない file_upload.php?upfilename=hogehoge.jpg で受けたものを //file_upload.php <?PHP $upfilename=urlencode($_GET["upfilename"]); header("Location: bbs_test.php?photo=$upfilename"); exit; ?> のような感じで処理しているということ? そうでなければ$upfilenameが渡らないから当然bbs_test.phpでは nullしか返らないと思いますが
補足
file_upload.php(送り側) <?php $upload_dir = './files/'; $filename = $_FILES['sendfile']['name']; var_dump($filename); if(move_uploaded_file($_FILES['sendfile'] ['tmp_name'], $upload_dir.$filename)){ $upfilename = $upload_dir.$filename; $upfilename=urlencode($_GET["upfilename"]); header("Location: bbs_test.php?photo=$upfilename"); exit; } ?> ---------------------------------------------------- bbs_test.php(受け側) function disp_records(){ $photo = $_GET['photo']; var_dump($photo); ~ } こういう感じで作ってるんですが、 これでも、まだ var_dump($photo) がNULLとなり、 $upfilename が渡っていませんでした。 どこがいけないのでしょうか?
お礼
ご指導、どうもありがとうごじました。
補足
すみません。大変恐縮ですが、JavaScriptを利用した方法を ご指導いただけませんでしょうか>< セッション変数は、自分なりに試みたことがあるのですが、 確かNULLだったような記憶があります。できましたら、 cookieを利用した方法も、重ねてご指導いただければ 幸いです。