只有变量应该通过引用传递?

时间:2017-07-14 18:46:48

标签: php phpmailer

当我尝试通过php邮件发送电子邮件时,我得到这个,任何伙伴都可以帮助它 这是我使用的代码

<?php
if(isset($_FILES['image'])){
    $errors= array();
    $file_name = $_FILES['image']['name'];
    $file_size = $_FILES['image']['size'];
    $file_tmp = $_FILES['image']['tmp_name'];
    $file_type = $_FILES['image']['type'];
    $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));

    $expensions= array("jpeg","jpg","png");

    if(in_array($file_ext,$expensions)=== false){
        $errors[]="extension not allowed, please choose a JPEG or PNG file.";
    }

    if($file_size > 2097152) {
        $errors[]='File size must be excately 2 MB';
    }

    if(empty($errors)==true) {
        move_uploaded_file($file_tmp,"images/".$file_name);
        echo "Success";
    }else{
        print_r($errors);
    }
}
?>

3 个答案:

答案 0 :(得分:5)

问题出在这一行:

    $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));

end()函数的参数通过引用&#39;传递,这意味着函数直接修改传递给函数的变量。因此,您无法将函数直接传递到end() - 您必须先将explode()的输出存储到变量中,然后将该变量传递给end()。一些相关文件:

submitted a Rakudo ticket

http://php.net/manual/en/language.references.php

对上述行的更改应该有效:

    $file_name_array = explode('.',$_FILES['image']['name']);
    $file_ext=strtolower(end($file_name_array));

答案 1 :(得分:2)

end是一个函数,将内部数组指针移动到数组的末尾。它通过获取数组引用并修改其数组指针来实现。该行将发出警告:

$file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));

它之所以这样做是因为explode是一个返回数组的函数。 PHP只是告诉你,你正在尝试移动数组指针,但是没有跟踪你正在移动指针的数组。

然而,副作用end也会返回结尾的元素(这是你想要的假设)。分成两行将起作用:

 $array = explode('.',$_FILES['image']['name']);
 $file_ext=strtolower(end($array)); // Now a variable. 

答案 2 :(得分:0)

看这个链接 https://stackoverflow.com/a/4636183

将explode的结果分配给一个变量并将该变量传递给end:

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

问题是,那端需要一个引用,因为它修改了数组的内部表示(即它使当前元素指针指向最后一个元素)。

explode('.', $file_name) 的结果不能转化为引用。这是 PHP 语言中的一个限制,可能出于简单原因而存在。