За последние 24 часа нас посетили 73663 программиста и 10224 робота. Сейчас ищут 2077 программистов ...

Прикрепить несколько файлов в форме обратной связи

Тема в разделе "PHP для новичков", создана пользователем il2, 2 мар 2016.

  1. il2

    il2 Новичок

    С нами с:
    2 мар 2016
    Сообщения:
    4
    Симпатии:
    0
    Добрый день!
    не получается прикрепить несколько файлов в форме обратной связи.
    Прикрепляет либо один либо из всех только последний.
    Подскажите пожалуйста. (сейчас выкладываю вариант прикрепления только одного)
    Код (PHP):
    1. <div class="form-blok pol-input fb-pl-text">Прикрепить файл. <br />Для прикрепления нескольких файлов, заархивируйте их в один архив и прикрепите</div>
    2.     
    3.         <div class="form-blok pol-input ml-16"><input type="file" name="attachfile"></div>
    4.         
    5.         <div class="clear"></div>
    6.         
    7.         <div class="form-blok button">
    8.             <input type="submit" value="Отправить заказ на оценку" name="submit" onclick="document.getElementById('check').value = 'stopSpam';">
    9.         </div> 
    скорее всего нужно поставить цикл в выделенном красном, но правильно поставить его не получается, прикрепляет только последний файл из всех(в <input type="file" > добавлял multiple). Помогите разобраться.

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.601
    Симпатии:
    423
    Адрес:
    РД, г. Махачкала.
    сделайте var_dump($_FILES) вы увидите структуру массива, и это должно натолкнуть вас на мысль.
     
  3. il2

    il2 Новичок

    С нами с:
    2 мар 2016
    Сообщения:
    4
    Симпатии:
    0
    var_dump($_FILES)
    Код (PHP):
    1. (
    2.     [attachfile] => Array
    3.         (
    4.             [name] => Array
    5.                 (
    6.                     [0] => AccessibleMarshal.dll
    7.                     [1] => application.ini
    8.                     [2] => breakpadinjector.dll
    9.                 )
    10.  
    11.             [type] => Array
    12.                 (
    13.                     [0] => application/octet-stream
    14.                     [1] => application/octet-stream
    15.                     [2] => application/octet-stream
    16.                 )
    17.  
    18.             [tmp_name] => Array
    19.                 (
    20.                     [0] => /tmp/phpZynPaF
    21.                     [1] => /tmp/phpSpyVG1
    22.                     [2] => /tmp/php37n3co
    23.                 )
    24.  
    25.             [error] => Array
    26.                 (
    27.                     [0] => 0
    28.                     [1] => 0
    29.                     [2] => 0
    30.                 )
    31.  
    32.             [size] => Array
    33.                 (
    34.                     [0] => 19912
    35.                     [1] => 695
    36.                     [2] => 109000
    37.                 )
    38.  
    39.         )
    40.  
    41. )
    42.  
    но все равно если ставлю цикл, то письмо уходит пустое если оставляю как есть, то прикрепляется последний файл

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.601
    Симпатии:
    423
    Адрес:
    РД, г. Махачкала.
    Поставте в цикл и выложите код.
     
  5. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    1) выложи весь код формы отправки;
    2) для нескольких файлов нужно указывать - "file[]" ((:)
     
  6. il2

    il2 Новичок

    С нами с:
    2 мар 2016
    Сообщения:
    4
    Симпатии:
    0
    Код (PHP):
    1. <?php
    2.  
    3. function complete_mail() { 
    4.         // $_POST['title'] содержит данные из поля "Тема", trim() - убираем все лишние пробелы и переносы строк, htmlspecialchars() - преобразует специальные символы в HTML сущности, будем считать для того, чтобы простейшие попытки взломать наш сайт обломались, ну и  substr($_POST['title'], 0, 1000) - урезаем текст до 1000 символов. Для переменных $_POST['mess'], $_POST['name'], $_POST['tel'], $_POST['email'] все аналогично 
    5.         // $_POST['title'] =  substr(htmlspecialchars(trim($_POST['title'])), 0, 1000); 
    6.         $_POST['msg'] =  substr(htmlspecialchars(trim($_POST['msg'])), 0, 1000000); 
    7.         $_POST['fio'] =  substr(htmlspecialchars(trim($_POST['fio'])), 0, 100); 
    8.         $_POST['mtel'] =  substr(htmlspecialchars(trim($_POST['mtel'])), 0, 30); 
    9.         $_POST['email'] =  substr(htmlspecialchars(trim($_POST['email'])), 0, 50); 
    10.         $_POST['tiprab'] =  substr(htmlspecialchars(trim($_POST['tiprab'])), 0, 150); 
    11.         $_POST['predmet'] =  substr(htmlspecialchars(trim($_POST['predmet'])), 0, 300); 
    12.         $_POST['tema'] =  substr(htmlspecialchars(trim($_POST['tema'])), 0, 300); 
    13.         $_POST['obiem'] =  substr(htmlspecialchars(trim($_POST['obiem'])), 0, 200); 
    14.         $_POST['sroki'] =  substr(htmlspecialchars(trim($_POST['sroki'])), 0, 200); 
    15.         $_POST['uchzav'] =  substr(htmlspecialchars(trim($_POST['uchzav'])), 0, 300); 
    16.         
    17.         if ($_POST['check'] != 'stopSpam') exit('Spam decected');
    18.         // если не заполнено поле "Имя" - показываем ошибку 0 
    19.         if (empty($_POST['fio'])) 
    20.              output_err(0); 
    21.         // если неправильно заполнено поле email - показываем ошибку 1 
    22.         if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $_POST['email'])) 
    23.              output_err(1); 
    24.         // если не заполнено поле "Сообщение" - показываем ошибку 2 
    25.         // if(empty($_POST['msg'])) 
    26.         //     output_err(2); 
    27.         // обратите внимание, теперь мы можем писать красивые письма, с помощью html тегов ;-) 
    28.         $mess = 
    29. <b>Предмет:</b> '.$_POST['predmet'].'<br /> 
    30. <b>Тема:</b> '.$_POST['tema'].'<br /> 
    31. <b>Объем:</b> '.$_POST['obiem'].'<br /> 
    32. <b>Сроки:</b> '.$_POST['sroki'].'<br /> 
    33. <b>Дополнительные требования:</b> '.$_POST['msg'].'<br />
    34. <b>Имя:</b> '.$_POST['fio'].'<br /> 
    35. <b>Телефон:</b> '.$_POST['mtel'].'<br /> 
    36. <b>Контактный email:</b> '.$_POST['email'].'<br />  
    37.  ';
    38.  
    39.         // подключаем файл класса для отправки почты 
    40.         require 'class.phpmailer.php';
    41.  
    42.         $mail = new PHPMailer();
    43.         $mail->CharSet = "UTF-8";
    44.         $mail->From = $_POST['email'];      // от кого 
    45.         $mail->FromName = $_POST['fio'];   // от кого 
    46.         $mail->AddAddress('xxx@mail.ru', 'xxx'); // кому - адрес, Имя 
    47.         
    48.         $mail->IsHTML(true);        // выставляем формат письма HTML 
    49.         $mail->Subject = $_POST['tiprab'];  // тема письма 
    50.  
    51.         // если был файл, то прикрепляем его к письму 
    52.         if(isset($_FILES['attachfile'])) { 
    53.                  if($_FILES['attachfile']['error'] == 0){ 
    54.                  $cnt = count($_FILES['attachfile']['name']);
    55.                     if($cnt > 0) {
    56.                       for($i = 0; $i < $cnt; ++$i) {
    57.                  
    58.                     $mail->AddAttachment($_FILES['attachfile']['tmp_name'][$i], $_FILES['attachfile']['name']); 
    59.                     }}                 
    60.                  } 
    61.         } 
    62.         
    63.         // если было изображение, то прикрепляем его в виде картинки к телу письма. 
    64.         if(isset($_FILES['attachimage'])) { 
    65.                  if($_FILES['attachimage']['error'] == 0){ 
    66.                     if (!$mail->AddEmbeddedImage($_FILES['attachimage']['tmp_name'], 'my-attach', 'image.gif', 'base64', $_FILES['attachimage']['type'])) 
    67.                          die ($mail->ErrorInfo); 
    68.                     $mess .= 'А вот и наша картинка:<br /><img src="cid:my-attach" border=0><br />я показал как ее прикреплять, соответственно Вам осталось вставить ее в нужное место Вашего письма ;-) '; 
    69.                  } 
    70.         } 
    71.         $mail->Body = $mess; 
    72.  
    73.         // отправляем наше письмо 
    74.         if (!$mail->Send()) die ('Mailer Error: '.$mail->ErrorInfo); 
    75.         echo header('Location: /'); 
    76. } 
    77.  
    78. function output_err($num)
    79. { 
    80.     $err[0] = 'ОШИБКА! Не введено имя.'; 
    81.     $err[1] = 'ОШИБКА! Неверно введен e-mail.'; 
    82.     //$err[2] = 'ОШИБКА! Не введено сообщение/требования.'; 
    83.     echo '<p>'.$err[$num].'</p>'; 
    84.     show_form(); 
    85.     exit(); 
    86. } 
    87.  
    88. if (!empty($_POST['submit'])) complete_mail(); 
    89. else show_form(); 
    90. ?>
    выложил все вместе с циклом.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    Структура массива $_FILES меняется в зависимости от того, используешь ты имя вида name="attachfile" или name="attachfile[]".
    Судя по твоему дампу $_FILES, у тебя инпуты с [] — каждое поле это массив.
    Можно проделать небольшие трансформации, чтобы сделать обработчик универсальным:
    Код (PHP):
    1. function doAttachments($fileField)
    2. {
    3.     if (!is_array($fileField['error'])) {
    4.         // Single: name="attach"
    5.         // ...
    6.         // здесь твоя обработка вложения со структурой как в единственном поле типа file
    7.         // ...
    8.     } else {
    9.         // Multiple: name="attach[]"
    10.         foreach (array_keys($fileField['error']) as $i) {
    11.             if ($fileField['error'][$i] == UPLOAD_ERR_NO_FILE) { continue; }
    12.             $file = [];
    13.             foreach ($fileField as $key => $val) { $file[$key] = $val[$i]; }
    14.             doAttachments($file);
    15.         }
    16.     }
    17. }
    18.  
    19. if (isset($_FILES['attachfile'])) {
    20.     doAttachments($_FILES['attachfile']);
    21. } 
    https://www.dropbox.com/s/aejw74zizwbp62m/attachfile.php.zip?dl=0