0

こんにちは、データベースに複数の画像を挿入するためのスクリプトがあり、更新を行うたびに既存のファイルを削除して新しいファイルを挿入したい場合に、入力がファイルである場合にのみ削除する方法がわかりません。その部分をスキップするだけではありません。これが私のコードです:

$size=$_FILES['files']['size'];
if($size > 1) { 
   $query = "Delete from Imagini_Hotel where ID_Hotel='$id_hotel'"; 
    $result = mysql_query($query)
        or die("query failed: " . mysql_error()); 
} 


$errors= array();
foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
    $file_name = $key.$_FILES['files']['name'][$key];
    $file_size =$_FILES['files']['size'][$key];
    $file_tmp =$_FILES['files']['tmp_name'][$key];
    $file_type=$_FILES['files']['type'][$key];  

    if($file_size > 9097152){
        $errors[]='File size must be less than 9 MB';
    }
    if($file_size <= 0)
    {
    }
    else
    {
    $query="Insert into Imagini_Hotel (`ID_Hotel`,`Nume_Poza`,`Prioritate`) VALUES('$id_hotel','$file_name','$key'); ";
    $desired_dir="../../../images/hotel/$id_hotel";
    if(empty($errors)==true){
        if(is_dir($desired_dir)==false){
            mkdir("$desired_dir", 0777);        // Create directory if it does not exist
        }
        if(is_dir("$desired_dir/".$file_name)==false){
            move_uploaded_file($file_tmp,"$desired_dir/".$file_name);
        }else{                                  // rename the file if another one exist
            $new_dir="$desired_dir/".$file_name.time();
             rename($file_tmp,$new_dir) ;               
        }
     mysql_query($query);           
    }else{
            print_r($errors);
    }
}}
if(empty($error)){
    echo "Success";
}
4

2 に答える 2

2

チェックできるパラメーターがあり['error']ます(とにかくチェックする必要があります)。現時点では、アップロードが成功したと想定しているだけです。

if ($_FILES['tmp_name']['error'][$key] === UPLOAD_ERR_OK) {
   ... file was uploaded ...
} else {
   die("Upload failed with error code " . $_FILES['tmp_name']['error'][$key]);
}

エラー コードは次の場所で定義されています: http://php.net/manual/en/features.file-upload.errors.php コード 0 (成功) と 4 (ファイルなし) に関心があります。

同様に、アップロード処理コードがサーバーを完全なリモート侵害にさらすことに注意してください。操作でユーザー提供のファイル名を直接使用しているためmove..()、悪意のあるユーザーがシステム上の任意のファイルに落書きできるようになっています。ユーザーが指定したファイル名にパス情報を含めることはできません。たとえば['name'] = '../../../../../../../etc/passwd、スクリプトがフィルタリング/チェックなしで喜んでやみくもに使用するパス情報です。

于 2013-02-05T20:03:09.787 に答える
0

たぶん、filesize($ file_tmp)が0より大きいかどうかを確認してください-ファイルにある程度のサイズがあることがわかります。

于 2013-02-05T20:40:26.137 に答える