|
|
|
| Подскажите, пожалуйста, алгоритм формы сохранения новости (статьи и т.п.), вместе с ссылкой на изображение, т.е. путем к картинке в БД.
Сейчас я сохраняю новость с помощью двух файлов на одном форма с полями новости, другой файл - это обработчик, который выполняет команду вставки новости в базу.
Как мне вытащить путь к файлу ? Т.е. сначала я загружаю картинку, принимаю её путь в какое-то поле(переменную), а затем оттуда, уже месте с другими параметрами(новости) принимаю на файле обработчике.
Подскажите, как мне правильно реализовать этот вопрос. Люди, мне нужен алгоритм действий (с кодом сама разберусь), так как я просто запуталась. | |
|
|
|
|
|
|
|
для: kristik.d
(22.01.2010 в 14:59)
| | чуть подробнее распишите задачу, пожалуйста.
какого вида файлы вытягиваете, зачем форма и т.п.
сейчас неясно, к какому файлу путь Вы пытаетесь определить. | |
|
|
|
|
|
|
|
для: Trianon
(22.01.2010 в 15:08)
| | Проект состоит из файлов:
- newslist.php = выводит список новостей
- newsadd.php = форма(action='newsaddo.php') добавления новости с инпутами (дата, название, текст, кнопка сабмит)
- newsaddo.php = обработчик, который принимает значения из массива POST файла newsadd.php
Все работает отлично. После сохранения новости сервер переадресует меня на страницу newsaddo.php, на которое выводится результирующее сообщение об операции вставки новости.
Хочу добавить к каждой новости картинку, для этого добавила еще одно поле(imglink - varchar150) в таблицу news.
Я попробовала сохранение файлов: для этого так же использовала форму, в которой выбирала файл с компьютера, и сохраняла его в определенную папку, т.е. использовала два файла - index.php и upload.php. Все работает, файл сохраняется.
Но я не пойму, как сохранить файл:
- без переадресации на другую страницу
- с сохранением данных, которые пользователь ввел в поля формы добавления новости
- получить путь к файлу, чтобы сохранить вместе с другими полями новости в обработчике newsaddo.php.
Жду помощи. | |
|
|
|
|
|
|
|
для: kristik.d
(22.01.2010 в 14:59)
| | Как пишите, так и делайте - путь к загруженному изображению в базу. Вот только принять форму (новость вместе с изображением), обработать ее, и сохраняить все в базу можно и одним скриптом. Разделять прием текста и изображения от одной и той же фомы, это очень не удобно. | |
|
|
|
|
|
|
|
для: sim5
(22.01.2010 в 15:12)
| | Вы совершенно правы, я тоже так думаю, но запуталась в переменных, в проверках и не пойму, что за чем должно следовать. | |
|
|
|
|
|
|
|
для: kristik.d
(22.01.2010 в 15:36)
| | Форма должна быть одна, файл обработчик формы должен быть один - новость загружается сразу с изображением. Вы разбили задачу на "лоскуты", и сами запутались в них. Примеров скриптов загрузки изображнений и прочего на форуме предостаточно.
Вы сказали, что скрипт вам не нужен, значит напишите сами, а что не получится, тогда уже.... | |
|
|
|
|
|
|
|
для: sim5
(22.01.2010 в 15:53)
| | Получается мне нужно использовать две формы в одном файле newsadd.php. Т.к. сейчас я просто вписываю ссылку, в строку с img, а не выбираю файл, н-р, с компьютера, загружаю на сервер, а затем, получаю ссылку и её отправляю вместе с полями формы новости в обработчик.
<div id="content">
<h4>Добавляем новость</h4>
<form name="add_news" action="newsaddo.php" method="POST" class="news_form">
<p><label for="title" > Введите название </label><br />
<input type="text" id="title" name="title" value="" class="news_imput" /></p>
<p><label for="meta_d" > Краткое описание</label><br />
<input type="text" id="meta_d" name="meta_d" value="" class="news_imput" /></p>
<p><label for="meta_k" > Введите ключевые слова </label><br />
<input type="text" id="meta_k" name="meta_k" value="" class="news_imput" /></p>
<p><label for="date" > Введите дату </label><br />
<input type="text" id="date" name="date" value="<?php $date = date ('Y-m-d'); echo $date;?>"
class="news_imput" /></p>
<p><label for="description" > Введите анонc с тегами абзацев </label><br />
<textarea name="description" id="description" rows="5" cols="80">
</textarea>
</p>
<p><label for="text" > Введите текст новости с тегами абзацев </label><br />
<textarea name="text" id="text" rows="10" cols="80">
</textarea>
</p>
<p><label for="autor" > Введите автора </label><br />
<input type="text" id="autor" name="autor" value="" class="news_imput" /></p>
В этом месте мне необходимо вставить форму, которая будет обрабатываться этим же файлом, но можно ли так делать? Ниже, привожу пример хода моих мыслей.
<form name="upload" enctype="multipart/form-data" action="addnews.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1024*3*1024">
<p>Загрузить файл: <input type="file" name="userfile" size="20" /></p>
<p><input type="submit" value="Послать файл" name="submit" /></p>
</form>
Не могу разобраться в этом моменте.
<p><label for="img" > Введите ссылку, где расположена миниатюра </label><br />
<input type="text" id="img" name="img" value="" class="news_imput" /></p>
<p><label for="category" > Выберите категорию новости </label><br />
<select name="category" id="category">
<?php
include ("inc/connect.php");
$result1 = mysql_query("SELECT id, cat_name FROM category", $db);
if (!$result1) {echo "Запрос не может быть выполнен, произошла ошибка. Код ошибки:<br />";
exit (mysql_error()); /*Останавливаем выполнение функции, т.е. запроса*/
}
if (mysql_num_rows($result1) > 0)
{
$myrow1 = mysql_fetch_array($result1);
do {
printf ("<option value='%s'>%s</option>", $myrow1['id'], $myrow1['cat_name']);
}
while ($myrow1 = mysql_fetch_array($result1));
}
else {
echo "Информация по категориям не может быть извлечена, отсутствуют записи в таблице категорий.";
exit ();/*Останавливаем выполнение запроса*/
}
?>
</select> </p>
<p><input type="submit" value="Занести новость в базу" name="submit" class="news_center" /></p>
</form>
</div>
|
| |
|
|
|
|
|
|
|
для: kristik.d
(22.01.2010 в 16:40)
| | Зачем две формы? Добавьте в первую форму - Загрузить файл: <input type="file" name="userfile" size="20" />, а вторую форму удалить.
newsaddo.php у вас должен:
1. принимать форму, обрабатывать ее поля, проверять есть ли прикрепленное изображение,
2. возвращать форму пользователю при ошибках ввода,
3. при отсутствии ошибок сохранять в базу новость, перемещать (и именовать) изображение в папку, записывая этот путь в базу.
После удачной операции переходить на страницу вывода новостей (вроде бы у вас такое было "желание").
Так как могут быть ошибки ввода, то возращая форму пользователю, нужно поместить в качестве значений ее полей то, что пользователь уже ввел, дабы не заставлять его вводить все заново. Кроме этого, форма ведь выводится и по умолчанию (по первому запросу). От сюда следует, если у вас форма в другом файле, то лучше ее убрать и поместить в этот же файл (newsaddo.php), либо сделать ее подключаемой, но с учетом возврата значений. | |
|
|
|
|
|
|
|
для: sim5
(22.01.2010 в 16:49)
| | Большое спасибо, разобралась. Ниже привожу код, у меня получилось так.
Обращаюсь к Гуру, подкорректируйте мой код.
Еще раз огромное спасибо!
<?php
/*Подключаемся к базе*/
include ("inc/connect.php");
/*Выводим из глобального массива ПОСТ в переменные поля формы, проверяем есть ли пустые поля*/
if (isset ($_POST['title'])) {$title = $_POST['title']; if ($title == '') {unset ($title);}}
if (isset ($_POST['meta_d'])) {$meta_d = $_POST['meta_d']; if ($meta_d == '') {unset ($meta_d);}}
if (isset ($_POST['meta_k'])) {$meta_k = $_POST['meta_k']; if ($meta_k == '') {unset ($meta_k);}}
if (isset ($_POST['date'])) {$date = $_POST['date']; if ($date == '') {unset ($date);}}
if (isset ($_POST['description'])) {$description = $_POST['description']; if ($description == '') {unset ($description);}}
if (isset ($_POST['text'])) {$text = $_POST['text']; if ($text == '') {unset ($text);}}
if (isset ($_POST['autor'])) {$autor = $_POST['autor']; if ($autor == '') {unset ($autor);}}
if (isset ($_POST['category'])) {$category = $_POST['category']; if ($category == '') {unset ($category);}}
if (isset ($_POST['userfile'])) {$userfile = $_POST['userfile']; }
$userfile = $_FILES['userfile'] ['tmp_name'];
$userfile_name = $_FILES['userfile']['name'];
$userfile_size = $_FILES['userfile']['size'];
$userfile_type = $_FILES['userfile']['type'];
$userfile_error = $_FILES['userfile']['error'];
if ($userfile_error > 0)
{
echo 'Проблема: ';
switch ($userfile_error)
{
case 1: echo 'размер файла больше upload_max_filesize'; break;
case 2: echo 'размер файла больше max_file_size'; break;
case 3: echo 'загруженна только часть файла'; break;
case 4: echo 'файл не загружен'; break;
}
exit;
}
$upfile = '../file/'.$userfile_name;
if (is_uploaded_file($userfile))
{
if (!move_uploaded_file ($userfile, $upfile))
{
echo 'Проблема: невозможно переслать файл в каталог';
exit;
}
}
else {
echo 'Проблема: возможна атака, через загрузку файла. Файл: '.$userfile_name;
exit;
}
echo 'Файл успешно загружен.<br /><br />';
$fp = fopen($userfile, 'w');
$contents = fread($fp, filesize($upfile));
fclose($fp);
$contents = strip_tags($contents);
$fp = fopen($userfile, 'w');
fwrite($fp, $contents);
fclose($fp);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Добавление новости</title>
<link href="StyleSheet.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="wrapper">
<?php include ("inc/header.php")?>
<?php include ("inc/left_menu.php")?>
<div id="content">
<?php
/*Проверяем на заполненость полей в форме*/
if (isset($title) && isset($meta_d) && isset($meta_k) && isset($date) && isset($description)
&& isset($text) && isset($autor) && isset($category))
{
/*Здесь пишем код, для занесения информации в базу*/
$result = mysql_query("INSERT INTO news (title, meta_d, meta_k, date, description, text, autor,
min_img, cat) VALUES ('$title', '$meta_d', '$meta_k', '$date', '$description', '$text', '$autor', '$upfile', '$category')");
if ($result == 'true') {echo "<p>Вы успешно добавили новость в базу</p>";}
else {echo "<p>Возникли проблемы при добавлении новости в базу</p>";}
}
else {
echo "<p>Вы не заполнили все поля, поэтому новость не может быть занесена в базу.
Заполните все поля.</p>";
}
?>
</div>
<?php include ("inc/footer.php")?>
</div>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: kristik.d
(22.01.2010 в 17:49)
| | 1. И где же сама форма?
2. if (isset ($_POST['title'])) {$title = $_POST['title']; if ($title == '') {unset ($title);}} и ей подобные записи. Лучше:
<?
$title = isset ($_POST['title']) ? $_POST['title'] : "";
|
А проинициализированные таким образом переменные проверять - на пусто, на другие ошибки....
3. На ваш вывод сообщений, типа 'размер файла больше upload_max_filesize' пользователю сказать вам спасибо? Где возврат формы пользователю при ошибках?
4. Где вообще проверка того, чего вам прислали в форме?
5. Это что такое:
$fp = fopen($userfile, 'w');
$contents = fread($fp, filesize($upfile));
fclose($fp);
$contents = strip_tags($contents);
$fp = fopen($userfile, 'w');
fwrite($fp, $contents);
fclose($fp);
для чего и что пытаетесь сделать?
PS. upload_max_filesize - для пользователя это темный ящик. Нужно указывать какой размер превышен им (в КБ, МБ....), вами установленный. | |
|
|
|
|
|
|
|
для: kristik.d
(22.01.2010 в 17:49)
| | 1) запрос к базе на запись пути файла, я бы перенес в начало скрипта стазу после удачной загрузки файла и вместо имени загружаемого файла на диск я бы сохранял под именем id строки.
2) некоторые проверки у Вас повторяются, а вот от инъекций защиты нет. | |
|
|
|
|