Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Множественная загрузка
 
 автор: Eduard   (12.01.2010 в 21:40)   письмо автору
 
 

Здравствуйте,

скажите, пожалуйста, как можно сделать из моего кода возможность загружать сразу несколько файлов, нажатием одной кнопки "Добавить".

форма:

<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("../../".$image0644);
    }
  } else 
links($_POST['id_catalog'], "Изображение не передано на сервер");
  
  if(!
resizeimg($image$smallimage133100))
    
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();
  }
?>

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

Как это можно реализовать?

Спасибо.

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 21:43)   письмо автору
 
   для: Eduard   (12.01.2010 в 21:40)
 

<input type="file" name="image[]"> - и таких по необходимости размножить без изменения
Потом через цикл массив image пропускаете (Массив получится $_FILES будет трехмерным)

  Ответить  
 
 автор: Eduard   (12.01.2010 в 21:47)   письмо автору
 
   для: neadekvat   (12.01.2010 в 21:43)
 

Спасибо большое за ответ, neadekvat, а как его пропустить через массив именно в моём случае?

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 22:16)   письмо автору
 
   для: 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' нужное вам подставляете.

  Ответить  
 
 автор: Eduard   (12.01.2010 в 22:53)   письмо автору
 
   для: 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("../../".$image0644);
    }
  } else 
links($_POST['id_catalog'], "Изображение не передана на сервер");
  
  if(!
resizeimg($image$smallimage133100))
    
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();
  }
?>

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 22:58)   письмо автору
 
   для: Eduard   (12.01.2010 в 22:53)
 

Как выглядит ошибка? Процитируйте

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:01)   письмо автору
 
   для: 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

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 23:05)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:01)
 

Вы пробовали прочитать то, что вам интерпритатор выдал?
Предупреждения об ошибка - это же великая вещь, там ВСЕ написано.

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:10)   письмо автору
 
   для: neadekvat   (12.01.2010 в 23:05)
 

Ну да. Проблема в том, что там еще есть ['tmp_name'] и ['name']. происходит конфликт.

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 23:15)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:10)
 

Какой конфликт? Вы понимаете различие между содержанием ['tmp_name'] и ['name']?

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:19)   письмо автору
 
   для: neadekvat   (12.01.2010 в 23:15)
 

Да, name - это основная фотография (большого размера), tmp_name это миниатюра фотографии.

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 23:26)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:19)
 

А если я загружаю, например, Неро? То в name будет полная версия, а в tmp_name - лайт?

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:31)   письмо автору
 
   для: neadekvat   (12.01.2010 в 23:26)
 

Я загружаю только фотографии jpg gif png, загрузка идёт только а админ. режиме. А что если просто продублировать все операции, только изменить имена переменных?

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 23:32)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:31)
 

А, то есть вы думаете, что если я буду загружать файл, отличный от картинки, то элемент tmp_name пропадет?
Загляните-ка в мануал.

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:32)   письмо автору
 
   для: neadekvat   (12.01.2010 в 23:26)
 

Там же ещё и в БД идёт добавление.

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 23:33)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:32)
 

Причем сейчас бд? Мы про аплоад файлов. А до "добавления в бд" еще идти и идти

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:36)   письмо автору
 
   для: neadekvat   (12.01.2010 в 23:33)
 

Ну так файл, когда загружается, то добавляется и новая строка в БД. А при мультизагрузке должны несколько строк добавляться. В моём случае пока 2. А там еще и позиция фотографии передаётся через переменную pos.

Спасибо большое за ответы в любом случае!

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 23:38)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:36)
 

К чему вы это?
Вы даже файл загрузить еще не смогли, а уже про добавление строк говорите.
Мануал посмотрели? Что там пишут о tmp_name?

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:41)   письмо автору
 
   для: neadekvat   (12.01.2010 в 23:38)
 

У меня собственно мануала то нет.

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 23:44)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:41)
 

Интернет то у вас есть? Добро пожаловать в гугл, php.net в частности, да и на этом сайте есть справочник.

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:45)   письмо автору
 
   для: neadekvat   (12.01.2010 в 23:38)
 

Делаю путём проб и ошибок.

  Ответить  
 
 автор: neadekvat   (12.01.2010 в 23:48)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:45)
 

Нет, вы делаете по прицнипу гадания на кофейной гуще.
Когда после пробы возникает ошибка, её читают, осознают и пытаются исправить, в том числе, читая официальную документацию на используемые функции, суперглобальные массивы и т.д.

Если хотите, чтобы я просто скопировал то, что можно найти прописав одно слово в гугле - я скопирую. Но кому это больше надо?

  Ответить  
 
 автор: Eduard   (12.01.2010 в 23:52)   письмо автору
 
   для: neadekvat   (12.01.2010 в 23:48)
 

Да я так и пытаюсь сделать, понаять. Вы всё правильно говорите. Но потом я вижу, что проблем слишком много возникает, которые я скорее всего не смогу решить со своими знаниями. поэтому приходится делать путём проб и ошибок. tmp_name я как понимаю просто имя переменной, о нём не написано в справочнике на сайте.

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 00:01)   письмо автору
 
   для: Eduard   (12.01.2010 в 23:52)
 

