RFpro.ru: Программирование на PHP

  Все выпуски  

RusFAQ.ru: Программирование на PHP


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / PHP

Выпуск № 540
от 13.12.2006, 09:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 390, Экспертов: 48
В номере:Вопросов: 1, Ответов: 3


Вопрос № 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 вопросу, предположим пользователь просто поменял себе Имя, а фотографию не менял (но поле то имеется), вопрос: как сделать обновление в БД, но не менять фотографию и не загружать "пустоту :)"

Об этом много пишут в интернет-статьях, но там все так сложно и непонятно. Поэтому вся надежда только на тебя Эксперт!!!.
Отправлен: 07.12.2006, 21:52
Вопрос задал: Александр (Akylenok[eXZ]) (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное