Добрый день! не получается прикрепить несколько файлов в форме обратной связи. Прикрепляет либо один либо из всех только последний. Подскажите пожалуйста. (сейчас выкладываю вариант прикрепления только одного) Код (PHP): <div class="form-blok pol-input fb-pl-text">Прикрепить файл. <br />Для прикрепления нескольких файлов, заархивируйте их в один архив и прикрепите</div> <div class="form-blok pol-input ml-16"><input type="file" name="attachfile"></div> <div class="clear"></div> <div class="form-blok button"> <input type="submit" value="Отправить заказ на оценку" name="submit" onclick="document.getElementById('check').value = 'stopSpam';"> </div> скорее всего нужно поставить цикл в выделенном красном, но правильно поставить его не получается, прикрепляет только последний файл из всех(в <input type="file" > добавлял multiple). Помогите разобраться. Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
var_dump($_FILES) Код (PHP): Array ( [attachfile] => Array ( [name] => Array ( [0] => AccessibleMarshal.dll [1] => application.ini [2] => breakpadinjector.dll ) [type] => Array ( [0] => application/octet-stream [1] => application/octet-stream [2] => application/octet-stream ) [tmp_name] => Array ( [0] => /tmp/phpZynPaF [1] => /tmp/phpSpyVG1 [2] => /tmp/php37n3co ) [error] => Array ( [0] => 0 [1] => 0 [2] => 0 ) [size] => Array ( [0] => 19912 [1] => 695 [2] => 109000 ) ) ) но все равно если ставлю цикл, то письмо уходит пустое если оставляю как есть, то прикрепляется последний файл Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
Код (PHP): <?php function complete_mail() { // $_POST['title'] содержит данные из поля "Тема", trim() - убираем все лишние пробелы и переносы строк, htmlspecialchars() - преобразует специальные символы в HTML сущности, будем считать для того, чтобы простейшие попытки взломать наш сайт обломались, ну и substr($_POST['title'], 0, 1000) - урезаем текст до 1000 символов. Для переменных $_POST['mess'], $_POST['name'], $_POST['tel'], $_POST['email'] все аналогично // $_POST['title'] = substr(htmlspecialchars(trim($_POST['title'])), 0, 1000); $_POST['msg'] = substr(htmlspecialchars(trim($_POST['msg'])), 0, 1000000); $_POST['fio'] = substr(htmlspecialchars(trim($_POST['fio'])), 0, 100); $_POST['mtel'] = substr(htmlspecialchars(trim($_POST['mtel'])), 0, 30); $_POST['email'] = substr(htmlspecialchars(trim($_POST['email'])), 0, 50); $_POST['tiprab'] = substr(htmlspecialchars(trim($_POST['tiprab'])), 0, 150); $_POST['predmet'] = substr(htmlspecialchars(trim($_POST['predmet'])), 0, 300); $_POST['tema'] = substr(htmlspecialchars(trim($_POST['tema'])), 0, 300); $_POST['obiem'] = substr(htmlspecialchars(trim($_POST['obiem'])), 0, 200); $_POST['sroki'] = substr(htmlspecialchars(trim($_POST['sroki'])), 0, 200); $_POST['uchzav'] = substr(htmlspecialchars(trim($_POST['uchzav'])), 0, 300); if ($_POST['check'] != 'stopSpam') exit('Spam decected'); // если не заполнено поле "Имя" - показываем ошибку 0 if (empty($_POST['fio'])) output_err(0); // если неправильно заполнено поле email - показываем ошибку 1 if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $_POST['email'])) output_err(1); // если не заполнено поле "Сообщение" - показываем ошибку 2 // if(empty($_POST['msg'])) // output_err(2); // обратите внимание, теперь мы можем писать красивые письма, с помощью html тегов ;-) $mess = ' <b>Предмет:</b> '.$_POST['predmet'].'<br /> <b>Тема:</b> '.$_POST['tema'].'<br /> <b>Объем:</b> '.$_POST['obiem'].'<br /> <b>Сроки:</b> '.$_POST['sroki'].'<br /> <b>Дополнительные требования:</b> '.$_POST['msg'].'<br /> <b>Имя:</b> '.$_POST['fio'].'<br /> <b>Телефон:</b> '.$_POST['mtel'].'<br /> <b>Контактный email:</b> '.$_POST['email'].'<br /> '; // подключаем файл класса для отправки почты require 'class.phpmailer.php'; $mail = new PHPMailer(); $mail->CharSet = "UTF-8"; $mail->From = $_POST['email']; // от кого $mail->FromName = $_POST['fio']; // от кого $mail->AddAddress('xxx@mail.ru', 'xxx'); // кому - адрес, Имя $mail->IsHTML(true); // выставляем формат письма HTML $mail->Subject = $_POST['tiprab']; // тема письма // если был файл, то прикрепляем его к письму if(isset($_FILES['attachfile'])) { if($_FILES['attachfile']['error'] == 0){ $cnt = count($_FILES['attachfile']['name']); if($cnt > 0) { for($i = 0; $i < $cnt; ++$i) { $mail->AddAttachment($_FILES['attachfile']['tmp_name'][$i], $_FILES['attachfile']['name']); }} } } // если было изображение, то прикрепляем его в виде картинки к телу письма. if(isset($_FILES['attachimage'])) { if($_FILES['attachimage']['error'] == 0){ if (!$mail->AddEmbeddedImage($_FILES['attachimage']['tmp_name'], 'my-attach', 'image.gif', 'base64', $_FILES['attachimage']['type'])) die ($mail->ErrorInfo); $mess .= 'А вот и наша картинка:<br /><img src="cid:my-attach" border=0><br />я показал как ее прикреплять, соответственно Вам осталось вставить ее в нужное место Вашего письма ;-) '; } } $mail->Body = $mess; // отправляем наше письмо if (!$mail->Send()) die ('Mailer Error: '.$mail->ErrorInfo); echo header('Location: /'); } function output_err($num) { $err[0] = 'ОШИБКА! Не введено имя.'; $err[1] = 'ОШИБКА! Неверно введен e-mail.'; //$err[2] = 'ОШИБКА! Не введено сообщение/требования.'; echo '<p>'.$err[$num].'</p>'; show_form(); exit(); } if (!empty($_POST['submit'])) complete_mail(); else show_form(); ?> выложил все вместе с циклом.
Структура массива $_FILES меняется в зависимости от того, используешь ты имя вида name="attachfile" или name="attachfile[]". Судя по твоему дампу $_FILES, у тебя инпуты с [] — каждое поле это массив. Можно проделать небольшие трансформации, чтобы сделать обработчик универсальным: Код (PHP): function doAttachments($fileField) { if (!is_array($fileField['error'])) { // Single: name="attach" // ... // здесь твоя обработка вложения со структурой как в единственном поле типа file // ... } else { // Multiple: name="attach[]" foreach (array_keys($fileField['error']) as $i) { if ($fileField['error'][$i] == UPLOAD_ERR_NO_FILE) { continue; } $file = []; foreach ($fileField as $key => $val) { $file[$key] = $val[$i]; } doAttachments($file); } } } if (isset($_FILES['attachfile'])) { doAttachments($_FILES['attachfile']); } https://www.dropbox.com/s/aejw74zizwbp62m/attachfile.php.zip?dl=0