変数の参照について

このQ&Aのポイント
  • 複数の画像とそのサムネイルを登録し、表示するスクリプトを作っています。
  • 画像ファイルを配列で受け取り、保存する処理を行っています。
  • ファイルの保存とサムネイルの作成が正常に行われない問題が発生しています。
回答を見る
  • ベストアンサー

変数の参照?について

複数の画像とそのサムネイル(自動作成)を登録(保存)、表示するスクリプトを作っています。 質問は、下記に出現する「$imgname[$i]」「$img_thumb[$i]」の各変数が場所によって参照(反映?)されない問題の解決方法についてです。 1.formを使い、下記のようにして複数の画像ファイルを配列で渡します。 <input type="file" name="img[]" size="100"> 2.そのファイルを受取り、処理する関数は下記のような流れです。 <?php function screen_entconf(){ //保存するディレクトリ define('DIR', 'img/'); //受け取ったファイルをフォルダに振り分け、保存 for ($i = 0; $i <= 2; $i++) { if (is_uploaded_file(@$_FILES["img"]["tmp_name"][$i])) { switch($cateid) { case 1: $imgdir = DIR . "esy/"; break; } $imgname[$i] = basename($_FILES['img']['name'][$i]); $imgfile[$i] = $imgdir . $imgname[$i]; // テンポラリファイルを保存ディレクトリにコピー copy($_FILES["img"]["tmp_name"][$i], $imgfile[$i]); //GDライブラリにてサムネイル作成 <--中略--> //出力先ディレクトリにサムネイルを保存 if (preg_match('/\.jpg$/', $imgname[$i]) > 0) { ImageJpeg($img_out[$i], $imgdir . "s_" . $imgname[$i] ); $img_thumb[$i] = "s_" . $imgname[$i]; } //イメージの開放  【【この位置でechoによる画像&ファイル名表示は可能】】 }  } ?> <form // 確認表示(ファイル名&画像等) ★★↓ここ以降、変数が全く無視され、何も表示されません。★★ <P><?=$imgname[$i]?> <P><?=$img_thumb[$i]?> (…後少し続きますが、補足欄で追記予定) ■何か解決のヒントが頂ければ幸いです。よろしくお願いします。

  • fou
  • お礼率93% (41/44)
  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

>【【この位置でechoによる画像&ファイル名表示は可能】】 ここ見てませんでした これは変数のスコープの問題ですね 関数内で設定した変数は関数の外では使えません($_POSTや$_FILESなどの特殊なものを除いて) 同じ変数名でも違うものとして扱われます 引数も戻り値もなく1回しか呼ばれないのであれば関数にしなくてもすむのでは

fou
質問者

お礼

早々にご回答頂き、ありがとうございました。 続きのスクリプトは……  <<3回記述>> // DBに登録する処理に値を渡すため再度formで送信 <input type="hidden" name="img" value="<?=$imgname[$i]?>"> <input type="hidden" name="img_thumb" value="<?=$img_thumb[$i]?>">  <<3回記述>> </form> <?php } となっているのですが、画像は最大3種類まで登録予定で、各ファイル名、サムネイル名は他の処理でも使うため、一つの処理の中だけでなく、共通の変数(配列)としてどこでも使える状態にしたいと思っていたのです。 以降、いろいろ自分なりに試してみて、結局、3種類までしか使わないので、 $imgname[$i] → $imgname[0] $img_thumb[$i] → $img_thumb[0] のように直接キーに数値を代入したところ、無事表示されました。 配列の扱いがまだまだ未熟で(というか殆ど出来なくて)、現在、また別の箇所でつまずいております。 ご丁寧に回答してただき、大変ありがとうございました。 また何か質問させて頂いた折にも、よろしければどうぞお知恵をお貸しくださいませ。 ありがとうございました。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

多分 $_FILES["img"]["tmp_name"][$i] じゃなくて $_FILES["img"][$i]["tmp_name"] だと思います print_r($_FILES); とかで確認するとわかると思います

関連するQ&A

  • 配列の値について

    度々の質問で恐縮です。長時間かけて試行錯誤するものの一向に解決せず、お知恵をお借りできればと思い投稿させて頂きました。 ---------------- for ($i = 0; $i <= 2; $i++) { // 3回ループです。 if (is_uploaded_file(@$_FILES["img"]["tmp_name"][$i])) { $pre = "s_"; $imgname[$i] = basename($_FILES['img']['name'][$i]); $imgfile[$i] = $imgdir . $imgname[$i];   << 中略(色々な処理) >> if (preg_match('/\.jpg$/', $imgname[$i]) > 0) { ImageJpeg($img_out[$i], $imgdir.$pre.$imgname[$i] ); $img_thumb = array($i => basename($imgdir.$pre.$imgname[$i]));} 【A】} 【B】} 【C】 ----------------- ■上記『$img_thumb』には配列の値を格納していますが、【A】、【B】の位置で『print_r』を実施したところ、Array ( [0] => ××.jpg ) Array ( [1] => ○○.jpg )Array ( [2] => △△.jpg ) のように配列データが格納されていますが、【C】の位置では、Array ( [2] => △△.jpg ) だけしか表示されません。 これを【C】の位置でも全て表示できるようにするにはどうすればよいか、何かアドバイスをぜひともよろしくお願いいたします。 分かりにくくて申し訳ありません。

    • ベストアンサー
    • PHP
  • 画像アップロード時の複数パターンのリサイズ

    皆さんのお知恵をお貸し下さい。 現在PHPでアップロードした画像を処理していますが、 これを複数パターンのサイズ変更が出来なくて悩んでいます。 1つのファイルで 【width 280px height 430px】 【width 240px height 320px】 【width 170px height 200】 【width 60px height 60px 】 お手数ですがご教授して頂けると幸いです。 ※汚いコードで申し訳ございません。 PHP:5.2.17  サーバー:さくらインターネット up.php ------------ <?php if($_POST['id'] === ""){ echo 'ID Error'; exit(); } if($_POST['name'] === ""){ echo 'Name Error'; exit(); } if($id = $_POST['id']){ preg_match("/^[0-9]+$/",$id) or die('ID Error'); } //写真アップロード処理    for ($i = 0; $i < 4; $i++) { if ( $_FILES["upfile"]["size"][$i] === 0 ) { $img_filename[$i] = "no_image.jpg"; } else { $file_nm = $_FILES['upfile']['name'][$i]; $filename = $_FILES['upfile']['name'][$i]; $extension = pathinfo($file_nm, PATHINFO_EXTENSION); $tmpFilename = $_FILES['upfile']['tmp_name'][$i]; $imgDir = 'img'; $thumbnailDir = 'thumbnail'; list($width,$height)=getimagesize($_FILES['upfile']['tmp_name'][$i]); //ファイル名 $img_filename[$i] = $_POST['cast_id']."_$i". "." . $extension; # ファイルを移動 $destFilename = $imgDir . "/" . $img_filename[$i]; move_uploaded_file($tmpFilename, $destFilename) or die("Failed to upload $filename"); #画像比率 $new_width = 100; $rate = $new_width / $width; $new_height = $rate * $height; # 次にファイルをリサイズしてサムネイル用のディレクトリに保存する $thumbnailFilename = $thumbnailDir . "/" . $img_filename[$i]; exec("convert -resize {$new_width}x{$new_height}! $destFilename $thumbnailFilename", $result, $status); ($status == 0) or die ("Failed to create thumbnail image"); } $photo[$i] = $img_filename[$i]; } ?> よろしくお願い致します。

    • 締切済み
    • PHP
  • upload.php内のページ転送について

    header Locationの転送について教えてください。 PHPファイル内で画像プレビューを表示させ ページ転送を行いたいです。 しかし、プレビューが表示される部分に 転送先の<header>(html5)の内容が表示されてしまいます。 どこが悪くてどう直せば良いのでしょうか? どなたか教えてください。 <?php header("Location: http://www.********.com/"); ?> <?php //前にアップロードされた写真のファイル名 $postPhotoName = $_POST["postPhotoName"]; $result = false; if($_FILES['img']['name'] == "") { die("ファイルがないぜよ。"); }else{ //アップロードされたファイルの情報を取得 $fileName = basename(date("U")."-".$_FILES['img']['name']); $fileType = $_FILES['img']['type']; $fileTmpName = $_FILES['img']['tmp_name']; if(!preg_match("/jpeg/",$fileType)){ unlink($fileTmpName); die( "jpegじゃないぜよ。"); }else{ //ファイルの保存 if (!move_uploaded_file($fileTmpName, 'thumbimg/' . $fileName)) { die('保存にしっぱいしたぜよ。'); } else { //サムネイル作成 include('class.image.php'); list($width, $height, $type, $attr) = getimagesize('thumbimg/'.$fileName); $thumb = new Image('thumbimg/'.$fileName); $thumb->name('thumb-'.basename($fileName,".jpg")); if($width>$height){ if($width > 380) $thumb->width(380); }else{ if($height > 400) $thumb->height(400); } $thumb->save(); $result = true; } } } if($result == true){ ?> <img src="<?php echo 'thumbimg/thumb-'.$fileName;?>"> <input type="hidden" value="<?php echo $fileName?>" name="postPhotoName" id="postPhotoName"> <?php }

    • 締切済み
    • PHP
  • MySQLに画像パスを入れたい

    MySQLに画像パスを入れたいのですが、どの値をどの様に入れるか 判らないので教えてください。 phpMyadminとphpPHP 5.2.17で、テーブル名/schedule カラム名 id/name/in_time/main/img(ここに画像パスを入れたい)です。 画像はデータベースに直接入れるのではなく、GDでサムネイルをつくりそのパスを記入したいのです。 やっと、画像をimgとthumbnailに入れることが出来たのですが、こんどはこの値を カラムimgに記載したいのですがどの様にするか詰まっています。 uptest.php ------------------- <?php isset($_FILES['upfile']) or die("no uploaded file \n"); $filename = $_FILES['upfile']['name']; $tmpFilename = $_FILES['upfile']['tmp_name']; $imgDir = 'img'; $thumbnailDir = 'thumbnail'; $destFilename = $imgDir . "/" . getFileId($filename); move_uploaded_file($tmpFilename, $destFilename) or die("Failed to upload $filename"); $thumbnailFilename = $thumbnailDir . "/" . getThumbnailFileId($filename); $width = 100; $height = 100; exec("convert -resize {$width}x{$height}! $destFilename $thumbnailFilename", $result, $status); ($status == 0) or die ("Failed to create thumbnail image"); # 保存するサムネイルファイル名をココで変更する function getFileId($name) { return $name; } function getThumbnailFileId($name) { return $name; } ?> upform.html ----------------------- <form action="uptest.php" method="post" enctype="multipart/form-data"> <div>送信する画像<input type="file" name="upfile" /></div> <div><input type="submit" value="送信" /></div> </form> 現在これで実験しています。 $sql ="INSERT INTO `schedule` SET //どの値をどの様に… 本当は、画像名のファイル名もdata値にして、同じ写真でも重ねがきしないようにしたいのですが…。 お手数ですが教えていただけないでしょうか。

    • ベストアンサー
    • PHP
  • fopenの使い方?(画像の保存)

    お世話になります。 exif_thumbnailで取得したサムネイル画像をjpgファイルとして元画像ファイルとは別名で保存したいと考えています。 テストで以下のようなコードを作成しましたが、うまく保存できません。fopenの基本的な使い方が間違っているのではないかと思っていますが、どこがおかしいのかわからずにおります。 <?php $img = exif_thumbnail("./test.jpg", $width, $height, $type); $handle = fopen ("./thumb.jpg", 'a'); fwrite($handle, $img); ?> ちなみにPHPのバージョンは5.0.3です。 echo($img);でサムネイル画像が取得できていることは確認できております。 要はtest.jpg → $img → thumb.jpgとできればいいのですが。。 どうしたらうまく保存できますでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHPで画像をアップロード&保存したいのですが..

    初心者です. ブラウザから画像をアップロードし保存できるようにしたく, サンプルを基に以下のようなソースを書いてみたのですが, 画像の保存ができません. もし直さなければいけないところがわかる人がいらっしゃいましたら ぜひ教えてください. よろしくお願いいたします. <?php $img_name = $_FILES["img_path"]["name"]; $img_size = $_FILES["img_path"]["size"]; $img_type = $_FILES["img_path"]["type"]; $img_tmp = $_FILES["img_path"]["tmp_name"]; if($_REQUEST["up"] != ""){ if($img_tmp != "" and $img_size <= 30000){ $img_message = "名前は: $img_name <br>サイズは: $img_size <br>MIMEタイプは: $img_type <br>一時的に保存されているパスは: $img_tmp <br>"; }else{ $size_error = "サイズが大きすぎます。ファイルサイズは30キロバイト以下です。"; } } $FilePath = "./img/".src.".".GetExt($img_name); move_uploaded_file($img_temp,$FilePath); //GetExt function GetExt($FilePath){ $f = strrev($FilePath); $ext = substr($f, 0, strpos($f,".")); return strrev($ext); } ?>

    • 締切済み
    • PHP
  • 画像アップ

    php初心者です 簡単な画像アップロードを付けたいと思っています それでアップだけはなんとかできたのですが、もう少し機能を付けたいです 付けたい機能は 1.拡張子を調べて限定したい。gif、jpg、pngの三つを許可したい 2.画像の横と縦の幅が指定した幅より大きければ、指定した幅まで縦横比維持で縮小 100*100 3.もう一つのディレクトリに、小さいサムネイルを作りたい。大きさは32*32です 4.拡張子はそのままにして画像の名前をリネームしたいです よろしくお願いします(_ _ <?php $img_name = $_FILES["upfile"]["name"]; $img_size = $_FILES["upfile"]["size"]; $img_type = $_FILES["upfile"]["type"]; if($_REQUEST["up"] != ""){ if($img_tmp != "" and $img_size <= 50000){ $img_message = "名前は: $img_name <br>サイズは: $img_size <br>MIMEタイプは: $img_type"; if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0604); print $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { print "ファイルをアップロードできません。"; } } else { print "ファイルが選択されていません。"; } }else{ $size_error = "サイズが大きすぎます"; } } ?> <html> <head> <title>画像アップロード</title> </head> <body> <form name="form" action="" method="POST" ENCTYPE="MULTIPART/FORM-DATA"> <input name="upfile" type="file" size="40"> <input name="up" type="submit" value="アップロード"><hr> </form> <?php print($size_error); ?><?php print($img_message); ?> </body> </html>

    • ベストアンサー
    • PHP
  • $_FIILESで受け取った画像を、すぐに表示するには?

    お忙しい中お読み頂きありがとうございます。 下記の様に、$_FILESで受け取った画像データを、 すぐに<IMG>タグで表示できないのでしょうか? 同じページで反映したいのですが、上手くいきません。 どんなアドバイスでも構いませんので、ご教授お願い致します。 $name = $_FILES['userfile']['name']; $tmp_name = $_FILES['userfile']['tmp_name']; list($width, $height) = @getimagesize($tmp_name); <IMG src="$name" width="$width" heigth="$height">

    • ベストアンサー
    • PHP
  • phpで困ってます

    下記のphpで、写真をサーバーにアップロードして、2種類にリサイズして保存し、ファイル名をテキストで保存しようとしてるのですが、ファイル名をテキストで保存する部分file_put_contents($name_file,$name_log); にエラーがでます。写真はリサイズされ保存されています。何度か見直しているのですが、原因が分かりません。エラーの原因を教えていただきたいと思い、投稿しました。よろしくお願いします。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>画像ファイルアップロード</title> </head> <body> <?php // 名前保存のテキストファイル $name_file = "name.txt"; // 名前保存のテキストファイル読み込み用の配列 $name_log = array(); // 名前保存のテキストファイルを読み込み用の配列に読み込む if (file_exists($name_file)) { $name_log = file( $name_file ); } // 保存画像の保存先のディレクトリ $dir_l = 'uploads_l/'; // サムネイル画像の保存先のディレクトリ $dir_s = 'uploads_s/'; for ( $i=0; $i<count($_FILES['filename']['tmp_name']); $i++ ) { // ファイル名の取り出し $file_name = $_FILES['filename']['name'][$i]; // ファイル(MIME)タイプの取り出し $file_type = $_FILES['filename']['type'][$i]; // 一時ファイル名の取り出し $temp_name = $_FILES['filename']['tmp_name'][$i]; // 重複しないように日付をヘッダにする $head = date("YmdHis"); // 保存先のファイル名 $upload_name_l = $dir_l . $head ."-". $file_name; // サムネイル画像の保存先のファイル名 $upload_name_s = $dir_s . $head ."-". $file_name; // JPEG形式のファイルをアップロードする if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg')) { // アップロード(移動) $result = move_uploaded_file($temp_name, $upload_name_l); if ($result) { // アップロードの成功 // アップロードされた画像情報を取り出す $image_size = getimagesize($upload_name_l); // アップロードされた画像の幅と高さを取り出す $width = $image_size[0]; $height = $image_size[1]; // 保存画像の幅と高さを決める $width_l = 480; $height_l = round($width_l*$height/$width); // サムネイル画像の幅と高さを決める $width_s = 60; $height_s = round($width_s*$height/$width); // アップロードされた画像を取り出す $image = imagecreatefromjpeg($upload_name_l); // 保存画像の大きさの画像を新規作成 $image_l = imagecreatetruecolor($width_l,$height_l); // アップロードされた画像から保存画像を作成 $result_l = imagecopyresampled( $image_l, $image, 0,0, 0,0, $width_l,$height_l, $width,$height); if ($result_l) { // 保存画像作成成功 // 保存画像の保存 if (imagejpeg($image_l,$upload_name_l)) { echo ' ->保存画像保存';                                      $add_name = $upload_name_l;                array_push($name_log, $add_name); } else { echo ' ->保存画像保存失敗'; } } else { // 保存画像作成失敗 echo ' ->保存画像作成失敗'; } // サムネイルの大きさの画像を新規作成 $image_s = imagecreatetruecolor($width_s,$height_s); // アップロードされた画像からサムネイル画像を作成 $result_s = imagecopyresampled( $image_s, $image, 0,0, 0,0, $width_s,$height_s, $width,$height); if ($result_s) { // サムネイル画像作成成功 // サムネイル画像の保存 if (imagejpeg($image_s,$upload_name_s)) { echo ' ->サムネイル画像保存'; } else { echo ' ->サムネイル画像保存失敗'; } } else { // サムネイル画像作成失敗 echo ' ->サムネイル画像作成失敗'; } // 画像の破棄 imagedestroy($image); imagedestroy($image_l); imagedestroy($image_s); } else { // アップロードの失敗 echo '■アップロード失敗'; } } else { // JPEG形式以外のファイルはアップロードしない echo '■JPEG形式の画像をアップロードしてください。'; } }     //ファイルへ保存 file_put_contents($name_file,$name_log); ?> </body> </html>

    • ベストアンサー
    • PHP
  • 画像をアップロードする度に古い画像を削除

    お世話になっております。 とあるサイトのソースを参考に画像のリアルタイムプレビューを作成しました。 画像を上げプレビューを表示することはできたのですが画像を上げる度に次々と表示される画像が増えてしまいます。 画像を新しく上げる場合は以前に入っていた画像を削除する、 もしくは最後に上げた画像のみをプレビュー表示する方法はありますでしょうか? unlinkを使用して削除を考えたのですが、 削除とアップロードの両立ができませんでした。 以下が使用しているソースになります。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>jQuery.uploadのサンプル</title> <script type="text/javascript" src="./js/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="./js/jquery.upload-1.0.2.min.js"></script> <script type="text/javascript"> $(function() { $('#file_id').change(function() { $(this).upload('upload.php', function(res) { $(res).insertAfter(this); }, 'html'); }); }); </script> </head> <body> <style> .thumb { height: 200px; border: 1px solid #000; margin: 10px 5px 0 0; } </style> <input type="file" name="upload_file" id="file_id"> </body> </html> <?php #アップロードされたファイルが存在するか if ( !is_uploaded_file( $_FILES['upload_file']['tmp_name'] ) ) { echo '<div>ファイルが選択されていません。</div>'; exit(); } #$_FILES["upload_file"]["tmp_name"]がテンポラリにあるファイル名 #$_FILES["upload_file"]["name"]がアップロード元のファイル名 #tmpからファイルをコピー move_uploaded_file($_FILES["upload_file"]["tmp_name"], "files/" . $_FILES["upload_file"]["name"]); echo '<div>'.$_FILES["upload_file"]["name"].'をアップロードしました</div>'; echo '<img class="thumb" src="files/' . $_FILES["upload_file"]["name"] . '">' ?> どなたかご回答いただけましたら幸いでございます。 どうぞ宜しくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう