脚本适用于计算机而非服务器?

时间:2010-11-11 15:16:06

标签: php

奇怪的问题......我不知道为什么这不能在我的服务器上运行。

出于某种原因,IF不起作用。

令我困惑的主要是检查文件扩展名的那个。即使由于某种原因它在我的服务器而不是我的电脑上返回TRUE也不匹配。

    if (isset($_POST['submit'])) {

    $sizelimit = 50; //File size limit in KB.
    $destination_folder = 'images/user_avatars/temp/';

    $fileurl = $_POST['avatar_url'];
    $filetype = substr(strrchr($fileurl,'.'),1);
    $filename = "user_" . $_SESSION[user_id] . "." . $filetype;

    $temp = $destination_folder . $filename;

    if ($filetype == "gif" || "png" || "jpg" || "jpeg") {

        $file = fopen ($url, "rb");
        if ($file) {
            $newfile = fopen ($temp, "wb");
            if ($newfile) {
                while(!feof($file)) {
                    fwrite($newfile, fread($file, 1024 * 8 ), 1024 * 8 );
                }
            }
        }

        if ( filesize($temp) > 1024 * $sizelimit ) {
            $errors .= "The file size of the image you entered is too large!";
        }
    } else {
        $errors .= "The URL you entered is not a valid image!";
    }

    if (isset($errors)) {
        $smarty->assign("error_message", $errors);
        unlink($temp);
    } else {
        $avatar_sql = "
            UPDATE
                users
            SET
                user_avatar = '$filename'
            WHERE
                user_id = '$_SESSION[user_id]'
        ";
        $avatar_query = @mysqli_query ($db_connect, $avatar_sql);

        fclose($file);
        fclose($newfile);
    }
}

5 个答案:

答案 0 :(得分:6)

if ($filetype == "gif" || "png" || "jpg" || "jpeg")

这就是您的脚本不可靠的原因。请改用:

if ($filetype == "gif" || $filetype == "png" || $filetype == "jpg" || $filetype == "jpeg" )

甚至更好:

if (in_array($filetype, array("gif", "png", "jpg", "jpeg))

没有一个翻译能够聪明地认为而不是。你需要准确地告诉它你的意思。

答案 1 :(得分:1)

它不应该以任何方式工作。你现在正在评估的是:

if ($filetype == "gif" || "png" == true || "jpg" == true || "jpeg" == true) ...

“png”总是== true,所以是“jpg”和“jpeg”。

应该是:

if ($filetype == "gif" || $filetype == "png" || $filetype == "jpg" || $filetype == "jpeg") ...

或者使用in_array实际上更清楚。

答案 2 :(得分:1)

if ($filetype == "gif" || "png" || "jpg" || "jpeg") {
你做错了。阅读PHP中的运算符。

较短的正确方式是:

if(in_array($filetype, array("gif","png","jpg","jpeg")) {

答案 3 :(得分:1)

我不是PHP大师,但我很确定这是错误的:

if ($filetype == "gif" || "png" || "jpg" || "jpeg")

几乎可以肯定,==运算符比||更紧密地绑定。换句话说,你拥有的是:

IF
   $filetype == "gif" 
OR
   "png"
OR
   "jpg"
OR
   "jpeg"

我将进一步假设在布尔上下文中非空字符串被强制转换为true,因此后面的OR条件始终为真。

现在这也应该在你的机器上出现这种行为,所以我建议你可能已经上传了一个不同的文件到你在本地测试的文件。这可能是浏览器缓存,多个工作目录,任何类似的东西。根据经验,这很容易做到......

答案 4 :(得分:0)

PHP仅适用于启用了PHP的服务器,PHP不会在您的计算机上运行 PHP是一种服务器端语言!