PHP未定义索引错误$_FILES?

6
我是新手PHP程序员,正在跟随YouTube上的教程学习。我在这个文件中已经做好了所有的事情,除了文件上传之外,希望能得到帮助。下面是我收到的错误信息:
*注意:我已经查找了很多次,但没有找到与$_FILES相关的未定义索引错误......
提示:/Applications/xxx中的第95行、96行、97行和98行出现了未定义索引:avatar的错误。
如果这个问题很简单请原谅我......
            <?php $title = "Register";?>
        <?php require ("styles/top.php") ; ?>           
        <?php //de-bugging remove this after script works as desired>
        error_reporting(E_ALL);
         ini_set("display_errors", 1); 
        //end de-bugging//
        
        $form = "<form action='register.php' method='post'>
        <table cellspacing='5px'>
            <tr>
                <td></td>
                <td><font color='red'>*</font> are required fields.</td>
            </tr>
            <tr>
                <td>First Name:</td>
                <td><input type='text' name='firstname' class='textbox'><font color='red'> *</font></td>
            </tr>
            <tr>
                <td>Last Name:</td>
                <td><input type='text' name='lastname' class='textbox'><font color='red'> *</font></td>
            </tr>
            <tr>
                <td>Username:</td>
                <td><input type='text' name='username' class='textbox'><font color='red'> *</font></td>
            </tr>
            <tr>
                <td>Email:</td>
                <td><input type='text' name='email' class='textbox'><font color='red'> *</font></td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type='password' name='password' class='textbox'><font color='red'> *</font></td>
            </tr>
            <tr>
                <td>Confirm Password:</td>
                <td><input type='password' name='repassword' class='textbox'><font color='red'> *</font></td>
            </tr>
            <tr>
                <td>Profile Picture:</td>
                <td><input name='avatar' type='file' ></td>
            </tr>
            <tr>
                <td>Profile Message:</td>
                <td><textarea name='bio' cols='35' rows='5' class='textbox'></textarea></td>
            </tr>
            <tr>
                <td></td>
                <td><input type='submit' name='submitbtn' value='Submit' class='button'></td>
                
            </tr>
        </table>
        </form>";
        
        
        if ($_POST['submitbtn']) {
            
            $firstname = strip_tags($_POST['firstname']);
            $lastname = strip_tags($_POST['lastname']);
            $username = strip_tags($_POST['username']);
            $email = strip_tags($_POST['email']);
            $class = ($_POST['class']);
            $password = strip_tags($_POST['password']);
            $repassword = strip_tags($_POST['repassword']);
            $bio = strip_tags($_POST['bio']);
            //AVATAR UPLOAD
            $name = $_FILES['avatar'] ['name'];
            $type = $_FILES['avatar'] ['type'];
            $size = $_FILES['avatar'] ['size'];
            $tmpname = $_FILES['avatar'] ['tmpname'];
            $ext = substr($name, strrpos($name, '.'));
            

            
            if ($firstname && $lastname && $username && $email && $password && $repassword) {
                if ($password == $repassword) {
                    if (strstr($email, "@") && strstr($email, ".") && strlen($email) >= 6) {
                        
                        require("scripts/connect.php");
                        
                        $query = mysql_query("SELECT * FROM users WHERE username ='$username'");
                        $numrows = mysql_num_rows($query);
                        if ($numrows == 0) {
                        
                            $query = mysql_query("SELECT * FROM users WHERE email ='$email'");
                            $numrows = mysql_num_rows($query);
                            if ($numrows == 0) {
                            
                                $pass = (md5(md5($password)));
                                $date = date("F j, Y");

                                if($name){
                                        move_uploaded_file($tmpname, "avatars/$username.$ext");
                                        $avatar = "$username.$ext";
                                        }
                                        else
                                            $avatar = "default_avatar.png";
                                        
                                    $code = substr(md5(rand(111111111111, 99999999999999999)), 2, 25);  
                            
                                
                                mysql_query("INSERT INTO users VALUES ('', '$firstname', '$lastname', '$username', '$email', '$pass', '$avatar', '$bio', '', '', '$code', '', '$date')"); 
                                
                                    $webmaster = "xxxx";
                                    $subject = "xxxx";
                                    $headers = "From:xxx<$webmaster>";
                                    $message = "xxx";
                                    
                                    mail($email, $subject, $message, $headers);
                                    
                                    echo "xxx";
                                                        
                            }
                            else
                                echo "That email is already taken. $form";
                        }
                        else
                            echo "That username is already taken. $form";
                        
                    }
                    else
                        echo "You did not enter a valid email. $form";
                
                }
                else
                    echo "Your passwords did not match. $form";
            }
            else
                echo "You did not fill in all of the required fields. $form";
                
            }
            else
                echo "$form";
            
            ?>
        
            </div>
            <?php require ("styles/bottom.php") ; ?>

var_dump($_FILES); 记得始终使用 var_dump(); 查看变量内部的内容。 - zerkms
顺便说一下,我觉得你把所有的数据检查都包含在一个递归的 if 语句中有点奇怪。如果用户名已经被使用 并且 用户输入了无效的电子邮件地址会发生什么?让他们一次性知道 所有 的错误不是很好吗,这样他们就不必一次修复一个错误了?个人而言,我将所有的错误添加到一个数组中,例如 $err[] = 'username empty',然后只需检查 $err 是否 isset,并通过循环显示所有的错误。 - Mike
@Mike 谢谢你的建议。目前我还不够高级,但我将来会尝试做这个。 - mais-oui
4个回答

29

上传文件时,必须在表单标记中使用enctype属性。

<form enctype="multipart/form-data" action='register.php' method='post'>

然后检查您上传的文件大小是否大于php.ini中定义的限制。如果您不知道如何操作,请尝试使用小图像(几KB)。 - Sarwar Erfan
很愚蠢的问题,你在提交之前刷新了页面以测试它是否可行吗? - Mike
没有,但我之前犯过这个错误,所以只是想确保你没有犯。 - Mike

13

首先:尝试严格编程。

error_reporting(E_ALL | E_STRICT);

你还必须使用isset来检查数组索引是否可用。

if (isset($_POST['submitbtn']) && isset($_FILES['avatar'])) {
     // ...
}

同时检查 PHP 配置

file_uploads    "1"
upload_max_filesize     "2M"
post_max_size   "8M"
max_file_uploads    20

上传的文件大小必须小于服务器接受的最大值。

此外,正如其他人所说,请检查表单的enctype属性。


if (isset($_POST['submitbtn']) && isset($_FILES['avatar'])) { // ... } 这段代码是有效的,但是我收到了 /Applications/xxx 中的 Undefined index: tmpname 错误提示。 - mais-oui
жҲ‘еә”иҜҘеңЁе“ӘйҮҢж·»еҠ file_uploads "1" upload_max_filesize "2M" post_max_size "8M" max_file_uploads 20е‘ўпјҹж„ҹи°ўжӮЁзҡ„её®еҠ©е’Ңеҝ«йҖҹеӣһеӨҚгҖӮ - mais-oui
如果您使用Apache,可以通过如何更改配置设置或php.ini将它们添加到其中...在重新启动Apache(或phpcgi)后,请检查phpinfo()以确认。 - sweb

5
您应该在上传文件时添加表单属性 enctype="multipart/form-data"

4

这是一篇1年前的文章,但您可能仍然感兴趣... 在PHP.ini中检查此选项: enable_post_data_reading=off 它应该是:on,否则$_FILES将永远为空 PHP是否读取POST数据,默认情况下启用此选项。 很可能,您不想全局禁用此选项。这会导致$_POST和$_FILES始终为空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接