2009-07-17 48 views
7

我的第一个问题,谢谢。 :)

我正在为我的公司开发支持问题日志记录系统,它必须允许上传文件以及提交到我们数据库的任何问题。 可能有0-6个不同的上传来检查,以及支持问题。通过使用type =“file”输入选择图像或从表单中删除图像时,我通过隐藏输入字段(imgcount)可以获得准确的变量,以显示通过js更新的隐藏输入字段(imgcount)。

我的[输入类型=“文件”]名称是image1,image2等,因为我认为这将更容易通过它们循环。

当提交表单时,下面的代码会查看是否有任何文件并检查它们是有效类型(gif/jpeg/png),因此可以安全地上传它们。我不担心病毒,因为支持系统有一个很好的安全登录,我们相信我们的客户。

$sscount = $_POST['imgcount']; 
echo $sscount; //to test the variable 
if($sscount>0){ 
    for($i = 1; $i <= $sscount; $i++){ 
     if (($_FILES["image$i"]["type"] == "image/gif") 
     || ($_FILES["image$i"]["type"] == "image/jpeg") 
     || ($_FILES["image$i"]["type"] == "image/png") 
     && ($_FILES["image$i"]["size"] < 500000)) 
     { 

     } 
     else 
     { 
     $errormsg .= "Error: Image $i must be either JPEG, GIF, or PNG and less than 500 kb.<br />"; 
     } 
    } 
} 

但是这似乎并没有被通过循环正确,任何人有任何想法我如何能得到它循环并返回正确?

回答

8

的& &运营商具有较高的precedence比||,所以而非(A OR B OR C) AND D如你意,它实际上是A OR B OR (C AND D)

您可以使用括号来执行您所期望的评估。

然而,这样的事情可能是更清洁和更容易维护/阅读:

$allowed_types=array(
    'image/gif', 
    'image/jpeg', 
    'image/png', 
); 


$sscount = $_POST['imgcount']; 
if($sscount>0){ 
    for($i = 1; $i <= $sscount; $i++){ 

     if (in_array($_FILES["image$i"]["type"], $allowed_types) && 
      ($_FILES["image$i"]["size"] < 500000)) 
     { 

     } 

    } 
} 
2

那么,你的布尔逻辑是不明确的,可能不会做你想做的事情。这可能会更好地工作:

if ((($_FILES["image$i"]["type"] == "image/gif") 
    || ($_FILES["image$i"]["type"] == "image/jpeg") 
    || ($_FILES["image$i"]["type"] == "image/png")) 
    && ($_FILES["image$i"]["size"] < 500000)) 

但如果我有我能选择的话,整个事情看起来像:

$file = $_FILES['image' . $i]; 
    $type = $file['type']; 
    if(($type == 'image/gif' || $type == 'image/jpeg' || $type == 'image/png') && $file['size'] < 500000) 
+1

这不是“模棱两可”,它不是“作者所期望的”。运算符优先级规则解决了该表达式中的任何歧义。 – 2009-07-17 14:21:21

+0

我的歉意;我使用“模棱两可”的方式含糊不清。 – chaos 2009-07-17 14:41:05

+0

这似乎完美地完成了这项工作。 – 2013-02-23 20:13:05

0

我觉得你if条件是错误的。你需要围绕第一组布尔值的括号中进行逻辑或运算,例如:

if ((($_FILES["image$i"]["type"] == "image/gif") 
    || ($_FILES["image$i"]["type"] == "image/jpeg") 
    || ($_FILES["image$i"]["type"] == "image/png")) 
    && ($_FILES["image$i"]["size"] < 500000)) 

这意味着正常“如果该文件是(GIF或JPEG或PNG)的图像,并且小于大小” 。

你以前的方式不可能是你想要的逻辑。

5

这不是您的问题的直接答案,但您可以将表单值传递给PHP作为一个数组,应该更易于循环。 in_array()对于检查值是否在允许列表中也很有用。

HTML:

<input type="file" name="image[]"> 
<input type="file" name="image[]"> 
<input type="file" name="image[]"> 
<input type="file" name="image[]"> 

PHP:

<?php 
if (isset($_FILES['image'])) { 
    foreach ($_FILES['image'] as $file) { 
     if (!in_array($file['type'], array("image/gif", "image/jpeg", "image/png")) 
      || $file['size'] > 500000) { 
      //error 
     } else { 
      //ok 
     } 
    } 
} 
+1

对`in_array()`建议+1。 – ceejayoz 2009-07-17 14:26:08

+0

I second Tom Haigh's +1 – Josh 2009-07-17 17:59:35

4

正如其他人所说,你有你的组合条件语句的方式是错误的。但是,我并不是简单地添加一些括号,而是建议您完全将这两个条件分开;

// this declaration + the use of in_array() isn't necessary, 
// it just makes things a bit cleaner. 
$file_types = array("image/gif","image/jpeg","image/png"); 

if($_FILES["image$i"]["size"] < 500000) 
{ 
    if(in_array($_FILES["image$i"]["type"], $file_types))) 
    { 
     // do stuff 
    } 
    else 
    { 
     // error about file type 
    } 
} 
else 
{ 
    // error about file size 
} 

具有这种分离使得代码更易读并且更易于暗示条件层次结构,再加上它允许你的错误消息,以更有意义。分离不同类型的条件语句是一种很好的做法,所以任何错误消息都是有用的。如果您的代码出现错误,用户无法知道(不必担心自己)他们的图片是否太大或错误的类型。

0

您可以将所有['type'] == x || ['type'] == y在一次调用in_array($_FILES[...]['type'], $allowed)>

$ _FILES [..] ['type']包含客户端发送的数据,既不被php检查也不被消毒。如果文件的类型与任何相关性都不依赖$ _FILES [..] ['type']或$ _FILES [..] ['name']的后缀。 只有实际的内容很重要。如果需要,你可以使用the fileinfo extensionmime_content_type()(它被标记为弃用,以文件信息为准)进行测试

2

我不认为你真的需要一个通过Javascript更新的变量。您可以使用PHP来计算checking the error code上传了多少个文件。您也可以通过检查文件扩展名来处理文件上传,因为不同的浏览器通常可以发送不同的MIME类型。这里是我正在谈论的一个例子:

$accepted_files = array(
    'jpg', 
    'png', 
    'gif', 
    'jpeg' 
); 

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    foreach($_FILES as $key => $upload) { 
     if ($upload['error'] == 0) { 
      $file_parts = explode ('.',$upload['name']); 
      if (in_array($file_parts[sizeof($file_parts)-1], $accepted_files)) { 
       // This type of file is a-ok 
      } 
      else { 
       // Not an accepted file type 
      } 
     } 
    } 
}