0

フォームに入力ファイル タイプ フィールドがあります。

<input type="file" name="file" size="80" value="">

送信され、このフィールドが空の場合、php スクリプトのファイル アップロード部分をスキップする必要があります。これは起こっていないようです。私が得ているのは、間違ったファイルタイプのメッセージが表示されることです。フォームのフィールドに何も入力されていないのに、if/else ステートメントが実行されないのはなぜですか? 私は何を間違っていますか?

<?php
// connect to datebase
require "master.db.php";


// this if(empty statement is not working?
// should be checking to see if the form field 'file' is populated if so check file
// type if not skip and update sql database with information in form field 'test'
if(!empty($_FILES))
{
    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/pjpeg"))
    && ($_FILES["file"]["size"] < 2097152))
    {
        // code here works - function is to upload the file - not part of my current problem
    }

    // currently this else statement is displayed regardless of 'file' input
    // wrong function for its intended purpose
    else
    {
        // wrong file type
        echo "Invalid file <br />";
        echo "Tryed to upload: " . $_FILES["file"]["name"] . "<br />";
        echo "Type: " . $_FILES["file"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb Max 2Mb <br />";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
        die;
    }
}
else 
{
// update other data in mysql database
$sql="UPDATE `characters` SET test='$test' WHERE ID='$id'";
$result=mysql_query($sql);

    // if successfully updated mysql.
    if($result){
        echo "<b>Update successful</b> <br />";
        echo "<a href='test.html'>View result</a>";
        touch('master.html');
        clearstatcache();
    }
    else
    {
        echo "Whoops: " . mysql_error(); ;
    }
    mysql_close();
}
?>
4

2 に答える 2

2

値が空であっても、ブラウザーは入力値を送信します。結果として、PHP は $_FILES 配列に次のような値を設定します。

Array
(
    [file] => Array
        (
            [name] => 
            [type] => 
            [tmp_name] => 
            [error] => 4
            [size] => 0
        )

)

したがって、isset/empty でチェックする代わりに、PHP のネイティブ is_uploaded_file メソッドを使用する必要があると思います。オプションのファイル入力が提供されたかどうかを確認する方法の詳細については、このSO 投稿を参照してください。

私は私の答えを明確にしようとします。私が与えたリファレンスは、file_exists と is_uploaded_file を使用することを提案しています。PHP マニュアルによると、is_uploaded_file を使用するだけで十分です。実際、is_uploaded_file がとにかくファイルを検索すると想像できます (そのため、内部的には既に file_exists のような処理を行っています)。

name-key の代わりに tmp_name-key を使用する必要があることに注意してください。「name」キーはクライアントの PC 上のファイルの名前を指定しますが、tmp_name はサーバー上の名前を指定します。サーバーがファイルの名前を変更するため、ユーザーの PC 上の名前とは異なる場合があります。

于 2012-06-09T14:49:57.533 に答える
0

必ず追加してください

enctype="multipart/form-data"

あなたのフォームタグの属性。@Martijnのガイドラインに従って、以下のコードを確認してください。動作するはずです。必ずカスタマイズしてください。

 <?php
 // connect to datebase
 require "master.db.php";


 // this if(empty statement is not working?
 // should be checking to see if the form field 'file' is populated if so check file
 // type if not skip and update sql database with information in form field 'test'

 if(!empty($_FILES)) // MEANS form is valid ( have valid file and other data) 
 {
$sql="UPDATE `characters` SET test='$test' WHERE ID='$id'";
$result=mysql_query($sql);

  if (((($_FILES["file"]["type"] == "image/gif")
  || ($_FILES["file"]["type"] == "image/jpeg")
  || ($_FILES["file"]["type"] == "image/pjpeg"))
  && ($_FILES["file"]["size"] < 2097152)) && $result ))
{
    // code you need to execute
    echo "<b>Update successful</b> <br />";
    echo "<a href='test.html'>View result</a>";
    touch('master.html');
    clearstatcache();
   }

   else
   {
    // wrong file type
    echo "Invalid file <br />";
    echo "Tryed to upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb Max 2Mb <br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
    die;
    }
    }
   else 
   { 
echo "data is not valid";
    }
  ?>
于 2012-06-09T14:55:36.570 に答える