2016-10-03 69 views
-2

我有一个简单的脚本,可以在我的服务器上传文件并将详细信息插入到数据库中。上传脚本的问题

有了下面的代码我得到两个错误..

  1. “通知:未定义的变量:SEXT在” .. 我试图用,如果空语句解决这个问题,但没有sucess ..

  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通过提供缺省值(和其他),避免了当您的变量$sExt未设置时的错误。这应该会给你想要的行为。

我也会将这些线

$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可能会非常糟糕,我会建议以另一种方式来做这种事情,比如使用数组,但是这可能会在第一个循环中完成。例如,nullfalse值可能位于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)&&'添加到'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