代码之家  ›  专栏  ›  技术社区  ›  sdot257

如果/否则工作不正常

  •  0
  • sdot257  · 技术社区  · 16 年前

    我有一个验证功能,我正在使用的代码点火器内部。

    function valid_image() {
        if ( ($_FILES["file"]["type"] != "image/jpeg") || ($_FILES["file"]["type"] != "image/gif")  ) {
        $this->form_validation->set_message('valid_image', 'Wrong file type..');
    
        return false;
    } else {
        return true;
    }
    

    如果在if语句中只使用“image/jpeg”部分,它就可以正常工作。如果我尝试上传除JPG文件以外的其他文件,它会失败。如果我运行上面的代码,它将同时失败于JPG或GIF文件。

    在有人说“为什么不使用上传类”之前,我不能。我正在将图片直接保存到MongoDB中,所以上传类没有多大帮助。

    9 回复  |  直到 16 年前
        1
  •  1
  •   Powerlord    16 年前

    这并不能真正回答你的问题,但是…

    这个 $_FILE[blah]["type"] 参数由Web浏览器设置,因此用户数据不可信。

    你可能想用 exif_imagetype($_FILES["file"]["tmp_name"]) 而是检测真正的图像类型。

    function valid_image() {
        $type = exif_imagetype($_FILES["file"]["tmp_name"]);
        if (($type != IMAGETYPE_GIF) && ($type != IMAGETYPE_JPEG)) {
            $this->form_validation->set_message('valid_image', 'Wrong file type..');
            return false;
        } else {
            return true;
        }
    }
    

    编辑:如果未安装exif扩展,也可以执行以下操作:

    $sizes = getimagesize($_FILES["file"]["tmp_name"]);
    

    $sizes[2] 将包含对应于 IMAGETYPE constants .

    function valid_image() {
        $sizes = getimagesize($_FILES["file"]["tmp_name"]);
        if (($sizes[2] != IMAGETYPE_GIF) && ($sizes[2] != IMAGETYPE_JPEG)) {
            $this->form_validation->set_message('valid_image', 'Wrong file type..');
            return false;
        } else {
            return true;
        }
    }
    
        2
  •  5
  •   JeffH    16 年前

    你想不想或者

    如果文件是JPG,那么它不是GIF,您会收到消息。
    如果文件是GIF,那么它不是JPG,您仍然会收到消息。

    你有“文件不是JPG或文件不是GIF”。用&&替换,只有当“文件不是JPG,文件不是GIF”时才会收到消息。

        3
  •  1
  •   Macmade    16 年前

    你的if语句错误。您应该使用“&&”而不是“”(demorgan's law)。

        4
  •  1
  •   meouw    16 年前

    你需要你的条件

    if ( ( $_FILES["file"]["type"] != "image/jpeg") 
           && ($_FILES["file"]["type"] != "image/gif")  ) {...}
    

    如果不是jpeg,也不是gif,那么它是无效的。

        5
  •  1
  •   St. John Johnson    16 年前

    你需要而不是或

     if (($_FILES["file"]["type"] != "image/jpeg") && 
         ($_FILES["file"]["type"] != "image/gif"))
    
        6
  •  1
  •   ezmia    16 年前

    使用而不是||

        7
  •  0
  •   Matt    16 年前

    您所拥有的语句保证它不是jpeg,也不是gif。问题是,如果它是jpeg,它仍然不是gif,所以它返回false。事实上,它总是返回错误,因为某些东西不能同时是两个东西。

    如果这是您的意图,请将更改为&如果这是您的意图,应该会有所帮助。

        8
  •  0
  •   GSto    16 年前

    您要使用and,而不是or。在上面的代码中,JPG失败是因为它不是GIF,而GIF失败是因为它不是JPG。

    function valid_image() {
    if ( ($_FILES["file"]["type"] != "image/jpeg") && ($_FILES["file"]["type"] != "image/gif")  ) {
    $this->form_validation->set_message('valid_image', 'Wrong file type..');
    
    return false;
    } else {
    return true;
    }
    
        9
  •  0
  •   Scott    16 年前

    如果你用一个.gif文件尝试这个语句,它会说它是错误的文件,因为它首先检查第一个或第一个。另外,如果您尝试运行.jpg,它将通过第一个,但第二个会失败,因此它仍然会说它是无效的。尝试将其设置为“&&”而不是“”,这样它将检查并确保每次都是其中之一。

    推荐文章