2016-10-03 3 views
-2

У меня есть простой скрипт, который может загружать файлы на моем сервере и вставлять данные в базу данных.Проблемы с Uploading Script

С кодом ниже я получаю две ошибки ..

  1. «Примечание: Undefined переменные: секстет в» .. я пытался решить проблему с, если пустым заявлением, но без успеха ..

  2. числа сценариев импорта (1,2,3 ...) в Mysql, если загрузка подал пустой .... я пытался решить проблему с кодом ниже, но без успеха ..

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

Любой совет?

Спасибо ..

Мой код:

<?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

Хорошо, первый я бы не полагаться на тип, чтобы установить расширение, я бы вытащить его из файлов реального имени (т.е. не имя tmp). У вас нет другого условия для '$ sExt', который заставляет все остальное бомбить. Вы должны делать еще $ errors [] = bla bla. Там – ArtisticPhoenix

ответ

1

вместо этого

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_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!"; 
    } 

Проверка расширения вы настраиваете избыточна , а nd это позволяет избежать ошибки, когда ваш varible $sExt не установлен, предоставляя значение по умолчанию (с помощью else). Это должно дать вам желаемое поведение.

Я также хотел бы переместить эти строки

$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 (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/"; 

Таким образом, вы не делаете вставку, когда у вас есть что-то ошибка ...

Не уверен, что цель этого

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 может быть очень плохим, я бы предложил сделать это другим способом, например, используя массив, однако это, вероятно, может быть выполнено в первом цикле. Например, значение или false может быть в остальной части проверки для empty($errors), так что если есть ошибка, то она помещается как ложная.

$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 
    } 
    } 

Вы также должны быть осторожны в SQL инъекции, хотя это выглядит, как вы устанавливаете переменные, его по-прежнему разумно использовать подготовленный запрос только в случае изменения последнего, что может открыть вам до SQL инъекций атаки.

+0

Спасибо .. Я просто скопирую и вставляю код, но я все равно получаю ту же ошибку. Неопределенная переменная: sExt в C: \ labs \ upload \ multi1.php в строке 31 Array ([0] => Только типы изображений (.gif, .jpg, .png)!) – user2900709

+1

Как только вы помещаете вставку внутри '' if (empty ($ errors)), вы не должны получать эту проблему. Эта переменная все еще упоминается во вставке и все еще называется, и поскольку мы действительно не хотим вставлять, если файл не тот, что мы хотим, правильно? – ArtisticPhoenix

+0

Быстрое исправление: добавьте 'empty ($ errors) &&' to '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