|
|
|
| Здравствуйте уважаемые знатоки! У меня есть база студентов в котором хранятся информация о студенте и его курсовой работе(и сам док файл). Вопрос У меня добавляется текстовая информация, но хотел бы при добавлении записи добавить форму добавления файла и id файла прикрепить к этому студенту, чтобы потом преподаватель могу скачать. Как это организовать?
Пр: форма добавления записи add_work.php
Введите ФИО студента:
Дата добавления:
Руководитель:
и.т.д
и в конце
Загрузить работу:Здесь уже должна выводиться форма загрузки файла.
И если вам лень писать хотя бы выложите адрес какой нибудь статьи, урока, видео по этой теме.
За ранее благодарен! | |
|
|
|
|
|
|
|
для: Мичил
(19.05.2013 в 17:09)
| | Вам же уже отвечали на такой вопрос, и давали ссылку на скрипт загрузки файла на сервер http://softtime.ru/scripts/upload.php. Используйте для начала его. По приему файла, именуйте закачиваемый файл, например, по id студента в базе. Можно и по иному, но указывая в записи студента имя сформированное сервером для прикрепленного файла.
Начинайте писать код, а уж с тем что получилось, и если не работает, сюда, тогда и ответ по конкретному будет. | |
|
|
|
|
|
|
|
для: confirm
(19.05.2013 в 17:15)
| | Благодарю! | |
|
|
|
|
|
|
|
для: Мичил
(19.05.2013 в 17:56)
| | Здравствуйте! Я сделал загрузку и закачку файлов, все получилось! Но вот опять вернусь к вопросу как прикрепить файл к определенной записи. Напр. у меня две таблице MySQL: registr и files.
В таблице registr у меня описание работы студента автор работы и.т.д. и строка file типа int для связки с таблицей files, а в таблице files есть id файла, и adress файла для скачивания. Как организовать связь между таблицами чтобы при добавлении новой работы студента смог сразу прикрепить к нему файл, чтобы потом между таблицами строки id таблицы files и строка file таблицы registr совпадали? | |
|
|
|
|
|
|
|
для: Мичил
(21.05.2013 в 16:55)
| | >а в таблице files есть id файла, и adress файла для скачивания.
В этой таблице должны быть поля:
id (ключ PRIMARY, AUTO_INCREMENT) - id файла
uid - id студента из первой таблицы для связи с таблицей файлов
name - оригинальное имя загруженного файла, так как не факт, что они обязательно всегда будут иметь разные имена, и отдавать файл лучше по оригинальному имени (все еще зависит от того, как вы хотите их отдавать - прямой ссылкой или скриптом)
adress файла для скачивания - это уже опционально, по надобности, если файлы отдавать скриптом, то этого не нужно
В зависимости от организации структуры файлов (папка/файл) зависит именование их. Но при любом раскладе всегда подойдет именование по id. Если загрузили файл, и загрузка прошла успешно, то прежде чем его сохранять, вы добавляете запись о добавленном файле в таблицу файлов, указывая в нем id студента и оригинальное имя файла. После чего получаете id последней сформированной записи в таблице функцией mysql_insert_id(), и под этим id сохраняете загруженный файл. Временно (до операции записи в таблицу файлов) загруженный файл можно хранить в сессии, а после получения id и именования его по этому id сохранять уже в директорию.
Таким образом - id записей таблицы файлов указывает на имя под которым он сохранен, а uid на студента, которому он принадлежит. | |
|
|
|
|
|
|
|
для: confirm
(21.05.2013 в 17:42)
| | Тогда загрузку файлов и регистр записи по отдельной форме делать или как. Например: Сначала Регистрация работы студента потом id студента занести в массив _SESSION потом на след странице сделать загрузку файла с присвоением id студента, или все это можно организовать в одной странице, просто у меня не получается загрузку файлов и регистр студентов обработать одной кнопкой "Занести в базу". | |
|
|
|
|
|
|
|
для: Мичил
(22.05.2013 в 14:17)
| | Что такое "регистрация работ" и "регистр студента"?
У вас возможно всего два варианта:
1) Студенты не регистрируются, и загружать информацию о себе и свои работы могут все.
2) Загрузка работ возможна только для зарегистрированных на сайте студентов.
В первом случае, загрузка формы, это ведь не только файл, но еще и данные студента, которые необходимо проверять. А проверка предполагает, что возможны ошибки, и при их наличии форму нужно будет возвращать. Если при этом загружался и файл, и загрузка прошла нормально (нет ошибок, соблюдены условия), то незачем заставлять пользователя загружать его вновь - возвращается только форма для исправления ошибок в данных.
Все это время загруженный файл "ждет" в сессии, в которой хранится вся информация о нем, которая в последствии может быть нужна.
Если при загрузке не было ошибок в данных, то загруженный файл все равно "ждет" в сессии, а данные о пользователе заносятся в таблицу пользователей, и сразу после этого запроса вам будет известен id добавленного студента, который заносится в таблицу о файлах, куда сразу помещают и информацию о файле. После этого можно узнать сформированный id это записи, и сохранить файл из сессии под этим id как именем.
Во втором случае id студента уже известно, и оно должно передаваться в форме - поэтому запись требуется только в таблицу файлов: id студента из формы, оригинальное имя файла (и т.п.), ну а после вставки этой записи также как и в первом случае.
Именовать файлы при загрузке по id записи не обязательно, способов много, это зависит в первую очередь как у вас организовано хранение этих файлов - каталоги, каким способом они будут отдаваться пользователям. Если имя не привязано к id записи, и формируется сразу при загрузке, то это имя заносится и в таблицу, сразу.
Сессия выбрана для того, чтобы в случае ошибки, или иных обстоятельствах, когда файл загружен, а собственно данные не занесены, не сканировать потом каталог на наличие "висячих" файлов. Сессия удаляется мусорщиком, а значит при ошибках не будет "висяков". | |
|
|
|
|
|
|
|
для: confirm
(22.05.2013 в 15:07)
| | <?php
if (isset($rabota) && isset($meta_d) && isset($meta_k) && isset($date) && isset($description) && isset($text) && isset($author)&& isset($img)&& isset($vid))
{
/* Здесь пишем что можно заносить информацию в базу */
$result = mysql_query ("INSERT INTO registr (rabota,meta_d,meta_k,date,description,text,author, mini_img, vid) VALUES ('$rabota', '$meta_d','$meta_k','$date','$description','$text','$author','$img','$vid')");
if ($result == 'true') {
$name = $_FILES["filename"]["name"];
$id = mysql_insert_id();
if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
{
// Если файл загружен успешно, перемещаем его
// из временной директории в конечную
$uploadfile = "img/".$_FILES['filename']['name'];
move_uploaded_file($_FILES["filename"]["tmp_name"], $uploadfile);
} else {
echo("Ошибка загрузки файла");
}
mysql_query ("INSERT INTO files (uid, name) VALUES ('$id','$name')");
echo "<p>Ваша работа успешно добален!</p>";}
else {echo "<p>Ваша работа не добалена!</p>";}
}
else
{
echo "<p>Вы ввели не всю информацию, поэтому работа в базу не может быть добавлен.</p>";
}
?>
//Я хочу сохранить файл именно в категорию /img который у меня находиться U:\home\localhost\www\online-uchet\img , но почему то после занесения данных он сохраняет U:\home что то не так написано в коде? | |
|
|
|
|
|
|
|
для: Мичил
(24.05.2013 в 17:43)
| | если почитать мануал по функции isset, то вот эту конструкцию
if (isset($rabota) && isset($meta_d) && isset($meta_k) && isset($date) && isset($description) && isset($text) && isset($author)&& isset($img)&& isset($vid))
|
можно сократить раза в 2 | |
|
|
|
|
|
|
|
для: psychomc
(24.05.2013 в 18:00)
| | спасибо, а по теме сможете что нибудь сказать? | |
|
|
|
|
|
|
|
для: Мичил
(24.05.2013 в 18:04)
| | попробуйте $_SERVER["DOCUMENT_ROOT"] | |
|
|
|
|
|
|
|
для: Мичил
(24.05.2013 в 17:43)
| | Во-первых не видно обработки данных перед внесением их в базу, вы их делаете?
Во-вторых - строковые значения должны обрамляться кавычками в запросе.
В третьих - не видно работы над ошибками.
В четвертых, и я уже не раз говорил - гарантии того, что все имена фалов будут разные нет, а вы их сбрасываете в одну папку, под именами пользователей. А что происходит с файлом, если в каталог помещается файл с таким же именем? Вы же не под Widows копируете их, все это "вслепую" происходит и окошечка "Переименовать..., и т.п...." вы не получите. | |
|
|
|
|
|
|
|
для: confirm
(24.05.2013 в 18:29)
| | <td valign="top">
<form name="form1" method="post" action="add_work.php" enctype="multipart/form-data">
<p>
<label>Введите название работы<br>
<input type="text" name="rabota" id="rabota">
</label>
</p>
<p>
<label>Введите краткое описание работы<br>
<input type="text" name="meta_d" id="meta_d">
</label>
</p>
<p>
<label>Введите ключевые слова для работы<br>
<input type="text" name="meta_k" id="meta_k">
</label>
</p>
<p>
<label>Введите дату добавления работы<br>
<input name="date" type="text" id="date" value="<?php $date = date("Y-m-d"); echo $date;?>">
</label>
</p>
<p>
<label>Ведите краткое описание работы с тэгами абзацев
<textarea name="description" id="description" cols="40" rows="5"></textarea>
</label>
</p>
<p>
<label>Введите полный текст работы с тэгами
<textarea name="text" id="text" cols="40" rows="20"></textarea>
</label>
</p>
<p>
<label>Введите автора работы<br>
<input type="text" name="author" id="author">
</label>
</p>
<p>
<label>Введите где лежит миниатюра<br>
<input type="text" name="img" id="author">
</label>
</p>
<p>
<label>Выберите категорию работы<br>
<select name="vid">
<?php
$result = mysql_query("SELECT title,id FROM vid",$db);
if (!$result)
{
echo "<p>Запрос выборки не прошел. Напишите об этом администратору nidheg91@mail.ru <br> <strong>Код ошибки:</strong></p>";
exit(mysql_error());
}
if (mysql_num_rows($result)>0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("<option value='%s'> %s</option>",$myrow["id"],$myrow["title"]);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
echo "<p>В таблице нет записей.</p>";
exit();
}
?>
</select>
</label>
</p>
<p>
<label>Загрузка файла работы</label><br>
<input type="file" name="filename"><br>
</p>
<p>
<label>
<input type="submit" name="submit" id="submit" value="Занести работу в базу">
</label>
</p>
</form>
</td>
</tr>
</table></td>
</tr>
//вот это форма занесения данных new_work.php, потом через POST летит add_work где я выложил выше, там текстовые записи успешно сохраняются, загрузка файлов тоже не выдает никаких ошибок, но вот при загрузке файл вообще не сохраняется или копируется там где не надо. Это вообще глюки из за того что я впихал одни и те же файлы несколько раз в одну директорию?
А насчет связки между таблицами files и registr решил так:
Где идет обработка то есть add_work.php $id = mysql_insert_id() узнаю id сохраняемой записи таблицы registr, и заношу полученную переменную $id в таблицу files строка uid, тем самым знаю кому принадлежит этот файл, надеюсь я в правильном пути=) | |
|
|
|
|
|
|
|
для: Мичил
(24.05.2013 в 18:50)
| | 1) Код нужно обрамлять в теги [сode][/сode], иначе такой ужас как сейчас очень сложно воспринимать. В нем разбираться просто не охота.
2) Не может быть строка не обрамленная в кавычки занесена в текстовое поле таблицы - будет ошибка, а не добавление!
3) Все что приходит от пользователя нужно тщательно проверять.
4) Входные данные перед внесением в базу необходимо обрабатывать, иначе взломать вашу базу как два пальца...
5) Я не знаю на каком вы пути, но если студент Коля назовет свой файл "Моя клевая работа", загрузит его, а потом студент Ваня также назовет свой файл и загрузит, то "клевая работа" Коли пропадет. И как бы вы там не ссылались на файл, его не будет.
Так код не пишут. Не можете задавать вопросы себе и отвечать на них в процессе написания кода (мало опыта, не видите задачу целиком и т.п.) , ну порисуйте карандашом в тетради блок-схему задачи, отметьте все вопросы, укажите пути их ветвления.
Вы просто засучили рукава, с малым багажом знаний в данном вопросе что-то написали - что-то делается, значит так и должно. Нет не так. | |
|
|
|
|
|
|
|
для: Мичил
(24.05.2013 в 18:50)
| |
<form name="form1" method="post" action="add_work.php" enctype="multipart/form-data">
<label>Введите название работы</label>
<input type="text" name="rabota" id="rabota"><br>
<label>Введите краткое описание работы</label>
<input type="text" name="meta_d" id="meta_d"><br>
<label>Введите ключевые слова для работы</label>
<input type="text" name="meta_k" id="meta_k"><br>
<label>Введите дату добавления работы</label>
<input name="date" type="text" id="date" value="<?= date("Y-m-d"); ?>"><br>
<label>Ведите краткое описание работы с тэгами абзацев</label>
<textarea name="description" id="description" cols="40" rows="5"></textarea><br>
<label>Введите полный текст работы с тэгами</label>
<textarea name="text" id="text" cols="40" rows="20"></textarea><br>
<label>Введите автора работы</label>
<input type="text" name="author" id="author"><br>
<label>Введите где лежит миниатюра</label>
<input type="text" name="img" id="author"><br>
<label>Выберите категорию работы</label>
<select name="vid">
<?php
$sql = "SELECT id, title
FROM vid";
$res = mysql_query($sql) or die("Запрос выборки не прошел. Напишите об этом администратору nidheg91@mail.ru" . mysql_error());
if(mysql_num_rows($res))
{
while(list($id,$tit) = mysql_fetch_array($res, MYSQL_ASSOC))
{
echo '<option value='.intval($id).'>'.htmlspecialchars(stripcslashes($tit), ENT_QUOTES).'</option>';
}
}
else echo 'В таблице нет записей.';
?>
</select><br>
<label>Загрузка файла работы</label>
<input type="file" name="filename"><br>
<input type="submit" name="submit" id="submit" value="Занести работу в базу">
</form>
|
файл add_work.php
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// собераем ощибки в массив;
$error = array();
// проверяем заполненеы ли все поля;
if(empty($_POST['rabota'])) $error[] = 'Поле работа не заполнена.';
if(empty($_POST['meta_d'])) $error[] = 'Поле ... не заполнена.';
if(empty($_POST['meta_k'])) $error[] = 'Поле ... не заполнена.';
if(empty($_POST['date'])) $error[] = 'Поле ... не заполнена.';
if(empty($_POST['description'])) $error[] = 'Поле ... не заполнена.';
if(empty($_POST['text'])) $error[] = 'Поле ... не заполнена.';
if(empty($_POST['author'])) $error[] = 'Поле ... не заполнена.';
if(empty($_POST['img'])) $error[] = 'Поле ... не заполнена.';
if(empty($_POST['vid'])) $error[] = 'Поле ... не заполнена.';
// если нет ощибок;
if(empty($error))
{
// это функция вернет защищенную данную
function save($val) { return mysql_real_escape_string($val);}
// добаляем;
$sql = "INSERT INTO register(rabota,meta_d,meta_k,date,description,text,author,mini_img,vid)
VALUES('".save($_POST['rabota'])."','"
.save($_POST['meta_d'])."','"
.save($_POST['meta_k'])."','"
.save($_POST['date'])."','"
.save($_POST['description'])."','"
.save($_POST['text'])."','"
.save($_POST['author'])."','"
.save($_POST['img'])."','"
.save($_POST['vid'])."')";
$res = mysql_query($sql) or die("Ощика добавление записьи в таблицу! " . mysql_error());
$ID = mysql_insert_id();
if(is_uploaded_file($_FILES['filename']['name']))
{
move_uploaded_file($_FILES['filename']['name'], "img/" . $_FILES['filename']['name']);
}
else echo 'Ошибка загрузки файла';
$sql = "INSERT INTO files(uid,name)
VALUES('".save($ID)."','".save($_FILES['filename']['name'])."')";
$res = mysql_query($sql);
if(!$res) die("Ваша работа не добалена!" . mysql_error());
else echo 'Ваша работа успешно добален!';
}
else
{
// выводим ощибки;
foreach($error as $err) echo $err . '<br>';
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Jovidon
(25.05.2013 в 03:36)
| | Плохо. | |
|
|
|
|
|
|
|
для: confirm
(25.05.2013 в 05:00)
| | почему? | |
|
|
|
|
|
|
|
для: Jovidon
(25.05.2013 в 10:05)
| | Почему? Потому, что все у вас живет собственной жизнью - форма сама по себе, ошибки сами по себе, а добавление в базу, так это просто так, мелкая досада, которую надо выполнять.
Представьте, что я вам в рамках этого форума все время буду писать - "Вы плохой мальчик", а у вас нет никакой возможности ответить, читаете, а возразить никак... Обидно, досадно, не справедливо... Так ведь? Вот тоже самое и вы пишите.
Я обычный человек, я имею право на ошибку, и если я допущу ошибку при заполнении формы, то конечно спасибо вам за то что известили об этом, но почему вы не даете мне права ее исправить? Толку от ваших сообщений мне нет никакого.
Форма - это в первую очередь диалог, а все остальное, это прилагательное к ней. Это как два сапога - они обязательно должны быть парой и иметь хозяина. А у вас и сапоги разбросаны, и хозяина у них нет. | |
|
|
|
|
|
|
|
для: confirm
(25.05.2013 в 10:28)
| | ок
спас, я больше не буду отвечать на вапросы, а только задавать вапрос в этом сайте | |
|
|
|
|
|
|
|
для: Jovidon
(25.05.2013 в 10:38)
| | Я вам не запрещаю отвечать на вопросы, но отвечая на них, думайте. Ведь вы пошли на поводу у автора. Можете ответить по какой причине и вы разделили форму и ее обработку на два файла? Во-первых зачем это, а во-вторых почему они не связаны диалогом?
А это уже ваше произведение:
<?
if(empty($_POST['rabota'])) $error[] = 'Поле работа не заполнена.';
if(empty($_POST['meta_d'])) $error[] = 'Поле ... не заполнена.';
if(empty($_POST['meta_k'])) $error[] = 'Поле ... не заполнена.';
//.....
| А если бы было полей 50, вы бы всех их так и перечисляли? А зачем, и зачем вообще empty()? С трудом верится, что вы до сих пор не знаете, что форма, это массив, и в данном случае это простой массив, одномерный. А если это массив, значит в нем можно сразу очистить пустые поля, и получить таковые, и если они есть, вывести ошибку только для них, не перечисляя все.
Ну а это для сведения. На дворе HTML5, а так как форма, это очень важный элемент диалога сервер-клиент, то этому элементу в рамках HTML5 уделено большое внимание. Ранее для предупреждения пользователя приходилось писать портянки на JS, теперь очень многое берет на себя браузер:
<style>
input:required {
border: 1px solid red;
}
</style>
<form>
<div>Фамилия <input type="text" name="surname" required="required" pattern="^[А-Яа-яЁё\-]{1,32}$" /></div>
<div>Email <input type="email" name="mail" required="required" /></div>
<div>Аська <input type="text" name="icq" pattern="^\d{9}$" /></div>
<button>Отправить</button>
</form>
| При этом старые браузеры будут воспринимать неизвестные им типы полей как поле типа text. Но современные браузеры уже будут представлять первую линию обороны и выполнять сервисные услуги - забыли, ошиблись, так будьте так ласка, поправьте. Попробуйте отправить эту форму в разных "режимах обмана".
На дворе HTML5, а на серверах > РНР5. А у него много чего добавлено позволяющее производить проверку формы, причем делать это так, что это будет единая точка входа для обработки всех без исключения форм применяемых на сайте, достаточно только описать форму и условия, все остальное автоматом.
Но все это так и будет забавой, если не будет главного - диалога с пользователем. | |
|
|
|
|
|
|
|
для: confirm
(25.05.2013 в 11:03)
| | Ясно, тогда кроме проверки на существование отправленных переменных надо и еще проверять на недопустимые символы? Я правильно вас понял?) | |
|
|
|
|
|
|
|
для: Мичил
(25.05.2013 в 16:22)
| | Ну как вам сказать - нет стандарта, который бы говорил или обязывал что-то принимать, что-то нет, какие-то символы считать допустимыми, а какие-то нет. Вы и только вы определяете:
какие поля формы (какие данные) пользователь должен заполнить обязательно, а какие могут быть и опущены; какие символы разрешены в тех или иных полях, а какие нет. Например, если ваши студенты все русскоязычные и имеют русские имена и фамилии, то зачем же тогда в полях имен принимать латиницу, и вообще что непопадя?
Конечно необходимо проверять и убирать мусор, то есть не принимать его. При чем форма в примере, паттерны ее полей, это только на клиенте проверка, но ее же можно и обойти, написав такую форму и отсылая ее не с вашей страницы. И не надейтесь на проверку referer в таком случае, его можно тоже подделать. Поэтому, несмотря на то, что на клиенте есть проверка, нужно проверять обязательно и на сервере. На клиенте проверку можно считать только сервисом, не более.
http://htmlbook.ru/html5
У вас самого главного нет, у вас нет диалога с пользователем. | |
|
|
|
|