【问题标题】:If/else isn't working properly如果/否则无法正常工作
【发布时间】:2010-03-19 02:42:04
【问题描述】:

我在 codeigniter 内部使用了一个验证函数。

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 中,所以上传类没有多大帮助。

【问题讨论】:

  • 请执行“var_dump($_FILES["file"])”并发布结果?
  • 在 24 秒内,发布了 5 个相同的答案。呵呵。
  • If/else 工作得很好。条件坏了。
  • 首先,你没有问问题。 SO 是一个问答板。问题以问号 (?) 结尾。其次,您是否认真认为 if/else 已损坏并且没有其他人注意到?问题出在您的代码中,至少 99.5% 的错误都是如此。
  • 哇,你一定是个反社会人士,或者小时候有人狠狠地扇了你一巴掌。感谢其他没有通过指出每个人的错误来下车的人。

标签: php codeigniter


【解决方案1】:

你想要 AND 而不是 OR

如果文件是 jpg,那么它不是 gif,您会收到消息。
如果文件是 gif,那么它不是 jpg,你仍然会收到消息。

您有“文件不是 jpg 或文件不是 gif”。替换 ||使用 && 并且只有在“文件不是 jpg 且文件不是 gif”时才会收到消息。

【讨论】:

    【解决方案2】:

    这并不能真正回答您的问题,但是...

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

    【讨论】:

      【解决方案3】:

      您的 if 语句错误。你应该使用 '&&' 而不是 '||' (德摩根定律)。

      【讨论】:

        【解决方案4】:

        你需要你的条件是

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

        如果它不是 jpeg 并且不是 gif - 它是无效的

        【讨论】:

          【解决方案5】:

          你需要 AND 而不是 OR

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

          【讨论】:

            【解决方案6】:

            使用 && 代替 ||

            【讨论】:

              【解决方案7】:

              您拥有的声明保证它不是 jpeg 也不是 gif。这样做的问题是,如果它是 jpeg,它仍然不是 gif,所以它返回 false。事实上,它总是返回 false,因为某事不能同时是两件事。

              改变||到 && 如果这是你的意图,它应该会有所帮助。

              【讨论】:

                【解决方案8】:

                您想使用 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】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2022-01-14
                    • 2021-04-09
                    • 2018-11-11
                    • 1970-01-01
                    • 2022-01-22
                    • 2017-06-17
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多