Вопрос № 66014: Приветствую Вас, Уважаемый Эксперт. Никто иной кроме Вас не может дать мне ответ таким образом, чтобы было доступно и понятно.
Для того чтобы много раз Вас не отвлекать, я накопил несколько вопросов и сейчас изложу их суть (попытаюсь понятно...
Вопрос № 66.014
Приветствую Вас, Уважаемый Эксперт. Никто иной кроме Вас не может дать мне ответ таким образом, чтобы было доступно и понятно.
Для того чтобы много раз Вас не отвлекать, я накопил несколько вопросов и сейчас изложу их суть (попытаюсь понятно и в полном объеме).
Вопрос #1: Существует страница с формой Form.php и файл, обрабатывающий его Form_exe.php (Условие: форма передает параметры методом POST, т.е. скрыто). Предположим пользователь не заполнил обязательные поля или какое-то поле заполнил неправильно (предположим Имя такое уже имеется в БД MySQL), вопрос: как вернуться обратно на форму Form.php, чтобы поля были заполнены той же информацией, которую заполнял пользователь, а так же чтобы были выделены ошибки? (как например при регистрации нового пользователя) (как
сделать такм образом чтобы параметры не передавались обратно явным образом);
Вопрос #2: Та же самая ситуация как и в #1 вопросе, но в форме присутствует элемент File (например для загрузке фотографии), вопрос: как проверить что пользователь выбрал файл?, в противном случае опять вернуть его на Form.php с заполненными данными для выбора файла;
Вопрос #3: Немножко иная ситуация чем #2 вопрос, а именно: пользователь выбрал какой-то файл, все остальное тоже заполнил, но Имя которое он ввел в форме - имеется в БД, вопрос: нада вернуть его, как обычно, на Form.php, но чтобы не надо было снова выбирать файл;
Вопрос #4: Предположим что наш пользователь все сделал правильно, вопрос: как произвести загрузку файла на сервер в определенную папку, предположим Pic.
Вопрос #5: относится к вопросу #4, а именно:
а) как проверить что файл не больше 512 Кб (иначе не добавлять запись в БД, а перенаправить с ошибкой и данными на Form.php)
б) предположим что файл с таким именем в папке Pic уже существует: как его сохранить с таким именем, которого еще нету в папке Pic.
в) расскажите с какими ошибками (по поводу загрузки файла)я не учел и могу столкнуться (это по желанию :) для самых опытных);
Вопрос #6: пользователь, когда-то загрузивший свою фотографию на сайт, решил ее поменять, как это можно реализовать (я так пологаю что запись в БД нужно обновить, загрузить новую фотографию, только как это делается).
Вопрос #7: в дополнение к #6 вопросу, предположим пользователь просто поменял себе Имя, а фотографию не менял (но поле то имеется), вопрос: как сделать обновление в БД, но не менять фотографию и не загружать "пустоту :)"
Об этом много пишут в интернет-статьях, но там все так сложно и непонятно. Поэтому вся надежда только на тебя Эксперт!!!.
Отвечает: PVS
Здравствуйте, Александр (Akylenok[eXZ])!
1-3. Для возврата назад используйте JavaScript. Подсветка ошибок не получится, зато значения не будут передаваться.
4, 5б. Файл загружается во временную папку и уже Ваш скрипт должен переписывать его куда надо и под каким надо именем
5а размер файла указан $_FILE['имя_поля_формы']['size']
6,7 $sql="update user set username='".addslashes($newname)."' where username='".addslashes($oldname)."'";
7. Если пользователь не указывал файла ничего не будет загружено - ничего не обрабатывайте, и, соответственно, пустота не появится. Если происходит не обновление, а добавление пользователя, то его стоит разделить на два варианта: с картинкой и без картинки. Или по другому: вставка всего кроме картинки, а для картинки - обновление свежевставленой записи (если картинки нет - оно не происходит)
Ответ отправил: PVS (статус: Специалист)
Ответ отправлен: 08.12.2006, 10:45 Оценка за ответ: 5 Комментарий оценки: эхх... побольше бы кода чтобы наглядно увидеть как ето все делается, а так то в теории я это все понимаю, а с Java я вообще не знаком. Но всеравно спасибо за отве.
Отвечает: HookEst
Здравствуйте, Александр (Akylenok[eXZ])!
Попробую и я ответить.
и см. пример
#1. >>(как сделать такм образом чтобы параметры не передавались обратно явным образом)
это не совсем понял, а по остальному
- можно использовать что-нибудь вроде AJAX, для проверки данных без перезагрузки страницы, но проще,
наверное, формировать форму из шаблона, где сообщения, значения полей, указатели ошибки устанавливаются в
зависимости от отправленных данных. В примере у меня -это функция outform($msg='',$name='',$pwd='',$err=0).
#2. Если файл не выбран то $_FILES['userfile']['tmp_name']=='',
$_FILES['userfile']['size']==0,
$_FILES['userfile']['error']==4.
и можно опять вывести форму outform('Не выбран файл',$name,$pwd,3)
#3. Если бы это было возможно, всякие жулики могли бы накачать себе любые файлы. Юзер должен КАЖДЫЙ раз сам
выбирать файл, какой считает нужным.
#4. используйте move_uploaded_file, см. пример.
#5.
а) можно в форме явно указать MAX_FILE_SIZE(<INPUT type=hidden name=MAX_FILE_SIZE value=512000> - ПЕРЕД
<INPUT type=file ... ), тогда большие файлы даже не будут пытаться скачиваться, а если уж скачался - можно
проверить $_FILES['userfile']['size'];
б) если файл для каждого юзера 1 то можно генерить имя файла на основе userID
('logo_'.$uID.'.jpg','face_'.$uID.'.jpg'), или просто подбирать:
$fname=rand(1,getrandmax()).'_0.jpg';
$i=0;
while(file_exists($fname))
$fname=rand(1,getrandmax()).'_'.(++$i).'.jpg';
в) касаемо копирования - move_upload_file - достаточно безопасная функция, а так смотрите только чтоб
загруженные файлы не могли исполнятся из той директории куда Вы их складываете.
#6. В БД Вы храните, я так понял имя файла? В БД ничего менять не нужно, только новый загружаемый файл
копируйте(move_uploaded_file) с тем же именем, как в БД, move_uploaded_file перезапишет его на место старого.
#7.
различайте юзеров в БД не по именам, которые каждый сможет менять когда захочет, а по первичному ключу,
обычно auto_increment, тогда просто:
UPDATE `users` SET `name`=NEW_NAME WHERE `id`=USER_ID
и поменяется только то что нужно , остальное останется по старому.
Приложение:
Ответ отправил: HookEst (статус: 9-ый класс)
Ответ отправлен: 08.12.2006, 11:03 Оценка за ответ: 5 Комментарий оценки: Огромное спасиба, замечательный ответ. Остается его тока осмыслить :). Если у меня вдруг появятся вопросы, я к Вам еще обращусь :) оки.
Отвечает: Барков Илья Андреевич
Здравствуйте, Александр (Akylenok[eXZ])!
№ 1,2
Надо просто отправку данных сделать не на form_exe.php а на саму form.php.
Пример файла форм.пхп в приложение.
№ 3. именно выбирать? - это в приложени уже есть.
Или закачивать? если закачивать - можно в сессии хранить параметр о том, что файл уже закачен и его повторной загрузки не надо делать.
НО. для этого надо зарегистрировать его в БД с пометкой, что он не привязан к зарегеному пользователю (ведь пользователь ещё не зарегился, а файл уже загрузил) ну а в сессии можно хранить ID файла (уникальный идентификатор в базе данных), затем, когда пользователь нормаьлно зарегистрируется - привязать к нему файл.
кода много лень тут писать, пиши в персональные если надо.
№ 4,5 как уже писалось выше, прочитайте примеры использования функции move_uploaded_file.
http://phpclub.ru/detail/article/upload вот статья про это
№ 6,7 - рекомендую побольше углубиться в изучение MySQL и задать эти вопросы в соответствующем разделе на RusFAQ :)
А вообще - все привязки в базе данных надо делать по уникальным идентификаторам (ID);
пример структуры базы данных смотрите в приложение.
Удачи!
Приложение:
Ответ отправил: Барков Илья Андреевич (статус: 5-ый класс)
Ответ отправлен: 11.12.2006, 13:28