• ベストアンサー

PHPで作成した2つのプログラムが不安定だが、原因不明。フォトアルバム編

キチンと動作する場合と、上手く動作しない場合のあるプログラムがあるのですが、原因が全く分かりません。いずれも、「たまに」動作します。環境はWin XAMPP1.7.2を使用しました。こちらはフォトアルバム編です。よろしくお願いします。 <?php //---------------------------------------------------------- //フォトアルバム //--------------------------------------------------------- //変数の初期化 $updir = "files/"; $savefile = "photoalbum.txt"; $log = array(); //ログファイルの読み込み if(file_exists($savefile)){$log=file($savefile);} //ファイルがアップロードされたか判定 if(is_uploaded_file($_FILES['photo']['tmp_name'])){ //アップロードされたファイルのパラメータを取得 $tmp = $_FILES['photo']['tmp_name']; $name = $_FILES['photo']['name']; //保存するファイル名を決める $head = date("YmdHis");//重複しないように日付ヘッダにする $fname = $updir.$head."-".urlencode(basename($name)); //一行メモを保存するためのプログラム $memo = $_POST['memo']; $memo = str_replace("\r","",$memo); $memo = str_replace("\n","",$memo); $memo = str_replace("\t","",$memo); //一時領域から指定フォルダへファイルを移動させる if(move_uploaded_file($tmp, $fname)){ //ログファイルへ日付、ファイル名とメモを保存 $date = date("Y-m-d H:i:s"); $newlog = "{$date}\t{$fname}\t{$memo}\n"; array_unshift($log,$newlog); file_put_contents($savefile,$log);//ファイルへ保存 } } //ログの内容をHTMLに変換する $html = ""; foreach ( $log as $line){ list($date,$fname,$memo) = split("\t",$line); $body = htmlspecialchars($body); $html .= "<hr/><h3>$memo($date)</h3><p><img src='$fname'/></p>"; } //HTMLの表示 ?> <html><body><h1>フォトアルバム</h1> <?php echo $html; ?><hr/> <!---画像の投稿フォーム---> <form enctype= "multipart/form-data" method="POST"> 画像ファイル: <input name="photo" type="file" /><br/> メモ:<input type="text" name="memo" size="30"/><br/> <input type="submit" value="アップロード" /> </form> </body></html>

  • PHP
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • torntorn
  • ベストアンサー率22% (19/84)
回答No.2

#1の人に追加だけどphpでは警告メッセージなど出力するレベルを変更できます。 php.iniでそれらの設定を見直してメッセージ出力の変更をしましょう。 後xamppは1.7.2からphpに5.3系が採用されています。 5.3は5.2系までからかなり変更箇所がありますから注意が必要です。 ですから今まで動いていたPHPが動かなくなる可能性があります。 (php6への足がかり的バージョン?)

maca_to
質問者

お礼

間違えました! 参考書は「1.7.1」でした。小さく記述されてました・・。 焦って誤った情報を投稿してしまいました。すみません。 でもほぼ間違いなく原因これだよなぁ・・初歩的過ぎますねotz

maca_to
質問者

補足

警告メッセージのレベルですか・・初耳でした、調べる必要がありそうですね。 ああ・・もしかしたらその「5.3」というバージョンだからかもしれません。 参考書を確認しましたらver1.7.2!ということは5.2系ということですもんね。2009/11/21発売でしたので、完璧に信用してました。 うーん・・なぜ参考書通りに記述しても動かないものがあるのか。やっと原因がわかった気がします(実はこの質問以外でもプログラムが動かないと質問をしていました) なんとか5.2系を探し出して、動かしてみようと思います。 ご回答ありがとうございました。

その他の回答 (1)

  • takubou05
  • ベストアンサー率52% (11/21)
回答No.1

エラーログは出力されていますか? またはブラウザ上にエラーメッセージが出力されていませんか? 上記を提示したほうが明確な解決方法を 得ることができると思いますが。

maca_to
質問者

お礼

失礼ながら、お礼がまだでした。 ご回答ありがとうございました。

maca_to
質問者

補足

エラーは一切出てないんです・・。↓実行時の画面です。 フォトアルバム --------------------- test (2010-02-16 01:49:24) ×(赤いバツ印です) 画像ファイル:[ ] [参照] メモ:[ ](ここに入力した言葉が日付の隣に表示されます) [アップロード] こんな感じで表示されますね・・ご覧の通りエラーは出ません。 本当は画像を貼ろうとしましたが、失敗してしまいました。すみません

