Проблема с загрузкой файлов PHP - PullRequest
0 голосов
/ 05 мая 2011

У меня есть следующий код для регистрации новых пользователей, они загружают фотографии, переименовывают и перемещают в папку, однако я продолжаю получать сообщения о том, что фотография не определена, я думаю, что это должно быть (глупо) проблема с моей формой, которая отсутствует, но Я повторил свой код и не могу решить это.

    <?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 ]

2 голосов
/ 05 мая 2011

Вы должны установить для enctype тега form значение enctype = "multipart / form-data"

См., Например, http://www.15seconds.com/issue/001003.htm

1 голос
/ 05 мая 2011

Здесь мы идем снова ....

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», но действительно отправляет «nasty virus.exe».Всегда определяйте тип файла на сервере альтернативными методами, такими как file_info.

c) Вы, кажется, регистрируете загрузку в базе данных, независимо от того, является ли она действительной или нет.«Эй, вы отправляете нам грузовик с мусором вместо цветов. Ну да ладно, я все равно приму доставку. Спасибо!».Кроме того, вы не проверяете, удастся ли move_uploaded_file() вообще, так что есть еще одна точка отказа.В вашем конечном месте назначения файла может не хватить места на диске, но вы все равно записываете загрузку как успешную.

Бонусные баллы: вы фактически выполняете экранирование своих данных перед выполнением запроса и проверяете, выполняет ли запросsuceeded.Не часто вижу это на этом сайте.

0 голосов
/ 05 мая 2011

Вы действительно хотите получить доступ к $ _POST и $ _GET?

$ _ POST

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

$ _ GET

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

обратите внимание на "$ _GET ['photo']"

Я думаю, вы имели в виду $ _POST, где у вас есть $ _GET

0 голосов
/ 05 мая 2011

Ваша форма должна установить атрибут 'enctype' как 'multipart / form-data'

<form name="login" action="register.php" method="post" enctype="multipart/form-data">
0 голосов
/ 05 мая 2011

Ваша форма должна выглядеть так:

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

Дело в том, что если вы не установите enctype, он отправит изображение в виде данных POST.

Вы можете прочитать подробнее об enctype здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...