http://php.su/phphttp/?uploads

  Ответить  
 
 автор: Eduard   (13.01.2010 в 00:19)   письмо автору
 
   для: 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[]

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 00:27)   письмо автору
 
   для: 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[]
Уж это давно было сказано.
Ну да ладно, давайте дальше..

  Ответить  
 
 автор: Eduard   (13.01.2010 в 00:30)   письмо автору
 
   для: neadekvat   (13.01.2010 в 00:27)
 

Точно, невнимательно посмотрел, там выделено жирным шрифтом.

  Ответить  
 
 автор: Eduard   (13.01.2010 в 01:06)   письмо автору
 
   для: neadekvat   (13.01.2010 в 00:27)
 

Уважаемый, neadekvat

Посмотрите, пожалуйста, что не так. Файлы добавляются, но через раз. То 1 файл, то 2. Из-за чего это может происходить?

  Ответить  
 
 автор: Eduard   (13.01.2010 в 00:29)   письмо автору
 
   для: 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("../../".$image0644);
    }
      }
  } else 
links($_POST['id_catalog'], "Изображение не передана на сервер");
  
  if(!
resizeimg($image$smallimage133100))
    
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:44)   письмо автору
 
   для: 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("../../".$image0644); 
    } 
  } else 
links($_POST['id_catalog'], "Изображение не передана на сервер"); 
  if(!
resizeimg($image$smallimage133100)) 
    
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)   письмо автору
 
   для: 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], 133100)) 
    
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(); 
  } 
?> 

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 01:10)   письмо автору
 
   для: Eduard   (13.01.2010 в 00:56)
 

Все до безобразия просто - ваш компьютер слишком быстро справляется с операцией (быстрее, чем одна секнуда). date("YmdHis",time()) - у вас же в формировании имени участвует время до секнуд. Проще говоря - создается два файла, но второй имеет такое же имя, как первый и соответственно перезаписывается поверх первого.
Чтобы убедиться в этом - поставьте sleep(1), например, под строчкой for ($i = 0; $i <= $count; $i++)
Кстати, date("YmdHis",time()) - это делается проще: date("YmdHis")

  Ответить  
 
 автор: Eduard   (13.01.2010 в 01:22)   письмо автору
 
   для: neadekvat   (13.01.2010 в 01:10)
 

Точно! :) Всё файлы создаются, со слипом работает! Теперь проблема с тем, что если только один файл хочу добавить, он пишет ошибку

else links($_POST['id_catalog'], "Изображение не передана на сервер"); 


Предполагаю, что проблема вот здесь?

if (!empty($_FILES['image']['name'][$i])) 

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 01:30)   письмо автору
 
   для: Eduard   (13.01.2010 в 01:22)
 

Дело в том, что вне зависемости от того, выбран ли файл или нет, передаются скрипту массивы от каждого поля input
таким образом, $count останется таким же, но значения у массива$_FILES['image']['name'][1] будут пустыми.

  Ответить  
 
 автор: Eduard   (13.01.2010 в 01:10)   письмо автору
 
   для: Eduard   (13.01.2010 в 00:56)
 

Если указать толко один файл, то загрузка его не происходит с моим кодом сверху.

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 01:14)   письмо автору
 
   для: Eduard   (13.01.2010 в 01:10)
 

Поднимите глаза на 1 пост выше - я вам ответил.

  Ответить  
 
 автор: Eduard   (13.01.2010 в 01:27)   письмо автору
 
   для: neadekvat   (13.01.2010 в 01:14)
 

Поднял, но не нашёл решение проблемы с одним файлом. Извините, пожалуйста.

  Ответить  
 
 автор: Eduard   (13.01.2010 в 01:33)   письмо автору
 
   для: neadekvat   (13.01.2010 в 01:14)
 

Обнаружилось что файл на самом деле обавляется и создаётся, я просто вижу ошибку, но в действительности всё нормально. Как-то нужно её убрать.

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 01:35)   письмо автору
 
   для: Eduard   (13.01.2010 в 01:33)
 

Вы же сказали, что один файл передается.. Опять поднимите глаза выше, я сказал про второй файл.

  Ответить  
 
 автор: Eduard   (13.01.2010 в 01:40)   письмо автору
 
   для: neadekvat   (13.01.2010 в 01:35)
 

Да я понял, таким образом мне нужно как-то переделать условие:

 if (!empty($_FILES['image']['tmp_name'][$i]))


Сейчас выходит, что если хоть один из элементов массива пустой, то ошибка. А как сделать чтобы выдавал ошибку только если все элементы массива пустые? И если один будет пустой, а другой нет, то нет ошибки?

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 01:48)   письмо автору
 
   для: 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], 133100))  
    
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'], "Ни одно изображение не передана на сервер"); 
 }

На что-то более умное уже мозгов не хватаило

  Ответить  
 
 автор: Eduard   (13.01.2010 в 02:01)   письмо автору
 
   для: neadekvat   (13.01.2010 в 01:48)
 

