За последние 24 часа нас посетили 118318 программистов и 8024 робота. Сейчас ищет 1541 программист ...

Загрузка аватара при регистрации

Тема в разделе "PHP для новичков", создана пользователем fanat, 15 апр 2016.

  1. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    Здравствуйте. Столкнулся с проблемой того, как правильно загрузить в определенную директорию аватар, а затем, получив путь к нему, прописать его в соответствующем столбце в базе данных. Может кто с этим помочь? Сейчас на месте авы стоит простая картинка, прописанная через <img>
    Вот файл, в котором вся регистрация происходит
    PHP:
    1. <?php
    2.     if (isset($_POST['login'], $_POST['password'], $_POST['email']))
    3.     {
    4.         // Данные для mysql сервера
    5.         $dbhost = "localhost"; // Хост
    6.         $dbuser = "root"; // Имя пользователя
    7.         $dbname = "copyright"; // Имя базы данных
    8.  
    9.         // Подключаемся к mysql серверу
    10.         $link = mysql_connect($dbhost, $dbuser);
    11.      
    12.         //Указываем кодировку для подключения к базе
    13.         mysql_set_charset("utf8");
    14.         // Выбираем нашу базу данных
    15.      
    16.         mysql_select_db($dbname, $link);
    17.  
    18.         // Добавляем запись в нашу таблицу customer
    19.         // т.е. делаем sql запрос
    20.      
    21.         $login = mysql_real_escape_string(mb_substr(htmlspecialchars(trim($_POST['login'])), 0, 1000, 'UTF-8'));
    22.         $password = mysql_real_escape_string(md5(mb_substr(htmlspecialchars(trim($_POST['password'])), 0, 1000, 'UTF-8')));
    23.         $email = mysql_real_escape_string($_POST['email']);
    24.         $age = mysql_real_escape_string(mb_substr(htmlspecialchars(trim($_POST['age'])), 0, 1000, 'UTF-8'));
    25.         $real_name = mysql_real_escape_string(mb_substr(htmlspecialchars(trim($_POST['real_name'])), 0, 1000, 'UTF-8'));
    26.         $job = mysql_real_escape_string(mb_substr(htmlspecialchars(trim($_POST['job'])), 0, 1000, 'UTF-8'));
    27.         $status ="user";
    28.  
    29.         if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    30.             exit("E-mail указан не верно.");
    31.         }
    32.      
    33.         $query ="Insert Into
    34.                users(login, password, email, age, job, real_name, status)
    35.                values('$login', '$password', '$email', '$age', '$job', '$real_name', '$status')";      
    36.      
    37.         mysql_query($query) or die (mysql_error());
    38.         mysql_close();
    39.          
    40.     }
    41.  
    42.     else {
    43.         exit ("Ошибка!");
    44.     }
    Вот форма:
    HTML:
    1. <form method="POST" id="reg_form" action="php/reg_php.php" onsubmit="return false" enctype="multipart/form-data">
    2.                         <label>Введите ваш логин:
    3. <input type="text" id="login" name="login" size="30">
    4.                              <span id="msgbox" style="display:none"></span>
    5.                             <br><br>
    6.                         </label>
    7.                         <label>Введите ваш e-mail:<input type="text" id="email" name="email" size="30">
    8.                              <span id="msgbox_email" style="display:none"></span>
    9.                             <br><br>
    10.                         </label>
    11.                         <label>Введите ваш пароль:
    12.                             <input type="password" name="password" size="30"><br><br>
    13.                         </label>
    14.                         <label>Введите ваш возраст:
    15.                             <input type="text" name="age" size="30"><br><br>
    16.                         </label>
    17.                         <label>Введите ваше реальное имя:<input type="text" name="real_name" size="30"><br><br>
    18.                         </label>
    19.                         <label>Введите ваш род деятельности:
    20.                             <input type="text" name="job" size="30"><br><br>
    21.                         </label>
    22.                         <label>Выберите ваш аватар:<input type="file" name="avatar" size="30"><br><br>
    23.                         </label>
    24.                         <center>
    25.                             <input type="submit"  value="Зарегистрироваться">
    26.                             <input type="reset" value="Очистить поля">
    27.                         </center>
    28.                     </form>
    В таблице users есть поле для пути к файлу аватарки - avatar.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    в чем проблема-то?
     
  3. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    Я не знаю каким образом мне поместить изображение в каталог images/avatar, а затем получить этот путь и записать его в соответствующий столбец базы данных. При это, желательно, уменьшить изображение до 100х100
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
  5. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    343
    Симпатии:
    39
    Лишнее действие. Зачем получать путь, когда он у тебя уже есть при загрузке картинке в каталог.
     
  6. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    Добавил в свой файл вот такой код:
    PHP:
    1. $uploaddir = '';
    2. $uploadfile = $uploaddir . basename($_FILES['avatar']['name']);
    3. if (move_uploaded_file($_FILES['avatar']['tmp_name'], $uploadfile)) {
    4.         echo "Файл корректен и был успешно загружен.\n";
    5.         } else {
    6.         echo "Возможная атака с помощью файловой загрузки!\n";
    7. }
    Но оно мне выдает ошибку "Undefined index: avatar in ...."
    Может ли это быть связано с тем, что к форме прикручен ajax-запрос на отправку данных в БД?
    И, я так понимаю, переменная $uploaddir отвечает за директорию, в которую будет загружен файл?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    не каждая форма может отравить файл. Нужно указать еще тип отправляемых данных.
    --- Добавлено ---
    HTML:
    1. <form method="POST" enctype="multipart/form-data" action="куда">
     
  8. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.971
    Симпатии:
    753
    Да! а у тебя пустые кавычки. Можно указать относительный путь. И файл нужно переименовать, а не сохранять с оригинальным именем. Как ты потом его идентифицируешь? имя файла должно быть типа "34_ava.jpg", где 34 - ID пользователя. перед этим желательно проверить расширение файла и сохранить его в переменную, например, $rassh. И тогда конечное имя фала будет:

    Код (Text):
    1. $filename = "$UserId"."_ava.".$rassh
    итого

    Код (Text):
    1. $uploadfile=$uploaddir.basename($_FILES['avatar']["$filename"]); // переменная в ключе массива в двойных кавычках!
    а если ты еще и несколько файлов одного пользователя будешь хранить, то нужно еще проверять есть ли файл с таким именем. И действовать как считаешь нужным. либо удалять старый файл, либо называть текущий как то иначе. Например, "34_ava_1.jpg", "34_ava_2.jpg" и т. д.
     
  9. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    Это у меня есть.
    --- Добавлено ---
    Это я знаю. Я собирался имени файла присваивать логин пользователя. Ну или, как вы указали, ID. Но это все потом, мне сначала надо как-то с загрузкой разобраться, чтобы эта ошибка исчезла.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    var_dump($_FILES);
     
  11. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    array(0) {}
     
  12. Kutuz

    Kutuz Новичок

    С нами с:
    10 апр 2016
    Сообщения:
    15
    Симпатии:
    0
    Перед тем как использовать обращение к элементам массива по ключу, следует заранее удостовериться в существовании такого ключа в массиве,
    ситуацию исправит условие перед использованием массива с файлом
    Код (Text):
    1.  if(isset($_FILES['avatar'])){ /* работаем*/ }else{ /* Файла не было*/}
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.971
    Симпатии:
    753
    $uploaddir = "путь/прописал?";
     
  14. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    Так это, по сути, роли не играет... Он в корень ведь скинет изображение и все. Это уже проверено, на отдельной форме. Только вот на этой он работать не хочет
    --- Добавлено ---
    Да, файла нет...
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    пусто

     
  16. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    Так из-за ajax-запроса проблемы быть не может? Я ведь в нем это поле совершено никак не обрабатываю.
     
  17. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.971
    Симпатии:
    753
    Код (Text):
    1. <input type="file" name="avatar" size="30">
    size="30" - файл не более 30 БАЙТ. ворт где проблема.
     
  18. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    Это я удалил ещё раньше, не помогло.
     
  19. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    343
    Симпатии:
    39
    А это тебе зачем?
    Код (Text):
    1. onsubmit="return false"
     
  20. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.971
    Симпатии:
    753
    если все остальные элементы формы передаются а этот нет, то либо мы имеем дело с полтргейстом, либо нужно искать ошибки в коде. Типа профтыкал кавычку, профтыкал регистр и т. п.
     
  21. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    А без этого не работает ajax-запрос
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    потому что аяксом. Там непросто файлы посылать. Это тебе не вал инпута слизать.
     
  23. fanat

    fanat Новичок

    С нами с:
    1 апр 2016
    Сообщения:
    35
    Симпатии:
    0
    Убрал ajax и теперь действительно что-то происходит. var_dump выводит следующее:

    Код (Text):
    1. Файл корректен и был успешно загружен. array(1) { ["userfile"]=> array(5) { ["name"]=> string(10) "avatar.gif" ["type"]=> string(9) "image/gif" ["tmp_name"]=> string(25) "C:\xampp1\tmp\phpC81B.tmp" ["error"]=> int(0) ["size"]=> int(4186) } }
    Только перед этим появляется окошко с проверкой, что якобы файла нет. И он, после того, как вылазит вышенаписанный текст, не помещает само изображение никуда.
    --- Добавлено ---
    О, все. Аватар появился в нужной папке
    --- Добавлено ---
    Но без ajax не обойтись, можете подсказать как видоизменить запрос для файла?
    Код (Javascript):
    1. $("#reg_form").submit(function()
    2. {
    3.     var login = $('#reg_form input[name="login"]').val(),
    4.         email = $('#reg_form input[name="email"]').val(),
    5.         job = $('#reg_form input[name="job"]').val(),
    6.         real_name = $('#reg_form input[name="real_name"]').val(),
    7.         age = $('#reg_form input[name="age"]').val(),
    8.         password = $('#reg_form input[name="password"]').val();
    9.  
    10.     if (login == '' || email == '' || password == '' || age == '' || real_name == '' || job == '')
    11.     {
    12.             alert('Вы не заполнили все необходимые поля');
    13.             return;
    14.     }
    15.    
    16.     $.ajax({
    17.         type: "POST",
    18.         url: "php/reg_php.php",
    19.         data: {
    20.             'login' : login,
    21.             'email' : email,
    22.             'password' : password,
    23.             'job' : job,
    24.             'real_name' : real_name,
    25.             'age' : age
    26.         },
    27.         success: function(d1) {
    28.             if (d1=='')
    29.             {
    30.                 $(location).attr('href','reg _succes.php');
    31.             }
    32.             else
    33.             {
    34.                 alert(d1);
    35.             }
    36.         }
    37.     });
    38. });
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    гуглить по formdata и из примеров надёргаешь пару строк - хватит.
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Или пользуйте jQuery Form, он умеет ajax-ом файлы отправлять без возни дополнительной