Здравствуйте. Столкнулся с проблемой того, как правильно загрузить в определенную директорию аватар, а затем, получив путь к нему, прописать его в соответствующем столбце в базе данных. Может кто с этим помочь? Сейчас на месте авы стоит простая картинка, прописанная через <img> Вот файл, в котором вся регистрация происходит PHP: <?php if (isset($_POST['login'], $_POST['password'], $_POST['email'])) { // Данные для mysql сервера $dbhost = "localhost"; // Хост $dbuser = "root"; // Имя пользователя $dbname = "copyright"; // Имя базы данных // Подключаемся к mysql серверу $link = mysql_connect($dbhost, $dbuser); //Указываем кодировку для подключения к базе mysql_set_charset("utf8"); // Выбираем нашу базу данных mysql_select_db($dbname, $link); // Добавляем запись в нашу таблицу customer // т.е. делаем sql запрос $login = mysql_real_escape_string(mb_substr(htmlspecialchars(trim($_POST['login'])), 0, 1000, 'UTF-8')); $password = mysql_real_escape_string(md5(mb_substr(htmlspecialchars(trim($_POST['password'])), 0, 1000, 'UTF-8'))); $email = mysql_real_escape_string($_POST['email']); $age = mysql_real_escape_string(mb_substr(htmlspecialchars(trim($_POST['age'])), 0, 1000, 'UTF-8')); $real_name = mysql_real_escape_string(mb_substr(htmlspecialchars(trim($_POST['real_name'])), 0, 1000, 'UTF-8')); $job = mysql_real_escape_string(mb_substr(htmlspecialchars(trim($_POST['job'])), 0, 1000, 'UTF-8')); $status ="user"; if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { exit("E-mail указан не верно."); } $query ="Insert Into users(login, password, email, age, job, real_name, status) values('$login', '$password', '$email', '$age', '$job', '$real_name', '$status')"; mysql_query($query) or die (mysql_error()); mysql_close(); } else { exit ("Ошибка!"); } Вот форма: HTML: <form method="POST" id="reg_form" action="php/reg_php.php" onsubmit="return false" enctype="multipart/form-data"> <label>Введите ваш логин: <input type="text" id="login" name="login" size="30"> <span id="msgbox" style="display:none"></span> <br><br> </label> <label>Введите ваш e-mail:<input type="text" id="email" name="email" size="30"> <span id="msgbox_email" style="display:none"></span> <br><br> </label> <label>Введите ваш пароль: <input type="password" name="password" size="30"><br><br> </label> <label>Введите ваш возраст: <input type="text" name="age" size="30"><br><br> </label> <label>Введите ваше реальное имя:<input type="text" name="real_name" size="30"><br><br> </label> <label>Введите ваш род деятельности: <input type="text" name="job" size="30"><br><br> </label> <label>Выберите ваш аватар:<input type="file" name="avatar" size="30"><br><br> </label> <center> <input type="submit" value="Зарегистрироваться"> <input type="reset" value="Очистить поля"> </center> </form> В таблице users есть поле для пути к файлу аватарки - avatar.
Я не знаю каким образом мне поместить изображение в каталог images/avatar, а затем получить этот путь и записать его в соответствующий столбец базы данных. При это, желательно, уменьшить изображение до 100х100
ну... стоит начать с разбивки задачи на маленькие шаги. Например - почитай про работу с файлами https://php.ru/manual/features.file-upload.post-method.html
Добавил в свой файл вот такой код: PHP: $uploaddir = ''; $uploadfile = $uploaddir . basename($_FILES['avatar']['name']); if (move_uploaded_file($_FILES['avatar']['tmp_name'], $uploadfile)) { echo "Файл корректен и был успешно загружен.\n"; } else { echo "Возможная атака с помощью файловой загрузки!\n"; } Но оно мне выдает ошибку "Undefined index: avatar in ...." Может ли это быть связано с тем, что к форме прикручен ajax-запрос на отправку данных в БД? И, я так понимаю, переменная $uploaddir отвечает за директорию, в которую будет загружен файл?
не каждая форма может отравить файл. Нужно указать еще тип отправляемых данных. --- Добавлено --- HTML: <form method="POST" enctype="multipart/form-data" action="куда">
Да! а у тебя пустые кавычки. Можно указать относительный путь. И файл нужно переименовать, а не сохранять с оригинальным именем. Как ты потом его идентифицируешь? имя файла должно быть типа "34_ava.jpg", где 34 - ID пользователя. перед этим желательно проверить расширение файла и сохранить его в переменную, например, $rassh. И тогда конечное имя фала будет: Код (Text): $filename = "$UserId"."_ava.".$rassh итого Код (Text): $uploadfile=$uploaddir.basename($_FILES['avatar']["$filename"]); // переменная в ключе массива в двойных кавычках! а если ты еще и несколько файлов одного пользователя будешь хранить, то нужно еще проверять есть ли файл с таким именем. И действовать как считаешь нужным. либо удалять старый файл, либо называть текущий как то иначе. Например, "34_ava_1.jpg", "34_ava_2.jpg" и т. д.
Это у меня есть. --- Добавлено --- Это я знаю. Я собирался имени файла присваивать логин пользователя. Ну или, как вы указали, ID. Но это все потом, мне сначала надо как-то с загрузкой разобраться, чтобы эта ошибка исчезла.
Перед тем как использовать обращение к элементам массива по ключу, следует заранее удостовериться в существовании такого ключа в массиве, ситуацию исправит условие перед использованием массива с файлом Код (Text): if(isset($_FILES['avatar'])){ /* работаем*/ }else{ /* Файла не было*/}
Так это, по сути, роли не играет... Он в корень ведь скинет изображение и все. Это уже проверено, на отдельной форме. Только вот на этой он работать не хочет --- Добавлено --- Да, файла нет...
Код (Text): <input type="file" name="avatar" size="30"> size="30" - файл не более 30 БАЙТ. ворт где проблема.
если все остальные элементы формы передаются а этот нет, то либо мы имеем дело с полтргейстом, либо нужно искать ошибки в коде. Типа профтыкал кавычку, профтыкал регистр и т. п.
Убрал ajax и теперь действительно что-то происходит. var_dump выводит следующее: Код (Text): Файл корректен и был успешно загружен. 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): $("#reg_form").submit(function() { var login = $('#reg_form input[name="login"]').val(), email = $('#reg_form input[name="email"]').val(), job = $('#reg_form input[name="job"]').val(), real_name = $('#reg_form input[name="real_name"]').val(), age = $('#reg_form input[name="age"]').val(), password = $('#reg_form input[name="password"]').val(); if (login == '' || email == '' || password == '' || age == '' || real_name == '' || job == '') { alert('Вы не заполнили все необходимые поля'); return; } $.ajax({ type: "POST", url: "php/reg_php.php", data: { 'login' : login, 'email' : email, 'password' : password, 'job' : job, 'real_name' : real_name, 'age' : age }, success: function(d1) { if (d1=='') { $(location).attr('href','reg _succes.php'); } else { alert(d1); } } }); });