|
|
|
| Здравствуйте,
скажите, пожалуйста, как можно сделать из моего кода возможность загружать сразу несколько файлов, нажатием одной кнопки "Добавить".
форма:
<form enctype="multipart/form-data" action="файл для обработки" method="post">
<table>
<tr>
<td><input type="file" name="image"></td>
</tr>
<tr>
<td><input type="submit" value="Добавить"></td>
</tr>
<input type="hidden" name="id_catalog" value="<?php echo $id_catalog; ?>">
<input type="hidden" name="id_photo" value="<?php echo $id_photo; ?>">
<input type="hidden" name="pos" value="<?php echo $pos; ?>">
</table>
</form>
|
Обработка запроса:
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
require_once ("../../../config.php");
include "util.php";
if(empty($_POST['pos'])) links($_POST['id_catalog'], "Не введена позиция изображения");
if (!empty($_FILES['image']['tmp_name']))
{
$ext = strrchr($_FILES['image']['name'], ".");
$image = "../i/journal/".date("YmdHis",time())."$ext";
$smallimage = "../i/journal/".date("YmdHis",time())."_s$ext";
if (copy($_FILES['image']['tmp_name'], "../../".$image))
{
unlink($_FILES['image']['tmp_name']);
chmod("../../".$image, 0644);
}
} else links($_POST['id_catalog'], "Изображение не передано на сервер");
if(!resizeimg($image, $smallimage, 133, 100))
links($_POST['id_catalog'], "Ошибка при создании уменьшенной копии изображения с помощью библиотеки GDLib");
$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage', '$image', ".$_POST['pos'].", ".$_POST['id_catalog'].")";
if(mysql_query($query)) header("Location: ../../index.php?id=233&id_parent=".$_POST['id_catalog']);
else links($_POST['id_catalog'], "Ошибка при добавлении нового изображения");
function links($id_catalog,$msg)
{
echo "<p>".$msg."</p>";
echo "<p><a href=# onClick='history.back()'>Вернуться назад</a></p>";
exit();
}
?>
|
То есть сейчас один процесс загрузки изображения, а требуется сразу несколько файлов разом.
Как это можно реализовать?
Спасибо. | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 21:40)
| | <input type="file" name="image[]"> - и таких по необходимости размножить без изменения
Потом через цикл массив image пропускаете (Массив получится $_FILES будет трехмерным) | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 21:43)
| | Спасибо большое за ответ, neadekvat, а как его пропустить через массив именно в моём случае? | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 21:47)
| | С циклом - это я погорячился.
<?php
$count = count($_FILES['image']['name']) - 1; // вычитаем 1, т.к. индексы массивов начинаются с 0
for ($i = 0; $i <= $count; $i++) {
echo $_FILES['image']['name'][$i];
}
|
Вместе 'name' нужное вам подставляете. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 22:16)
| | В моём случае это получается вот так? не работает, ошибка.
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
require_once ("../../../config.php");
include "util.php";
if(empty($_POST['pos'])) links($_POST['id_catalog'], "Не введена позиция изображения");
if (!empty($_FILES['image']['tmp_name']))
{
$count = count($_FILES['image']['tmp_name']) - 1; // вычитаем 1, т.к. индексы массивов начинаются с 0
for ($i = 0; $i <= $count; $i++) {
echo $_FILES['image']['tmp_name'][$i];
}
$ext = strrchr($_FILES['image']['name'][$i], ".");
$image = "../i/journal/".date("YmdHis",time())."$ext";
$smallimage = "../i/journal/".date("YmdHis",time())."_s$ext";
if (copy($_FILES['image']['tmp_name'][$i], "../../".$image))
{
unlink($_FILES['image']['tmp_name'][$i]);
chmod("../../".$image, 0644);
}
} else links($_POST['id_catalog'], "Изображение не передана на сервер");
if(!resizeimg($image, $smallimage, 133, 100))
links($_POST['id_catalog'], "Ошибка при создании уменьшенной копии изображения с помощью библиотеки GDLib");
$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage', '$image', ".$_POST['pos'].", ".$_POST['id_catalog'].")";
if(mysql_query($query)) header("Location: ../../index.php?id=233&id_parent=".$_POST['id_catalog']);
else links($_POST['id_catalog'], "Ошибка при добавлении нового изображения");
function links($id_catalog,$msg)
{
echo "<p>".$msg."</p>";
echo "<p><a href=# onClick='history.back()'>Вернуться назад</a></p>";
exit();
}
?>
|
| |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 22:53)
| | Как выглядит ошибка? Процитируйте | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 22:58)
| | Я сделал два поля, то есть первый файл изменил только клонированием строчки.
Ошибка при добавлении двух файлов:
1
Warning: copy(t) [function.copy]: failed to open stream: No such file or directory in /home/gavailer/public_html/a/journal/photo/addphoto.php on line 19
Warning: getimagesize(../../../i/journal/20100112215957.) [function.getimagesize]: failed to open stream: No such file or directory in /home/gavailer/public_html/a/journal/photo/util.php on line 8
Warning: Cannot modify header information - headers already sent by (output started at /home/gavailer/public_html/a/journal/photo/addphoto.php:14) in /home/gavailer/public_html/a/journal/photo/addphoto.php on line 29
|
| |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 23:01)
| | Вы пробовали прочитать то, что вам интерпритатор выдал?
Предупреждения об ошибка - это же великая вещь, там ВСЕ написано. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:05)
| | Ну да. Проблема в том, что там еще есть ['tmp_name'] и ['name']. происходит конфликт. | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 23:10)
| | Какой конфликт? Вы понимаете различие между содержанием ['tmp_name'] и ['name']? | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:15)
| | Да, name - это основная фотография (большого размера), tmp_name это миниатюра фотографии. | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 23:19)
| | А если я загружаю, например, Неро? То в name будет полная версия, а в tmp_name - лайт? | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:26)
| | Я загружаю только фотографии jpg gif png, загрузка идёт только а админ. режиме. А что если просто продублировать все операции, только изменить имена переменных? | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 23:31)
| | А, то есть вы думаете, что если я буду загружать файл, отличный от картинки, то элемент tmp_name пропадет?
Загляните-ка в мануал. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:26)
| | Там же ещё и в БД идёт добавление. | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 23:32)
| | Причем сейчас бд? Мы про аплоад файлов. А до "добавления в бд" еще идти и идти | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:33)
| | Ну так файл, когда загружается, то добавляется и новая строка в БД. А при мультизагрузке должны несколько строк добавляться. В моём случае пока 2. А там еще и позиция фотографии передаётся через переменную pos.
Спасибо большое за ответы в любом случае! | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 23:36)
| | К чему вы это?
Вы даже файл загрузить еще не смогли, а уже про добавление строк говорите.
Мануал посмотрели? Что там пишут о tmp_name? | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:38)
| | У меня собственно мануала то нет. | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 23:41)
| | Интернет то у вас есть? Добро пожаловать в гугл, php.net в частности, да и на этом сайте есть справочник. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:38)
| | Делаю путём проб и ошибок. | |
|
|
|
|
|
|
|
для: Eduard
(12.01.2010 в 23:45)
| | Нет, вы делаете по прицнипу гадания на кофейной гуще.
Когда после пробы возникает ошибка, её читают, осознают и пытаются исправить, в том числе, читая официальную документацию на используемые функции, суперглобальные массивы и т.д.
Если хотите, чтобы я просто скопировал то, что можно найти прописав одно слово в гугле - я скопирую. Но кому это больше надо? | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:48)
| | Да я так и пытаюсь сделать, понаять. Вы всё правильно говорите. Но потом я вижу, что проблем слишком много возникает, которые я скорее всего не смогу решить со своими знаниями. поэтому приходится делать путём проб и ошибок. tmp_name я как понимаю просто имя переменной, о нём не написано в справочнике на сайте. | |
|
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 00:01)
| | Большое спасибо за ссылку! Да и вообще за то, что пишите :)
Итак начинаю по порядку.
Файл №1 с формой теперь выглядит так:
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
require_once ("../config.php");
if(!isset($button)) $button = " Добавить ";
if(!isset($action)) $action = "journal/photo/addphoto.php";
$id_catalog = $_GET['id_catalog'];
$id_photo = $_GET['id_photo'];
if(!isset($pos))
{
$query = "SELECT MAX(pos) AS maxpos FROM journal_photo WHERE id_catalog=$id_catalog";
$maxpos = mysql_query($query);
if($maxpos)
{
if(mysql_num_rows($maxpos)>0) $pos = mysql_result($maxpos,0) + 1;
else $pos = 1;
} else $pos = 1;
}
?>
<form enctype="multipart/form-data" action="<?php echo $action; ?>" method="post">
<table id="admin">
<tr>
<td class="small"><p>Изображение</p></td>
<td><input class="smallname" type="file" name="image[]"><input class="smallname" type="file" name="image[]"></td>
</tr>
<tr>
<td></td>
<td><input class="fs_middle" type="submit" value="<?php echo $button; ?>"></td>
</tr>
<input type="hidden" name="id_catalog" value="<?php echo $id_catalog; ?>">
<input type="hidden" name="id_photo" value="<?php echo $id_photo; ?>">
<input type="hidden" name="pos" value="<?php echo $pos; ?>">
</table>
</form>
|
Как я понял имя должно быть вида image[] | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 00:19)
| | $id_catalog = $_GET['id_catalog'];
$query = "SELECT MAX(pos) AS maxpos FROM journal_photo WHERE id_catalog=$id_catalog";
Галимая уезвимость.
Как минимум, надо делать так:
$id_catalog = intval($_GET['id_catalog']);
$query = "SELECT MAX(pos) AS maxpos FROM journal_photo WHERE id_catalog=$id_catalog";
> Как я понял имя должно быть вида image[]
Уж это давно было сказано.
Ну да ладно, давайте дальше.. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 00:27)
| | Точно, невнимательно посмотрел, там выделено жирным шрифтом. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 00:27)
| | Уважаемый, neadekvat
Посмотрите, пожалуйста, что не так. Файлы добавляются, но через раз. То 1 файл, то 2. Из-за чего это может происходить? | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 00:01)
| | Файл №2 делаю вот таким и ничего не происходит. Просто добавляется один файл как следует, никаких ошибок не возникает.
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
require_once ("../../../config.php");
include "util.php";
if(empty($_POST['pos'])) links($_POST['id_catalog'], "Не введена позиция изображения");
if (!empty($_FILES['image']['tmp_name']))
{
$count = count($_FILES['image']['name']) - 1; // вычитаем 1, т.к. индексы массивов начинаются с 0
for ($i = 0; $i <= $count; $i++) {
$ext = strrchr($_FILES['image']['name'][$i], ".");
$image = "../i/journal/".date("YmdHis",time())."$ext";
$smallimage = "../i/journal/".date("YmdHis",time())."_s$ext";
if (copy($_FILES['image']['tmp_name'][$i], "../../".$image))
{
unlink($_FILES['image']['tmp_name'][$i]);
chmod("../../".$image, 0644);
}
}
} else links($_POST['id_catalog'], "Изображение не передана на сервер");
if(!resizeimg($image, $smallimage, 133, 100))
links($_POST['id_catalog'], "Ошибка при создании уменьшенной копии изображения с помощью библиотеки GDLib");
$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage', '$image', ".$_POST['pos'].", ".$_POST['id_catalog'].")";
if(mysql_query($query)) header("Location: ../../index.php?id=233&id_parent=".$_POST['id_catalog']);
else links($_POST['id_catalog'], "Ошибка при добавлении нового изображения");
function links($id_catalog,$msg)
{
echo "<p>".$msg."</p>";
echo "<p><a href=# onClick='history.back()'>Вернуться назад</a></p>";
exit();
}
?>
|
| |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 00:29)
| | Логически. Нужно выполнять for для всех операций, делаю вот так:
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
require_once ("../../../config.php");
include "util.php";
if(empty($_POST['pos'])) links($_POST['id_catalog'], "Не введена позиция изображения");
$count = count($_FILES['image']['name']) - 1; // вычитаем 1, т.к. индексы массивов начинаются с 0
for ($i = 0; $i <= $count; $i++) {
if (!empty($_FILES['image']['tmp_name'][$i]))
{
$ext = strrchr($_FILES['image']['name'][$i], ".");
$image = "../i/journal/".date("YmdHis",time())."$ext";
$smallimage = "../i/journal/".date("YmdHis",time())."_s$ext";
if (copy($_FILES['image']['tmp_name'][$i], "../../".$image))
{
unlink($_FILES['image']['tmp_name'][$i]);
chmod("../../".$image, 0644);
}
} else links($_POST['id_catalog'], "Изображение не передана на сервер");
if(!resizeimg($image, $smallimage, 133, 100))
links($_POST['id_catalog'], "Ошибка при создании уменьшенной копии изображения с помощью библиотеки GDLib");
$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage', '$image', ".$_POST['pos'].", ".$_POST['id_catalog'].")";
}
if(mysql_query($query)) header("Location: ../../index.php?id=233&id_parent=".$_POST['id_catalog']);
else links($_POST['id_catalog'], "Ошибка при добавлении нового изображения");
function links($id_catalog,$msg)
{
echo "<p>".$msg."</p>";
echo "<p><a href=# onClick='history.back()'>Вернуться назад</a></p>";
exit();
}
?>
|
В итоге, загружается только один файл, ошибок не видаёт. В нужной папке создаётся как и нужно два файла, большой и маленький. | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 00:29)
| | Сделал вот так. Стало через раз работать :). Один раз добавит 1 фотографию (1 большую, 1 маленькую), а другой раз добавит две (!) (2 больших и 2 миниатюры):
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
require_once ("../../../config.php");
include "util.php";
if(empty($_POST['pos'])) links($_POST['id_catalog'], "Не введена позиция изображения");
$count = count($_FILES['image']['name']) - 1; // вычитаем 1, т.к. индексы массивов начинаются с 0
for ($i = 0; $i <= $count; $i++) {
if (!empty($_FILES['image']['tmp_name'][$i]))
{
$ext = strrchr($_FILES['image']['name'][$i], ".");
$image[$i] = "../i/journal/".date("YmdHis",time())."$ext";
$smallimage[$i] = "../i/journal/".date("YmdHis",time())."_s$ext";
if (copy($_FILES['image']['tmp_name'][$i], "../../".$image[$i]))
{
unlink($_FILES['image']['tmp_name'][$i]);
chmod("../../".$image[$i], 0644);
}
} else links($_POST['id_catalog'], "Изображение не передана на сервер");
if(!resizeimg($image[$i], $smallimage[$i], 133, 100))
links($_POST['id_catalog'], "Ошибка при создании уменьшенной копии изображения с помощью библиотеки GDLib");
$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage', '$image', ".$_POST['pos'].", ".$_POST['id_catalog'].")";
}
if(mysql_query($query)) header("Location: ../../index.php?id=233&id_parent=".$_POST['id_catalog']);
else links($_POST['id_catalog'], "Ошибка при добавлении нового изображения");
function links($id_catalog,$msg)
{
echo "<p>".$msg."</p>";
echo "<p><a href=# onClick='history.back()'>Вернуться назад</a></p>";
exit();
}
?>
|
| |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 00:56)
| | Все до безобразия просто - ваш компьютер слишком быстро справляется с операцией (быстрее, чем одна секнуда). date("YmdHis",time()) - у вас же в формировании имени участвует время до секнуд. Проще говоря - создается два файла, но второй имеет такое же имя, как первый и соответственно перезаписывается поверх первого.
Чтобы убедиться в этом - поставьте sleep(1), например, под строчкой for ($i = 0; $i <= $count; $i++)
Кстати, date("YmdHis",time()) - это делается проще: date("YmdHis") | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 01:10)
| | Точно! :) Всё файлы создаются, со слипом работает! Теперь проблема с тем, что если только один файл хочу добавить, он пишет ошибку
else links($_POST['id_catalog'], "Изображение не передана на сервер");
|
Предполагаю, что проблема вот здесь?
if (!empty($_FILES['image']['name'][$i]))
|
| |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 01:22)
| | Дело в том, что вне зависемости от того, выбран ли файл или нет, передаются скрипту массивы от каждого поля input
таким образом, $count останется таким же, но значения у массива$_FILES['image']['name'][1] будут пустыми. | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 00:56)
| | Если указать толко один файл, то загрузка его не происходит с моим кодом сверху. | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 01:10)
| | Поднимите глаза на 1 пост выше - я вам ответил. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 01:14)
| | Поднял, но не нашёл решение проблемы с одним файлом. Извините, пожалуйста. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 01:14)
| | Обнаружилось что файл на самом деле обавляется и создаётся, я просто вижу ошибку, но в действительности всё нормально. Как-то нужно её убрать. | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 01:33)
| | Вы же сказали, что один файл передается.. Опять поднимите глаза выше, я сказал про второй файл. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 01:35)
| | Да я понял, таким образом мне нужно как-то переделать условие:
if (!empty($_FILES['image']['tmp_name'][$i]))
|
Сейчас выходит, что если хоть один из элементов массива пустой, то ошибка. А как сделать чтобы выдавал ошибку только если все элементы массива пустые? И если один будет пустой, а другой нет, то нет ошибки? | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 01:40)
| | > А как сделать чтобы выдавал ошибку только если все элементы массива пустые? И если один будет пустой, а другой нет, то нет ошибки?
Да фиг его знает, но сейчас, ночью, чтобы сильно не менять логику, я бы мог предложить такую вещь:
<?php
$flag = FALSE; // об этом ниже
$count = count($_FILES['image']['name']) - 1; // вычитаем 1, т.к. индексы массивов начинаются с 0
for ($i = 0; $i <= $count; $i++) { // начало цикла
if (!empty($_FILES['image']['tmp_name'][$i])) continue; // если значение пустое - пропускаем ходы
$flag = TRUE; // условный флаг. Если все значения пустые, он будет false
$ext = strrchr($_FILES['image']['name'][$i], ".");
$image[$i] = "../i/journal/".date("YmdHis",time())."$ext";
$smallimage[$i] = "../i/journal/".date("YmdHis",time())."_s$ext";
if (copy($_FILES['image']['tmp_name'][$i], "../../".$image[$i]))
{
unlink($_FILES['image']['tmp_name'][$i]);
chmod("../../".$image[$i], 0644);
}
if(!resizeimg($image[$i], $smallimage[$i], 133, 100))
links($_POST['id_catalog'], "Ошибка при создании уменьшенной копии изображения с помощью библиотеки GDLib");
$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage', '$image', ".$_POST['pos'].", ".$_POST['id_catalog'].")";
} // конец цикла
if (!$flag) {
links($_POST['id_catalog'], "Ни одно изображение не передана на сервер");
}
|
На что-то более умное уже мозгов не хватаило | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 01:48)
| | Большущее вам спасибо! Я попробовал с флагом, что-то не сработало, может где ошибся я, завтра еще буду пробовать, но на крайний случай с этим можно будет жить. Осталось проблема с pos и БД. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 01:48)
| | Доброе утроn neadekvat,
теперь мучаюсь с добавлением в базу данных х-файлов, которые загружаю.
Проблема в добавлении одной ячейки. Ячейки pos, индексной. 1 строчка создаётся с одним файлом, а другая нет.
В файле с формой вот такой код установлен:
if(!isset($pos))
{
$query = "SELECT MAX(pos) AS maxpos FROM journal_photo WHERE id_catalog=$id_catalog";
$maxpos = mysql_query($query);
if($maxpos)
{
if(mysql_num_rows($maxpos)>0) $pos = mysql_result($maxpos,0) + 1;
else $pos = 1;
} else $pos = 1;
}
...
...
...
<input type="hidden" name="pos" value="<?php echo $pos; ?>">
|
и в имполняемом файле:
if(empty($_POST['pos'])) links($_POST['id_catalog'], "Не введена позиция изображения");
...
...
...
$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage[$i]', '$image[$i]', ".$_POST['pos'].", ".$_POST['id_catalog'].")";
|
То есть как-то надо загнать pos тоже в массив. Подскажите, пожалуйста. | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 09:10)
| | Запрос (mysql_query) должен выполняться для кжадой картинки тоже в цикле
А ваш выполняется уже вне цикла, то есть только один. КОнечно только одна запись добавиться | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 14:52)
| | Проблема в том, что pos находистя в другом файле | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 16:13)
| | Распишите нормально логику, что за pos, откуда, как..
Начните с начала, закончите концом, максимально полно. Иначе вряд ли кто-то сможет помочь.. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 16:15)
| | Итак, я сначала решил вообще без этго pos сделать. Я сделал там систему отображения по порядку с помощью этого pos. Но пока бы и так сделать. У меня пока что в принципе не выходит сделать две записи в БД, хотя query находится в цикле. Вот код:
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
require_once ("../../../config.php");
include "util.php";
$count = count($_FILES['image']['name']) - 1;
for ($i = 0; $i <= $count; $i++) {
sleep(1);
if (!empty($_FILES['image']['tmp_name'][$i]))
{
$ext = strrchr($_FILES['image']['name'][$i], ".");
$image[$i] = "../i/journal/".date("YmdHis")."$ext";
$smallimage[$i] = "../i/journal/".date("YmdHis")."_s$ext";
if (copy($_FILES['image']['tmp_name'][$i], "../../".$image[$i]))
{
unlink($_FILES['image']['tmp_name'][$i]);
chmod("../../".$image[$i], 0644);
}
} else links($_POST['id_catalog'], "Изображение не передана на сервер");
if(!resizeimg($image[$i], $smallimage[$i], 133, 100))
links($_POST['id_catalog'], "Ошибка при создании уменьшенной копии изображения с помощью библиотеки GDLib");
$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage[$i]', '$image[$i]', '', ".$_POST['id_catalog'].")";
}
if(mysql_query($query)) header("Location: ../../index.php?id=233&id_parent=".$_POST['id_catalog']);
else links($_POST['id_catalog'], "Ошибка при добавлении нового изображения");
function links($id_catalog,$msg)
{
echo "<p>".$msg."</p>";
echo "<p><a href=# onClick='history.back()'>Вернуться назад</a></p>";
exit();
}
?>
|
Если загружаю два файла, то скрипт без ошибок выполняется, создаются 4 файла (+ 2 миниатюры) там где нужно, но в БД добавляется одна строка вместо двух.
Таблица БД состоит из: id_photo (индекс), small, big, pos, id_catalog
При исполнении скрипта создаётся такая 1 строка (расположил в столбик для наглядности):
146
../i/journal/20100113160450_s.jpg
../i/journal/20100113160450.jpg
0
24
А должен ещё одину строку добавлять с именами других файлов. По сути должен изменится:
1. индекс.
2. путь к миниатюре
3. путь к большой фотографии
4. 0 - это pos, который пока не нужен
5. 24 - это значение каталога с фотографиями, передаётся верно, должен у обоих строк одинаковым. | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 18:14)
| | $query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage[$i]', '$image[$i]', '', ".$_POST['id_catalog'].")";
это только текст запроса
if(mysql_query($query)) а вот это сам запрос. и он находится ВНЕ цикла, а долженть быть в нем.. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 18:17)
| | Точно! Работает! Больше спасибо за Ваши подсказки! Я думал странно будет если в цикле будет выполнятся header("Location: ../../index.php?id=233&id_parent=".$_POST['id_catalog']);
Теперь осталась проблема с ошибкой при добавлении меньшего количества файлов чем присутствует полей. Сейчас пытаюсь это сделать с помощью кнопочки "+", при нажатии на которую будет просто появляться дополнитеьное поле file. То есть сколько нужно полей, столько и нажать раз кнопочку. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 18:17)
| | Всё сделал! Больше ошибок не возникает никаких. Работает как часы!
<script type="text/javascript">
function remove_more_upload(id) {
document.getElementById("multiple").removeChild(document.getElementById('multiple' + id ));
}
function add_more_upload() {
var id = document.getElementById('proxid').value ;
var div = document.getElementById('multiple');
var childdiv = document.createElement("div");
childdiv.setAttribute('id','multiple'+ id);
var html = "<br /><input style='height:22px;' type='file' name='image[]' maxlength='' value='' class='smallname' /> <input type='button' style='' name='files_" + id + "' value='-' style='width: 26px; height:26px;' onclick='remove_more_upload(" + id + ")' title='' />";
childdiv.innerHTML = html;
div.appendChild(childdiv) ;
document.getElementById('proxid').value++;
}
</script>
...
...
...
<input style='height:22px;' type="file" name="image[]" class="smallname" />
<input type="button" name="files_" value="+" style="width: 26px; height:26px;" onclick="add_more_upload()" title="" />
<input type="hidden" name="proxid" id="proxid" value="1" />
<div id="multiple"></div><br />
...
...
...
|
Уважаемый neadekvat! Выражаю вам искреннюю благодарность за помощь в понимании задачи и нахождении пути для её решения!
П. С. Теперь пытаюсь решить проблему с куки и системой оценки записей в блоге. Пока без успешно. http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=70964 | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 16:15)
| | Подскажите, пожалуйста, что я некорретно в коде написал? | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 01:35)
| | Теперь у меня единственная проблема с добавлением в БД. Сейчас у меня добавляется только одна строка, т. к. переменная pos, которая является индексной, одинаковая для всех файлов. Её тоже как-то нужно загнать в массив, а как это корректо сделать? | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 01:43)
| | Ты знаешь что перемещение файлов работает несколько быстрее чем копирование?
использование copy() здесь не по назначение. Используй move_uploaded_file(). К тому же не придется вспоминать про unlink() | |
|
|
|
|
|
|
|
для: ols
(13.01.2010 в 02:27)
| | про unlink не придется вспоминать в любом случае.
Хоть это и не повод применять copy. | |
|
|
|
|
|
|
|
для: ols
(13.01.2010 в 02:27)
| | Так и так всё быстро работает, мне большего и не надо. Или тут какое-то принципиальное отличние? | |
|
|
|
|
|
|
|
для: Eduard
(13.01.2010 в 08:40)
| | move_uploaded_file() в случае, если временная дирректория находится на том же носителе что и каталог куда загружается файл, просто перемещает его, а не копирует. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 22:16)
| | Так выглядит файл util.php
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
function resizeimg($filename, $smallimage, $w, $h)
{
$filename = "../../".$filename;
$smallimage = "../../".$smallimage;
$ratio = $w/$h;
$size_img = getimagesize($filename);
if (($size_img[0]<$w) && ($size_img[1]<$h)) return true;
$src_ratio=$size_img[0]/$size_img[1];
if ($ratio<$src_ratio)
{
$h = $w/$src_ratio;
}
else
{
$w = $h*$src_ratio;
}
$dest_img = imagecreatetruecolor($w, $h);
$white = imagecolorallocate($dest_img, 255, 255, 255);
if ($size_img[2]==2) $src_img = imagecreatefromjpeg($filename);
else if ($size_img[2]==1) $src_img = imagecreatefromgif($filename);
else if ($size_img[2]==3) $src_img = imagecreatefrompng($filename);
imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1]);
if ($size_img[2]==2) imagejpeg($dest_img, $smallimage);
else if ($size_img[2]==1) imagegif($dest_img, $smallimage);
else if ($size_img[2]==3) imagepng($dest_img, $smallimage);
imagedestroy($dest_img);
imagedestroy($src_img);
return true;
}
?>
|
| |
|
|
|