2016-10-03 5 views
-2

私はサーバにファイルをアップロードし、その詳細をデータベースに挿入することができる簡単なスクリプトを用意しています。コード付きスクリプトのアップロードに関する問題

私は2つのエラーを取得しています下の..

  1. 「注意:未定義の変数:中SEXT」.. は、私があれば、空の文で問題を解決しようとしましたが、成功事例のなし..

  2. スクリプトのインポート番号(1,2,3 ...)のMySQLへの提出アップロードが空の場合は.... 私も成功せず、以下のコードで問題を解決しようとした。..

    "if($ _ FILES ['files'] ['name']!=" ")"。 ..

アドバイスはありますか?

は...

私のコードをありがとう:あなたが設定されている拡張子を確認する

if($file_type == "image/gif"){ 
     $sExt = ".gif"; 
    } elseif($file_type == "image/jpeg" || $file_type == "image/pjpeg"){ 
     $sExt = ".jpg"; 
    } elseif($file_type == "image/png" || $file_type == "image/x-png"){ 
     $sExt = ".png"; 
    }else{ 
     $errors[] = "Image types alowed are (.gif, .jpg, .png) only!"; 
    } 

を行う必要があり、代わりにこの

if($file_type == "image/gif"){ 
     $sExt = ".gif"; 
    } elseif($file_type == "image/jpeg" || $file_type == "image/pjpeg"){ 
     $sExt = ".jpg"; 
    } elseif($file_type == "image/png" || $file_type == "image/x-png"){ 
     $sExt = ".png"; 
    } 
    if (!in_array($sExt, array('.gif','.jpg','.png'))) { 
     $errors[] = "Image types alowed are (.gif, .jpg, .png) only!"; 
    } 

<?php 

    include_once('db.php'); 

if (isset($_FILES['files'])) { 
    $uploadedFiles = array(); 
    foreach ($_FILES['files']['tmp_name'] as $key => $tmp_name) { 
     $errors = array(); 
     $file_name = md5(uniqid("") . time()); 
     $file_size = $_FILES['files']['size'][$key]; 
     $file_tmp = $_FILES['files']['tmp_name'][$key]; 
     $file_type = $_FILES['files']['type'][$key]; 

     if($file_type == "image/gif"){ 
      $sExt = ".gif"; 
     } elseif($file_type == "image/jpeg" || $file_type == "image/pjpeg"){ 
      $sExt = ".jpg"; 
     } elseif($file_type == "image/png" || $file_type == "image/x-png"){ 
      $sExt = ".png"; 
     } 
     if (!in_array($sExt, array('.gif','.jpg','.png'))) { 
      $errors[] = "Image types alowed are (.gif, .jpg, .png) only!"; 
     } 


     if ($file_size > 2097152000) { 
      $errors[] = 'File size must be less than 2 MB'; 
     } 

     $query = "INSERT into user_pics (`person_id`,`pic_name`,`pic_type`) VALUES('1','$file_name','$sExt')"; 
     $result = mysqli_query($link,$query); 

     $desired_dir = "user_data/"; 
     if (empty($errors)) { 
      if (is_dir($desired_dir) == false) { 
       mkdir("$desired_dir", 0700);  
      } 
      if (move_uploaded_file($file_tmp, "$desired_dir/" . $file_name . $sExt)) { 
       $uploadedFiles[$key] = array($file_name . $sExt, 1); 
      } else { 
       echo "Files Uploaded !" . $_FILES['files']['name'][$key]; 
       $uploadedFiles[$key] = array($_FILES['files']['name'][$key], 0); 
      } 
     } else { 
      print_r($errors); 
     } 
    } 

    foreach ($uploadedFiles as $key => $row) { 
     if (!empty($row[1])) { 
      $codestr = '$file' . ($key+1) . ' = $row[0];'; 
      eval ($codestr); 
     } else { 
      $codestr = '$file' . ($key+1) . ' = NULL;'; 
      eval ($codestr); 
     } 
    } 

} 

?> 


<form action="" method="POST" enctype="multipart/form-data"> 
    <input type="file" name="files[]" accept="image/*"> <br/> 
    <input type="file" name="files[]" accept="image/*"> <br/><br/> 
    <input type="submit"/> 
