PHP文件上传的问题



我有以下代码注册新用户,他们的照片被上传重命名并移动到一个文件夹,但我不断得到错误说照片是未定义的,我认为这一定是一个(愚蠢的)问题与我的形式,我错过了,但我已经一步,虽然我的代码重复,不能解决这个问题。

    <?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.';
    }
}
?>

必须将form-tag的enctype设置为enctype="multipart/form-data"

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

又来了....

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)不通过检查文件扩展名来验证上传的文件类型。没有人说恶意用户不能上传"可爱的小狗。jpg",但实际上是在发送"讨厌的病毒。exe"。始终通过其他方法确定服务器上的文件类型,例如使用file_info

c)你似乎在数据库中注册上传,不管它是否有效。"嘿,你给我们送来一卡车的垃圾,而不是鲜花。哦,好吧,我还是接受送货吧。谢谢!"。同样,您根本没有检查move_uploaded_file()是否成功,因此存在另一个故障点。文件的最终目的地可能耗尽了磁盘空间,但您仍然将上传记录为成功。

加分点:在执行查询之前,您实际上对数据进行了转义,并检查查询是否成功。

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

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

您的表单应该是这样的:

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

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

您可以在这里阅读更多关于enctype的信息

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

$ _POST

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

$ _GET

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

注意"$_GET['photo']"

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

相关内容

  • 没有找到相关文章