7

有人能告诉我为什么,在选择 psd 文件时,php 代码中的 if 语句传递为 true 并回显“image/vnd.adobe.photoshop”吗?

<?php

if (isset($_POST['submit'])) {
    foreach ($_FILES["myimages"]["error"] as $key => $error) {
        $tmp_name = $_FILES["myimages"]["tmp_name"][$key];
        $name = $_FILES["myimages"]["name"][$key];
        $imagetype = $_FILES['myimages']['type'][$key];

        if ($imagetype == "image/jpeg" || "image/gif") {
            echo $imagetype;
        }
    }
}

?>

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

<form method="post" enctype="multipart/form-data" action="<? echo basename(__file__); ?>">
    <input type="file" name="myimages[]" multiple>
    <input name="submit" type="submit" value="submit">
</form>

</body>
</html>
4

6 回答 6

9

因为这是错误的

if( $imagetype == "image/jpeg" || "image/gif" ) { /*...*/ }

应该

if( $imagetype == "image/jpeg" || $imagetype == "image/gif" ) { /*...*/ }

甚至

if( in_array($imagetype, ["image/jpeg", "image/gif"]) ) { /*...*/ }

也就是说,因为非空字符串被认为是真的,所以满足了 IF 条件。

于 2013-08-02T14:49:13.817 回答
4

这是因为位运算符的优先级低于相等检查。它是这样的:

  1. 你有

    if ($imagetype == "image/jpeg" || "image/gif") {
    
  2. 平等首先解析为布尔值,您的表达式变为:

    if (false || "image/gif") {
    
  3. 非空字符串的处理方式与true在表达式中使用时一样。这意味着我们有

    if (false || true) {
    
  4. 结果当然是true,所以 if 块执行。

于 2013-08-02T14:53:25.730 回答
2

您的 || 陈述不正确

$imagetype == "image/jpeg" || 
$imagetype == "image/gif"

正在发生的事情是“image/gif”正在返回 true,而 true 正在与 $imagetype == "image/jpeg" 返回的 false 进行或运算。假 || 真 == 真

于 2013-08-02T14:49:58.343 回答
2

您还可以有以下情况:

if ( $imagetype == ("image/jpeg" || "image/gif") ) {
    echo $imagetype;
}

其他答案很好,这只是解决它的另一种方法:)

于 2013-08-02T14:53:29.770 回答
1
if($imagetype == "image/jpeg" || "image/gif")

相当于:

$condition1 = $imagetype == "image/jpeg";
if($condition1 || "image/gif")

在这种情况下将被评估为:

if($condition1 || true)

无论 的值是什么,它的计算结果都为$condition1

因为if(false || true)返回true

另一点:我建议使用===运算符而不是==,所以你的最终代码应该是:

if($imagetype === "image/jpeg" || $imagetype === "image/gif")
于 2013-08-02T14:52:58.087 回答
1

您编写的 if 语句预计将评估为 TRUE。

这是因为您没有将“图像/gif”与任何东西进行比较,您只是将其评估为布尔值。PHP 将字符串值(不是"0",或空 ( "") )转换为 TRUE 当它们被评估为布尔值时。因此,本质上,您的 IF 语句是在说“如果$imagetype等于"image/jpeg"OR"image/gif"为 TRUE,则执行此操作。

$imagetype您的 if 条件将始终通过,因为“image/gif”将始终被评估为 true,因此s 值实际上是什么并不重要。

于 2013-08-02T14:54:11.267 回答