関連するQ&A

  • PHP 画像アップローダー作成について

    PHPの勉強をしている者です。 ローカル環境(XAMPP1.7.3)にて、画像アップローダーを動かそうと試みています。 が、一時ファイル名が取得できず、失敗に終わります。初歩的なミスかもしれません。 -------------------- 【upload.html】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>画像ファイルアップロード</title> </head> <body> <h1>画像ファイルアップロード</h1> <p>アップロードする画像ファイル(JPEG形式)を選択して「アップロード」ボタンを押してください。</p> <form action="upload_image.php" method="POST" enctype="multipart/form-data"> <table> <tr> <th>画像ファイル選択</th> <td><input type="file" name="filename" size="50"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="アップロード"> </td> </tr> </table> </form> </body> </html> -------------------- 【upload_image.php】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>画像ファイルアップロード</title> </head> <body> <h1>アップロードファイル情報</h1> <p> <?php // ファイル名の取り出し $file_name = $_FILES['filename']['name']; // ファイル(MIME)タイプの取り出し $file_type = $_FILES['filename']['type']; // 一時ファイル名の取り出し $temp_name = $_FILES['filename']['temp_name']; // エラーコードの取り出し $upload_error = $_FILES["filename"]["error"]; // 保存先のディレクトリ $dir = 'uploads/'; // 保存先のファイル名 $upload_name = $dir . $file_name; // JPEG形式のファイルをアップロードする if (($file_type == "image/jpeg") || ($file_type == 'image/pjpeg')) { // アップロード(移動) $result = move_uploaded_file($temp_name,$upload_name); if ($result) { // アップロード成功時 echo '■アップロード成功'; } else { // アップロード失敗時 echo '■アップロード失敗'; } } else { // JPEG形式以外のファイルはアップロードしない echo '■JPEG形式の画像をアップロードしてください。'; } ?> </p> <table> <tr> <td colspan="2"><img src="<?php echo $upload_name; ?>" alt=""></td> </tr> <tr> <th>エラーコード</th> <td><?php echo $upload_error; ?></td> </tr> <tr> <th>画像ファイル名</th> <td><?php echo $file_name; ?></td> </tr> <tr> <th>MIMEタイプ</th> <td><?php echo $file_type; ?></td> </tr> <tr> <th>一時ファイル名</th> <td><?php echo $temp_name; ?></td> </tr> </table> </body> </html> -------------------- 【php.iniの一部】 ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. ; http://php.net/file-uploads file_uploads = On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). ; http://php.net/upload-tmp-dir upload_tmp_dir = "C:\xampp\tmp" ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize = 128M -------------------- このように作っております。 結果は エラーコード→0 画像ファイル名→正常取得 MIMEタイプ→正常取得 一時ファイル名→空 どのような原因が考えられるか、教えて頂ければ幸いです。

    • ベストアンサー
    • PHP
  • 違いがわかりませんorz

    <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> <title>アップロードされたか調べる</title> </head> <body> <p><?php if(isset($_FILES['example'])){ $localFilename=$_FILES['example']['name']; $uploadFile=$_FILES['example']['tmp_name']; if(is_uploaded_file($uploadFile)){ if (move_uploaded_file($_FILES["example"]["tmp_name"], "files/" . $_FILES["example"]["name"])) { chmod("files/" . $_FILES["example"]["name"], 0644); echo '<p>アップロードされたファイルです:'.h($localFilename).'</p>'; }else{ echo '<p>アップロードされていないファイルです:'.h($localFilename).'</p>'; } } function h($string){ return htmlspecialchars($string, ENT_QUOTES); } ?></p> <form method="post" action="" enctype="multipart/form-data"> <p>ファイルをしていしてください</p> <input type="file" name="example" value"" /> <input type="submit" value="送信する" /> </form> </body> </html> ----------------------------------------------------------------------------- ------------------------------------------------------------------------------ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> <title>sample</title> </head> <body> <p><?php 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"], 0644); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?></p> <form method="post" action="" enctype="multipart/form-data"> <p>ファイルをしていしてください</p> <input type="file" name="upfile" value"" /> <input type="submit" value="送信する" /> </form> </body> </html> -------------------------------------------------------------------------- ------------------------------------------------------------------------------- 上と下のプログラムの違いがわかりません。アップロードのプログラムなんですが下の方が成功し、上がエラーになります。よければ、解説つけて上のプログラムを正してください(><) お願いします。

    • ベストアンサー
    • PHP
  • PHP ファイルupロードのセキュリティ

    ただいま ファイルUPロードするための簡単なPHPプログラムをせいさくしています 。 セキュリティの部分とか足らないところがるとは思うのですが、 下のプログラjムをどうやって改造すればいいのでしょうか? たとえば 容量を制限する。 ファイル種類を限定する等  おしえて頂きたいと思っています。 よろしくお願いたします。 <body> <p><?php 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"], 0644); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?></p> </body> </html>

    • 締切済み
    • PHP
  • preg_replace, ereg_replace

    $bodyにはテキストファイルなどから読み込んだ、$dateと言う文字(変数ではない)と、改行を含む文字列。 それで、「$date」を、phpスクリプト上の$dateの値に置換したく、 $tmp = preg_replace("/\$date/s", $date, $body); または、 $tmp = ereg_replace("\$date",$date,$body); としたのですが、どうも置換されません。何がいけないのでしょうか?

    • ベストアンサー
    • PHP
  • system関数で呼びだした、cshファイル周辺でのエラー

    2~3日前にも質問させていただいた、Perl初心者leeeeeeeeです。先日に引き続き、前の業者が作ったPerlプログラムを、新しいサーバ上で動くようにする作業を行っているのですが、まだエラーが出ており困っています。以下が問題の部分です。 ○○.cgi # 削除シェルの実行 $rtn = system"$rm_csh $tmp_file $limit_date $touch_file"; if($rtn != 0) {  # エラーログ出力  cm_errlog(__FILE__, "LOG013", ($rm_csh." ".$limit_date));  # エラーHTML出力  省略  # 異常終了  exit 1; } ここの、$rtnが、0になっていないようで、エラーページが表示されてしまいます。 ちなみに、$rm_csh は、tmpdel.cshというファイルで、以下が中身です。 ■ tmpdel.csh #!/usr/bin/csh set touch_fname = $3 set tmp_file = $1 touch -t $2 $touch_fname >& /dev/null set STS = $status if( $STS != 0) then exit 1 endif foreach file_name (`ls $tmp_file*`)  test $file_name -ot $touch_fname && rm $file_name >& /dev/null end exit 0 ■ tmpdel.csh の #!/usr/bin/csh という部分が気になって、#!/usr/bin/perlとか、 #!/bin/cshにもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • 画像をアップロードする度に古い画像を削除

    お世話になっております。 とあるサイトのソースを参考に画像のリアルタイムプレビューを作成しました。 画像を上げプレビューを表示することはできたのですが画像を上げる度に次々と表示される画像が増えてしまいます。 画像を新しく上げる場合は以前に入っていた画像を削除する、 もしくは最後に上げた画像のみをプレビュー表示する方法はありますでしょうか? 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
  • ファイルがdataフォルダにうまくアップできなくて困っています。

    htmlフォームにより、ファイルをアップロードして、 それをphpが受け取ったファイルのファイル名を、 拡張子のみそのまま利用してファイル名は 日付けと時間をdate関数を利用して つけるようにしました。 GetExt関数は、アップされた画像の拡張子のみを取得する自作関数です。 以下のスクリプトを実行しても同一階層にあるdataフォルダに写真がアップされなくて悩んでいます。 アドバイスお願い致します。 <html> <body> <table border=1> <form method="post" action="<?php echo($_SERVER["PHP_SELF"])?>" ENCTYPE="MALTIPART/FORM-DATA"> <tr><TD><INPUT TYPE="FILE" NAME="FILE" SIZE=40></TD></tr> <tr><td><input type=submit value=送信></td></tr> </table> <?php if($_FILES["FILE"]["tmp_name"] != ""){ $FilePath = "./data/" . date("YmdHis") . "." . GetExt($_FILES["FILE"]["name"]); move_uploaded_file($_FILES["FILE"]["tmp_name"],$FilePath); }else{ echo("失敗しました!"); } //GetExt()関数の定義 //ファイル名から拡張子だけを取得する関数 function GetExt($FilePath){ $f = strrev($FilePath); $ext = substr($f,0,strpos($f,".")); return strrev($ext); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • 画像アップロードについて

    いつもお世話になっております。 画像アップロード機能を作成し、問題なくアップロードを行うことができたのですが、 ある一定サイズ(約2MB)を超えるとアップロードが行われない現象が発生しました。 アップロードした画像は既定のサイズにリサイズして保存する仕様となっているのですが アップロード自体が行われないため、困っています。 以下【該当処理抜粋】------------------------------------------------------------- // ファイル名を設定する $fname = "hoge.jpg"; // 画像の幅・高さを設定する【規定値】 $w_size = "150"; $h_size = "100"; $tmp_name = $_FILES[$fname]['tmp_name']; // 画像ファイル名 $filename = "./hoge/".$fname; if (is_uploaded_file($tmp_name)){ $type = $_FILES[$fname]['type']; if ($type == "image/jpeg" || $type == "image/pjpeg") { // 画像ファイル存在チェック if(file_exists($filename)){ // ファイルが存在する場合は削除する unlink($filename); } // 画像ファイル名でアップロードをおこなう move_uploaded_file($tmp_name, $filename); // 画像ファイルのサイズを取得する list($sw, $sh) = getimagesize($filename); $src = imagecreatefromjpeg($filename); $dst = imagecreatetruecolor($w_size, $h_size); // 画像ファイルを既定サイズにリサイズする imagecopyresized($dst, $src, 0, 0, 0, 0, $w_size, $h_size, $sw, $sh); imagejpeg($dst, $filename); echo $fname[1]."ファイルのアップロードが完了しました。<br>"; }else{ echo $fname ."ファイルの画像形式が正しくありません。<br>"; } }else{ echo $fname ."ファイルはアップロードされませんでした。<br>"; } ---------------------------------------------------------------------------------------------------- 現象について調べたところ、PHPにはアップロードサイズが設定されている(デフォルト2MB)ため サイズの大きいファイルはアップロードできないようです。 サーバーはロリポップでレンタルしているためphp.iniの設定を変更ができません。 画像自体を事前にリサイズしてアップロードを行えば問題ないのですが、 今後、一般の方にも公開を予定してまして、リサイズ方法が分からない人(そのようなソフトがない人)にも 操作できるようにデジカメで撮った写真をそのままアップロードできる形式にしたいと考えています。 何かいい方法があればご教授願います。 【環境】 PG:php4.3.11 WEB:Apache

    • 締切済み
    • PHP
  • 重複ファイル名ある場合ファイル名の末尾に1をつける。

    ファイルアップロードのcgiで、上記題名の通り重複するファイル名を上書きするのではなく、重複するファイル名の末尾に番号をつけ上書きされないようにしたいのですが、どのように変更すれば良いのでしょうか教えてください。 # ファイル受信時の処理 sub file_receive { $form_log .= "ファイルアップロードを処理しています。<br>"; if ($upload) { # 同名のファイルがある場合、削除権限があれば上書き if (-e $formdata{'savefile'}) { $formdata{'savefile'} = ($formdata{'savefile'}); $form_log .= "同じファイルが存在します"; if ($delete) { if (unlink $formdata{'savefile'}) { $formdata{'file'} = ($formdata{'file'}); $form_log .= " 既存の".$formdata{'file'}."を削除しました。<br>"; } else { $formdata{'file'} = ($formdata{'file'}); $form_log .= " 既存の".$formdata{'file'}."を削除できませんでした。<br>"; } } else { $form_log .= " 上書きには、削除権限が必要です。<br>"; } } # 保存(リネーム)処理 if (not -e $formdata{'savefile'}) { if (rename $formdata{'tempfile'}, $formdata{'savefile'}) { chmod $permission, $formdata{'savefile'} if ($permission); $formdata{'file'} = ($formdata{'file'}); $form_log .=" ".$formdata{'file'}."を保存しました。<br>"; } } }

    • ベストアンサー
    • Perl
  • PHPとjavascriptの併用

    はじめまして。 javascriptと併用した質問になってしまうのですが、 <?php move_uploaded_file($_FILES["upload_file"]["tmp_name"], "files/" . $_FILES["upload_file"]["name"]); echo 'document.getElementById("mov").value="ほげ" '; ?> 以上のソース内で、「ほげ」の変わりにファイル名を入力したいのですが、アポストロフィなどの使い方が間違っているのかうまく入力できません。 $_FILES["upload_file"]["name"]がファイル名なのですが、どの用に記述すればよいでしょうか。

    • ベストアンサー
    • PHP