PHP文件上传问题

时间:2011-05-05 18:35:04

标签: php mysql html forms file

我有以下代码注册新用户,他们的照片上传重命名并移动到一个文件夹但是我不断收到错误说照片未定义,我认为它一定是一个(愚蠢的)问题,我的表格我不知道但是我已经重复了我的代码并且无法解决这个问题。

    <?php
include 'includes/config.inc.php';
//error_reporting(0);

$conn = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname);

echo '<center>
     <form name="login" action="register.php" method="post">
        Username: <input type="text" name="username"/><br>
        Password: <input type="password" name="password"/><br>
        Email: <input type="text" name="email"/><br>
        First Name: <input type="text" name="firstname"/><br>
        Last Name: <input type="text" name="lastname"/><br>
        Photo: <input type="file" name="photo" id="photo"/><br>
        <small>Files must be; PNG, JPEG, JPG</small>
        <input type="submit" value="Register"/>
        <input type="hidden" name="submitted" value="1">
        </form>
        <br>
        <br>

        ';
if (isset($_POST['submitted'])){
if ($_POST['submitted']==1) {
    if (is_string($_POST['username'])) {
        $username = $_POST['username'];
        $username = mysql_real_escape_string($username);
         }
    else
    {
        echo 'Please enter a valid username<br>';
    }
    if ($_POST['password']) {
        $password = md5($_POST['password']);
    }
    else
    {
        echo 'Please enter a valid password<br>';
    }
    if (is_string($_POST['firstname'])) {
        $firstname = $_POST['firstname'];
        $firstname = mysql_real_escape_string($firstname);
    }
    else
    {
        echo 'Please enter a valid realname<br>';
    }
        if (is_string($_POST['lastname'])) {
        $lastname = $_POST['lastname'];
        $lastname = mysql_real_escape_string($lastname);
    }
    else
    {
        echo 'Please enter a valid realname<br>';
    }

    if (filter_var($_POST['email'],FILTER_VALIDATE_EMAIL)){
    $email = $_POST['email'];
    $email = mysql_real_escape_string($email);
    }
    else
    {
        echo 'Please enter a valid email address.<br>';
    }


    //INSERT TO DB

    $users = mysql_query("SELECT username FROM tbl_users WHERE username='$username'")or die(mysql_error());
    $numrows = mysql_num_rows($users);

    if($numrows == 1){
        echo 'Username taken, please choose another.<br>';
    }
    elseif ($username && $password && $firstname && $lastname && $email && $_GET['photo'] != ''){

    //UPLOAD FILE
    $filename = $_FILES["photo"]["name"];
    echo $filename;
    $file_ext = substr($filename, strripos($filename, '.'));
    $filesize = $_FILES["photo"]["size"];

    if (($file_ext == ".png" || $file_ext == ".jpg" || $file_ext == ".jpeg")  &&  ($filesize < 500000)) {
       $photo_ID = md5($filename);
       $rand = rand();
       $newfilename = $photo_ID . $rand . $file_ext;
       move_uploaded_file($_FILES["photo"]["tmp_name"], "images/profile_pics/" . $newfilename) or die("error uploading photo");
    }
    else
    {
        echo 'Wrong file type<br>';
    }

        $query = "INSERT INTO tbl_users ( username, password, firstname, lastname, Email_address, photo_url )
        VALUES ( '$username' , '$password' , '$firstname', '$lastname', '$email', '$newfilename' );";
        mysql_query($query) or die(mysql_error());
        echo 'Thank you for registering '. $firstname .'. Your username is '. $username .'.<br>';
        echo 'Click here to <a href="./index.php?">login</a>.<br></center>';
        mysql_close();

    }
    }
    else
    {
        echo 'Please fill the form out.';
    }

}
?>

5 个答案:

答案 0 :(得分:2)

您必须将form-tag的enctype设置为enctype =“multipart / form-data”

参见例如http://www.15seconds.com/issue/001003.htm

答案 1 :(得分:1)

我们再来一次......

a)不验证文件上传以查看其用户提供的文件名是否存在。完全可以上传没有名字的文件。检查上传成功的正确方法是:

if ($_FILES['name_of_file_field']['error'] === UPLOAD_ERR_OK) {
   ... worked ok ...
} else {
   die("Upload failed with errno #" > $_FILES['name_of_file_field']['error']);
}`

b)不要通过检查文件扩展名来验证上传的文件类型。没有什么说恶意用户无法上传“cute puppy.jpg”,但真的发送“讨厌的virus.exe”。始终通过其他方法确定服务器上的文件类型,例如使用file_info

c)您似乎在数据库中注册上传,无论其是否有效。 “嘿,你给我们发了一大堆垃圾而不是鲜花。哦,好吧,我还是会接受交付。谢谢!”。同样,你不会检查move_uploaded_file()是否成功,所以还有另一个失败点。您文件的最终目的地可能没有磁盘空间,但您仍然将上传记录为成功。

奖励积分:在进行查询之前,您实际上正在对数据进行转义,并检查查询是否成功。不要经常在这个网站上看到它。

答案 2 :(得分:0)

您的表单应如下所示:

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

问题是,如果你没有设置enctype,它会将图像作为POST数据发送。

您可以阅读more about enctype here.

答案 3 :(得分:0)

您的表单需要将'enctype'属性设置为'multipart / form-data'

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

答案 4 :(得分:0)

你真的想要同时访问$ _POST和$ _GET吗?

<强> $ _ POST

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

<强> $ _ GET

elseif ($username && $password && $firstname && $lastname && $email && $_GET['photo'] != ''){

请注意“$ _GET ['photo']”

我猜你的意思是$ _POST你有$ _GET