</form> 
+0

[OK]を、最初に私は拡張子を設定するタイプに依存しないだろう、私はつまりません(ファイル本名から引き出しますtmpの名前)。あなたは '$ sExt'のelse条件を持っていないので、他のすべてが爆弾になります。 $ errors [] = bla bla elseを実行する必要があります。そこに – ArtisticPhoenix

答えて

1

は冗長です、aこれにより、デフォルトの(elseを指定して)可変部分$sExtが設定されていないときにエラーが回避されます。これはあなたに望ましい動作を与えるはずです。

私も...これらの行このコードブロック

if (empty($errors)) { 
     $query = "INSERT into user_pics (`person_id`,`pic_name`,`pic_type`) VALUES('1','$file_name','$sExt')"; 
     $result = mysqli_query($link,$query); 

     $desired_dir = "user_data/"; 

の内側に

$query = "INSERT into user_pics (`person_id`,`pic_name`,`pic_type`) VALUES('1','$file_name','$sExt')"; 
    $result = mysqli_query($link,$query); 

    $desired_dir = "user_data/"; 
    if (empty($errors)) { 

を使用すると、エラーで何かを持っているときに挿入をしない、そのように移動します

わからないこの

foreach ($uploadedFiles as $key => $row) { 
    if (!empty($row[1])) { 
     $codestr = '$file' . ($key+1) . ' = $row[0];'; 
     eval ($codestr); 
    } else { 
     $codestr = '$file' . ($key+1) . ' = NULL;'; 
     eval ($codestr); 
    } 
} 
の目的

しかし、evalは非常に非常に悪いことがありますが、これは配列を使用するなど、別の方法で行うことをお勧めしますが、これはおそらく最初のループで行うことができます。たとえば、nullまたはfalseの値は、empty($errors)のチェックのelse部分にある可能性があります。その場合、エラーがある場合は、そのようにfalseになります。 SQLインジェクションにあなたを開くことができ、それはあなたが変数を設定しているように、念の変化に準備されたクエリを使用して、まだ賢明が、後者作られて見えますが、あなたはまた、SQLインジェクションの注意が必要である

$files = array(); 
    foreach ($uploadedFiles as $key => $row) { 
    if (!empty($row[1])) { 
     $files['$file' . ($key+1)] = $row[0]; 
    } else { 
     $files['$file' . ($key+1)] = false; //id use false instead of null in an array 
    } 
    } 

、攻撃。

+0

ありがとう..私はちょうどあなたのコードをコピーして貼り付けますが、私はまだ同じエラーが発生しています..未定義の変数:行31のC:\ labs \ upload \ multi1.phpのsExt Array([0] => – user2900709

+1

'(if(empty($ errors))')ステートメントの内部に挿入した後は、その問題を起こすべきではありません。その変数はまだインサートで参照されていて、依然として呼び出されています。ファイルが必要なものでない場合は、実際に挿入したくないので、そうでしょうか? – ArtisticPhoenix

+0

クイックフィックス:if(!in_array($ sExt、array( '.gif'、 '.jpg'、 '.png'))){' –

0

と:

           // double slash 
if (move_uploaded_file($file_tmp, "$desired_dir/" . $file_name . $sExt)) { 
    // file was successfuly moved 
    echo "Files Uploaded !" . $_FILES['files']['name'][$key];     
    $uploadedFiles[$key] = array($file_name . $sExt, 1); 
} else {     
    $uploadedFiles[$key] = array($_FILES['files']['name'][$key], 0); 
} 

foreach ($uploadedFiles as $key => $row) { 
    if ($row[1]) { // $row[1] is never empty 
     ${'file' . ($key+1)} = $row[0]; 
    } else { 
     ${'file' . ($key+1)} = NULL; 
    } 
} 

良くは次のようになります。

if (move_uploaded_file($file_tmp, "$desired_dir/" . $file_name . $sExt)) { 
    echo "Files Uploaded !" . $_FILES['files']['name'][$key];     
    $uploadedFiles[] = $file_name . $sExt; 
} 

//instead of variable $file1 etc.. 
foreach($uploadedFiles as $filename){ 

} 
+0

ご協力いただきありがとうございます... – user2900709

関連する問題