【问题标题】:PHP Undefined index error $_FILES?PHP未定义索引错误$_FILES?
【发布时间】:2012-06-27 09:18:27
【问题描述】:

我是 PHP 新手,正在关注 YouTube 上的教程。除了文件上传之外,我在这个文件中拥有一切工作,任何帮助将不胜感激。这是我得到的错误:

*注意:我已经找了很多次了,但找不到与 $_FILES 相关的未定义索引错误...

注意:未定义索引:第 95 行 /Applications/xxx 中的头像

注意:未定义索引:第 96 行 /Applications/xxx 中的头像

注意:未定义索引:第 97 行 /Applications/xxx 中的头像

注意:未定义索引:第 98 行 /Applications/xxx 中的头像

抱歉,如果这是一个简单的修复...

            <?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(); 来查看变量内部的内容
  • 在旁注中,我发现将所有数据检查包装在一个递归 if 语句中的方式有​​点奇怪。如果用户名已被使用并且用户输入了无效的电子邮件会怎样?立即让他们知道所有错误,这样他们就不必一次修复一个错误,这不是很好吗?就个人而言,我将所有错误添加到数组中,例如 $err[] = 'username empty' 然后只需检查 $err isset 是否进一步向下并循环显示所有错误。
  • @Mike 谢谢你的建议。目前我还不够先进,但我会在以后尝试这样做。

标签: php file upload error-handling undefined


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    第一:尽量严格编程

    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']) &amp;&amp; isset($_FILES['avatar'])) { // ... } 有效,但随后我得到 Undefined index: tmpname in /Applications/xxx
    • 我应该在哪里添加file_uploads "1" upload_max_filesize "2M" post_max_size "8M" max_file_uploads 20 ?感谢您的帮助和快速回复。
    • 如果您使用 apache,您可以使用 How to change configuration settings ... 或 php.ini ... 添加它们,然后重新启动 apache(或 phpcgi)检查 phpinfo() 进行确认。
    【解决方案3】:

    你应该添加表单属性enctype="multipart/form-data"来上传文件

    【讨论】:

      【解决方案4】:

      上传文件,必须在form标签中使用enctype。

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

      【讨论】:

      • 然后检查您上传的文件大小是否大于php.ini中定义的限制。如果您不知道如何操作,请尝试使用小图像(几 kB)
      • 愚蠢的问题,但是您在再次提交之前是否刷新了页面以测试它是否有效?
      • 不,我没有,但我自己也犯过这个错误,所以请确保你没有犯过。
      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 2011-02-21
      • 2016-08-17
      • 2014-09-16
      相关资源
      最近更新 更多