Доброго времени суток! Дорогие коллеги! Хочу обратиться к Вам за помощью! конструирую сайт для кафе; в нем есть пункт "Сделать заказ". В этом пункте будет выведен список меню кафе в виде checkbox'ов и картинок напротив + ниже информация о заказчике (ФИО, Телефон, Адрес и т.д.). Суть проблемы: Нужно, чтобы после нажатия кнопки "Подтвердить Заказ" - отправлялись на почту и выводились на экран только список отмеченных checkbox'сов + информация о заказчике. Помогите чем можете, пожалуйста! Уже трое суток из интернета не вылезаю! здесь php сценарий PHP: <?php if (isset($_POST['name1'])) {$name1 = $_POST['name1'];} if (isset($_POST['phone'])) {$phone = $_POST['phone'];} if (isset($_POST['adress'])) {$adress = $_POST['adress'];} if (empty($name1)) { echo "<b class=style5>Не указано имя!<p>"; echo "<a href=order.htm class=style5>Вернуться к заполнению формы заказа</a>"; exit; } if (empty($phone)) { echo "<b class=style5>Не указан телефон!<p>"; echo "<a href=order.htm class=style5>Вернуться к заполнению формы заказа</a>"; exit; } if (empty($adress)) { echo "<b class=style5>Не указан адрес!<p>"; echo "<a href=order.htm class=style5>Вернуться к заполнению формы заказа</a>"; exit; } else echo "<font class=style5>Получен заказ от: </font>".$_POST["name1"]; echo "<br><br><font class=style5>Контактный телефон: </font>".$_POST["phone"]; echo "<br><br><font class=style5>Адрес: </font>".$_POST["adress"]; echo "<br><br><font class=style5>Время доставки: </font>".$_POST["time"]; if (isset($_POST["order1"])) echo "<font class=style5>Ролл1"; if (isset($_POST["order2"])) echo "<font class=style5>Ролл2"; if($_POST['submit']) { // $_POST['title'] содержит данные из поля "Тема", trim() - убираем все лишние пробелы и переносы строк, htmlspecialchars() - преобразует специальные символы в HTML сущности, будем считать для того, чтобы простейшие попытки взломать наш сайт обломались, ну и substr($_POST['title'], 0, 1000) - урезаем текст до 1000 символов. Для переменной $_POST['mess'] все аналогично $name1 = substr(htmlspecialchars(trim($_POST['name1'])), 0, 30); $phone = substr(htmlspecialchars(trim($_POST['phone'])), 0, 30); $adress = substr(htmlspecialchars(trim($_POST['adress'])), 0, 30); $address = "kaylager@mail.ru"; /*УКАЗАТЬ СВОЙ АДРЕС!*/ $headers = "Content-type: text/plain; charset = utf-8"; $subject = "Сообщение с вашего сайта"; $message = "Имя пославшего: $name1 \nТелефон: $Phone \nАдрес:: $adress\nМеню Заказа:: $order"; $verify = mail ($to, $subject, $message, $headers);} if ($verify == 'true') { echo "<b class=style5>Спасибо! Скоро Вам перезвонят для подтверждения заказа.<p>"; echo "<a href=index.htm class=style5>Нажмите,</a> чтобы вернуться на главную страницу"; } else { echo "<br><br><font class=style5>Ошибка. Сообщение не отправлено!"; } ?> Здесь форма HTML: <form action="action.php" method="post" id="form1"> <label><input type="checkbox" name="order1" value="roll1"><img src="images/logo_mess.png">ролл1</label> <label><input type="checkbox" name="order2" value="roll2"><img src="images/logo_mess.png">ролл2<br><br></label> <label>Фамилия Имя Отчество<br><input type="text" name="name1" size="55"><br><font class="style1">Пример: Иванов Иван Иванович</font></label><br><br> <label>Контактный телефон<br><input type="text" name="phone" size="55"><br> <font class="style1">Пример: 8-987-654-32-10 </font></label><br><br> Время доставки:<br> <select name="time"> <option value="10.00-11.00">10.00-11.00</option> <option value="11.00-12.00">11.00-12.00</option> <option value="12.00-13.00">12.00-13.00</option> <option value="13.00-14.00">13.00-14.00</option> <option value="14.00-15.00">14.00-15.00</option> <option value="15.00-16.00">15.00-16.00</option> <option value="16.00-17.00">16.00-17.00</option> <option value="17.00-18.00">17.00-18.00</option> <option value="18.00-19.00">18.00-19.00</option> <option value="19.00-20.00">19.00-20.00</option> <option value="20.00-21.00">20.00-21.00</option> <option value="21.00-22.00">21.00-22.00</option> <option value="22.00-23.00">22.00-23.00</option> </select><br><font class="style1">Выбирите удобное для Вас время доставки</font><br><br> <label>Адрес доставки:<br><textarea name="adress" cols="50" rows="4"></textarea><br><font class="style1">Пример: ул. Советская, д.1, кв.1 </font></label><br><br> <label><input type="reset" name="reset1" value="Очистить форму"></label> <label><input type="submit" name="submit1" value="ПОДТВЕРДИТЬ ЗАКАЗ"></label> </form> Заранее спасибо!
Во-первых: PHP: <?php // ... if (isset($_POST['name1'])) {$name1 = $_POST['name1'];} // ... if (empty($name1)) // ... ?> Это, конечно, будет работать, и даже без нотисов, но с моей точки зрения - это неправильный подход. Не нужно хорошо знать английский, чтобы понять, что такое isset и что такое empty. Слова говорят сами за себя. isset проверяет, существует ли такая переменная. empty проверяет, пустая ли такая переменная. empty() не вызывает нотисов, когда ему передают в качестве аргумента несуществующую переменную (к сожалению), но всё же я считаю, что такой подход неправильный. Сперва ты правильно проверяешь, существует ли элемент name1 массива $_POST и если он существует, то присваиваешь его значение переменной $name1. Дальше ты проверяешь, пустая ли переменная $name1. НО если элемент name1 массива $_POST не существует, то и переменной $name1 не существует. Тем не менее дальше ты проверяешь, пустая ли эта переменная, даже если она не существует. PHP - простой язык программирования, написанный, как я всё больше и чаще чуствую, для дураков. В нём работают такие вещи, которые не должны работать. Просто потому, что разработчики позаботились о тех, кто просто хочет сайт и не хочет задумываться о правильности кода. Это - одна из причин, почему так много бывает на форуме таких вопросов, которые вызывали бы смех, если бы не вызывали раздражения порой. Ну да ладно. Это так, лирическое отступление. Забей и не обращай внимания. Посмотри на 23-ю строку твоего кода. Зачем там else? Подумай... Строки 24-27 и 30-я строка. А вот это, хотя и тоже будет работать, но вызовет ошибку уровня E_NOTICE (самая незначительная, по сути, ошибка, но иногда они приводят к неправильной логике работы программы в целом), если форма не была отправлена, а кто-то обратился к скрипту напрямую, без отправки данных. Теоретически, это может сделать гугл Да ещё и сохранить в выдаче сообщения об ошибках твоего сайта и показывать их всем, когда кто-то будет искать себе самый вкусный ролл. Строки 32, 33, 34 - тут уже лучше, но теоретически такое возможно, что $_POST['submit'] есть, а $_POST['name1'] - нет. Но это уже скорее случится, если кто-то будет преднамеренно издеваться над твоим сайтом и теми, кто будет получать письма с него. substr(htmlspecialchars()) - неверно, делай наоборот. htmlspecialchars(substr()). Иначе - смотри, допустим в адресе есть символ < и он находится на позиции 29. Сперва функция htmlspecialchars() заменила его на < - а это уже 4 символа, а не 1. Теперь ты с помощью substr() получаешь первые 30 символов. В итоге она отрежет кусок строки и вернёт строку, на конце которой останется лишь &l , которые и получит адресат сообщения. Наверно, у него возникнет к тебе, как к разработчику программы, вопрос - а что за херь такая? Да и зачем ограничивать так жёстко длину адреса. Вот, например, я захочу заказать варёного кальмара в этом кафе и напишу адрес "г. Лобня Московской обл, ул. Научный Городок, дом 3, кв. 51" - уже 60 символов. А адрес-то полностью верный. А хозяин кафе получит только "г. Лобня Московской обл, ул. Н" - и тут он будет долго думать, куда же теперь ему отправлять заказ... Ещё один прикольный момент - ты создаёшь переменную $address и указываешь в ней email-адрес получателя (куда должен прийти заказ). А дальше в функции mail() ты уже используешь какую-то несуществующую переменную $to. Как так? PHP, конечно, язык программирования мега высокого уровня и очень умный и в целом прекрасно понимает кривые алгоритмы, но не на столько же... Да и номер телефона в письме (в содержимом переменной $message) всегда будет пустым - переменные регистро-зависимые. Это значит, что $phone и $Phone - это две совершенно разные переменные. Кстати, ты нигде не создаёшь и никак не заполняешь переменную $order, однако и её пытаешься отправить как часть содержимого письма. if ($verify == 'true') - тоже глупость. Зачем создавать строковую константу? Можешь написать if($verify === true) - без кавычек и с тройным равенством, если хочешь проверить переменную также на соответствие типа данных в ней, но вообще вот тут достаточно будет просто if($verify) { ... }. Мда, распизделся я чё-то. Теперь по поводу твоего вопроса, по поводу отмеченных чекбоксов. В общем ситуация такая: если чекбокс был отмечен - то он (его название и значение из атрибута value) будут присутствовать в массиве $_POST. Если его не отметили - его там не будет. Соответственно, тебе нужно проверить, присутствуют ли в массиве $_POST нужные тебе элементы и для каждого присутствующего элемента дополнить содержимое письма тем, за что отвечает соответствующий элемент. Например, элемент order1 у тебя отвечает за Ролл1. Тогда где-то выше, чем строка, в которой создаётся текст письма ($message = ... ) тебе надо создать и заполнить твою переменную $order, которая должна содержать сам заказ. Например, это можно сделать так: PHP: <?php // ... $order = ''; if(isset($_POST['order1'])) $order .= "\nРолл 1"; if(isset($_POST['order2'])) $order .= "\nРолл 2"; // ну и дальше там создание письма $message = "Имя пославшего: $name1 \nТелефон: $phone \nАдрес:: $adress\nМеню Заказа:: $order"; // ... ?>
Благодарю за подробный ответ! Сделаю как Вы посоветовали. Еще вопрос: допустим я все исправил. если было отмечено, скажем так, 20 пунктов меню - то весь список из этих 20-ти пунктов должен будет отображаться в письме. Все верно?
Если пунктов меню будет несколько (ну там, десяток-другой), можно особо не заморачиваться и просто все их прописать в коде. Хотя это и не самый лучший вариант, но если сделаешь по образцу выше - то это будет полностью рабочий код. Если их будет много-много, то можешь создать массив с данными и потом по нему проверять $_POST. Например, где-то в начале PHP сценария можешь вручную забить данные в массив: PHP: <?php $orders = array( 'order1' => 'Ролл 1', 'order2' => 'Ролл 2', 'sake1' => 'Сакэ "Выпил и упал"', 'sake2' => 'Сакэ "Клёвый напиток"', 'kalmar1' => 'Кальмарчик', 'krevedka1' => 'Йа креведко, сожри меня' // Ну и так далее ); // ... ?> А потом, перед созданием переменной $message таким образом заполнить переменную $order: PHP: <?php $order = ''; foreach($orders as $id => $title) { if(isset($_POST[$id])) $order .= "\n{$title}"; } ?> Если же пунктов меню будет дофига и они будут периодически обновляться (а скорее всего это будет именно так), то лучше хранить их в базе данных. Например, MySQL - есть практически на любом хостинге. Соответственно, массив $orders нужно будет строить на основе данных, которые лежат в б.д. Ну и саму форму заказа тоже тогда генерировать средствами PHP на основе данных из б.д. По поводу б.д. - я, конечно, сказал сейчас очень общие слова, не показав конкретных примеров, но... Если ты не пользовался никогда - то объяснять очень долго, да и глупо - ведь есть куча литературы по теме PHP + MySQL, да и в интернете тонны статей найти можно. Ну а если уже знаком - то тут не должно вопросов особых возникнуть. Реализация вышенаписанного - это, по сути, элементарные вещи.