Большущее вам спасибо! Я попробовал с флагом, что-то не сработало, может где ошибся я, завтра еще буду пробовать, но на крайний случай с этим можно будет жить. Осталось проблема с pos и БД.

  Ответить  
 
 автор: Eduard   (13.01.2010 в 09:10)   письмо автору
 
   для: 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 тоже в массив. Подскажите, пожалуйста.

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 14:52)   письмо автору
 
   для: Eduard   (13.01.2010 в 09:10)
 

Запрос (mysql_query) должен выполняться для кжадой картинки тоже в цикле
А ваш выполняется уже вне цикла, то есть только один. КОнечно только одна запись добавиться

  Ответить  
 
 автор: Eduard   (13.01.2010 в 16:13)   письмо автору
 
   для: neadekvat   (13.01.2010 в 14:52)
 

Проблема в том, что pos находистя в другом файле

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 16:15)   письмо автору
 
   для: Eduard   (13.01.2010 в 16:13)
 

Распишите нормально логику, что за pos, откуда, как..
Начните с начала, закончите концом, максимально полно. Иначе вряд ли кто-то сможет помочь..

  Ответить  
 
 автор: Eduard   (13.01.2010 в 18:14)   письмо автору
 
   для: 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], 133100)) 
  
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 - это значение каталога с фотографиями, передаётся верно, должен у обоих строк одинаковым.

  Ответить  
 
 автор: neadekvat   (13.01.2010 в 18:17)   письмо автору
 
   для: Eduard   (13.01.2010 в 18:14)
 

$query = "INSERT INTO journal_photo VALUES (NULL, '$smallimage[$i]', '$image[$i]', '', ".$_POST['id_catalog'].")";
это только текст запроса
if(mysql_query($query)) а вот это сам запрос. и он находится ВНЕ цикла, а долженть быть в нем..

  Ответить  
 
 автор: Eduard   (13.01.2010 в 18:37)   письмо автору
 
   для: neadekvat   (13.01.2010 в 18:17)
 

Точно! Работает! Больше спасибо за Ваши подсказки! Я думал странно будет если в цикле будет выполнятся header("Location: ../../index.php?id=233&id_parent=".$_POST['id_catalog']);

Теперь осталась проблема с ошибкой при добавлении меньшего количества файлов чем присутствует полей. Сейчас пытаюсь это сделать с помощью кнопочки "+", при нажатии на которую будет просто появляться дополнитеьное поле file. То есть сколько нужно полей, столько и нажать раз кнопочку.

  Ответить  
 
 автор: Eduard   (13.01.2010 в 19:03)   письмо автору
 
   для: 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' />&nbsp;<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

  Ответить  
 
 автор: Eduard   (13.01.2010 в 18:15)   письмо автору
 
   для: neadekvat   (13.01.2010 в 16:15)
 

Подскажите, пожалуйста, что я некорретно в коде написал?

  Ответить  
 
 автор: Eduard   (13.01.2010 в 01:43)   письмо автору
 
   для: neadekvat   (13.01.2010 в 01:35)
 

Теперь у меня единственная проблема с добавлением в БД. Сейчас у меня добавляется только одна строка, т. к. переменная pos, которая является индексной, одинаковая для всех файлов. Её тоже как-то нужно загнать в массив, а как это корректо сделать?

  Ответить  
 
 автор: ols   (13.01.2010 в 02:27)   письмо автору
 
   для: Eduard   (13.01.2010 в 01:43)
 

Ты знаешь что перемещение файлов работает несколько быстрее чем копирование?
использование copy() здесь не по назначение. Используй move_uploaded_file(). К тому же не придется вспоминать про unlink()

  Ответить  
 
 автор: Trianon   (13.01.2010 в 02:48)   письмо автору
 
   для: ols   (13.01.2010 в 02:27)
 

про unlink не придется вспоминать в любом случае.
Хоть это и не повод применять copy.

  Ответить  
 
 автор: Eduard   (13.01.2010 в 08:40)   письмо автору
 
   для: ols   (13.01.2010 в 02:27)
 

Так и так всё быстро работает, мне большего и не надо. Или тут какое-то принципиальное отличние?

  Ответить  
 
 автор: ols   (13.01.2010 в 19:42)   письмо автору
 
   для: Eduard   (13.01.2010 в 08:40)
 

move_uploaded_file() в случае, если временная дирректория находится на том же носителе что и каталог куда загружается файл, просто перемещает его, а не копирует.

  Ответить  
 
 автор: Eduard   (12.01.2010 в 22:54)   письмо автору
 
   для: 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_img255255255);        
    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_img0000$w$h$size_img[0], $size_img[1]);                 
    if (
$size_img[2]==2)  imagejpeg($dest_img$smallimage);                       
    else if (
$size_img[2]==1imagegif($dest_img$smallimage);                       
    else if (
$size_img[2]==3imagepng($dest_img$smallimage); 
    
imagedestroy($dest_img); 
    
imagedestroy($src_img); 
    return 
true;          
  }   
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования