За последние 24 часа нас посетили 17068 программистов и 1835 роботов. Сейчас ищут 1679 программистов ...

как вывести все отмеченные значения checkbox?

Тема в разделе "Прочие вопросы по PHP", создана пользователем kaylanger, 10 ноя 2011.

  1. kaylanger

    kaylanger Активный пользователь

    С нами с:
    10 ноя 2011
    Сообщения:
    9
    Симпатии:
    0
    Доброго времени суток! Дорогие коллеги! Хочу обратиться к Вам за помощью! конструирую сайт для кафе; в нем есть пункт "Сделать заказ". В этом пункте будет выведен список меню кафе в виде checkbox'ов и картинок напротив + ниже информация о заказчике (ФИО, Телефон, Адрес и т.д.).
    Суть проблемы: Нужно, чтобы после нажатия кнопки "Подтвердить Заказ" - отправлялись на почту и выводились на экран только список отмеченных checkbox'сов + информация о заказчике.

    Помогите чем можете, пожалуйста! Уже трое суток из интернета не вылезаю!

    здесь php сценарий

    PHP:
    1.  
    2. <?php
    3.                 if (isset($_POST['name1'])) {$name1 = $_POST['name1'];}
    4. if (isset($_POST['phone'])) {$phone = $_POST['phone'];}
    5. if (isset($_POST['adress'])) {$adress = $_POST['adress'];}
    6. if (empty($name1))
    7. {
    8. echo "<b class=style5>Не указано имя!<p>";
    9. echo "<a href=order.htm class=style5>Вернуться к заполнению формы заказа</a>";
    10. }
    11. if (empty($phone))
    12. {
    13. echo "<b class=style5>Не указан телефон!<p>";
    14. echo "<a href=order.htm class=style5>Вернуться к заполнению формы заказа</a>";
    15. }
    16. if (empty($adress))
    17. {
    18. echo "<b class=style5>Не указан адрес!<p>";
    19. echo "<a href=order.htm class=style5>Вернуться к заполнению формы заказа</a>";
    20. }
    21. else
    22. echo "<font class=style5>Получен заказ от: </font>".$_POST["name1"];
    23. echo "<br><br><font class=style5>Контактный телефон: </font>".$_POST["phone"];
    24. echo "<br><br><font class=style5>Адрес: </font>".$_POST["adress"];
    25. echo "<br><br><font class=style5>Время доставки: </font>".$_POST["time"];
    26. if (isset($_POST["order1"])) echo "<font class=style5>Ролл1";
    27. if (isset($_POST["order2"])) echo "<font class=style5>Ролл2";
    28. if($_POST['submit']) {
    29.         // $_POST['title'] содержит данные из поля "Тема", trim() - убираем все лишние пробелы и переносы строк, htmlspecialchars() - преобразует специальные символы в HTML сущности, будем считать для того, чтобы простейшие попытки взломать наш сайт обломались, ну и  substr($_POST['title'], 0, 1000) - урезаем текст до 1000 символов. Для переменной $_POST['mess'] все аналогично
    30.         $name1 = substr(htmlspecialchars(trim($_POST['name1'])), 0, 30);
    31.         $phone = substr(htmlspecialchars(trim($_POST['phone'])), 0, 30);
    32.         $adress =  substr(htmlspecialchars(trim($_POST['adress'])), 0, 30);
    33. $address = "kaylager@mail.ru"; /*УКАЗАТЬ СВОЙ АДРЕС!*/
    34. $headers = "Content-type: text/plain; charset = utf-8";
    35. $subject = "Сообщение с вашего сайта";
    36. $message = "Имя пославшего: $name1 \nТелефон: $Phone \nАдрес:: $adress\nМеню Заказа:: $order";
    37. $verify = mail ($to, $subject, $message, $headers);}
    38. if ($verify == 'true')
    39. {
    40. echo "<b class=style5>Спасибо! Скоро Вам перезвонят для подтверждения заказа.<p>";
    41. echo "<a href=index.htm class=style5>Нажмите,</a> чтобы вернуться на главную страницу";
    42. }
    43. else
    44. {
    45. echo "<br><br><font class=style5>Ошибка. Сообщение не отправлено!";
    46. }
    47. ?>
    48.  
    Здесь форма

    HTML:
    1.  
    2. <form action="action.php" method="post" id="form1">
    3.                <label><input type="checkbox" name="order1" value="roll1"><img src="images/logo_mess.png">ролл1</label>
    4.                <label><input type="checkbox" name="order2" value="roll2"><img src="images/logo_mess.png">ролл2<br><br></label>
    5.                
    6.                 <label>Фамилия Имя Отчество<br><input type="text" name="name1" size="55"><br><font class="style1">Пример: Иванов Иван Иванович</font></label><br><br>
    7.                 <label>Контактный телефон<br><input  type="text" name="phone" size="55"><br>
    8.                 <font class="style1">Пример: 8-987-654-32-10 </font></label><br><br>
    9.                 Время доставки:<br>
    10.                 <select name="time">
    11.                 <option value="10.00-11.00">10.00-11.00</option>
    12.                 <option value="11.00-12.00">11.00-12.00</option>
    13.                 <option value="12.00-13.00">12.00-13.00</option>
    14.                 <option value="13.00-14.00">13.00-14.00</option>
    15.                 <option value="14.00-15.00">14.00-15.00</option>
    16.                 <option value="15.00-16.00">15.00-16.00</option>
    17.                 <option value="16.00-17.00">16.00-17.00</option>
    18.                 <option value="17.00-18.00">17.00-18.00</option>
    19.                 <option value="18.00-19.00">18.00-19.00</option>
    20.                 <option value="19.00-20.00">19.00-20.00</option>
    21.                 <option value="20.00-21.00">20.00-21.00</option>
    22.                 <option value="21.00-22.00">21.00-22.00</option>
    23.                 <option value="22.00-23.00">22.00-23.00</option>
    24.                 </select><br><font class="style1">Выбирите удобное для Вас время доставки</font><br><br>
    25.                 <label>Адрес доставки:<br><textarea name="adress" cols="50" rows="4"></textarea><br><font class="style1">Пример: ул. Советская, д.1, кв.1 </font></label><br><br>
    26.                
    27.                 <label><input type="reset" name="reset1" value="Очистить форму"></label>
    28.                 <label><input type="submit" name="submit1" value="ПОДТВЕРДИТЬ ЗАКАЗ"></label>
    29.                
    30.                 </form>
    31.  
    Заранее спасибо!
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Во-первых:
    PHP:
    1. <?php
    2. // ...
    3. if (isset($_POST['name1'])) {$name1 = $_POST['name1'];}
    4. // ...
    5. if (empty($name1))
    6. // ...
    7. ?>
    Это, конечно, будет работать, и даже без нотисов, но с моей точки зрения - это неправильный подход. Не нужно хорошо знать английский, чтобы понять, что такое 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() заменила его на &lt; - а это уже 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:
    1. <?php
    2. // ...
    3. $order = '';
    4. if(isset($_POST['order1']))
    5.     $order .= "\nРолл 1";
    6. if(isset($_POST['order2']))
    7.     $order .= "\nРолл 2";
    8. // ну и дальше там создание письма
    9. $message = "Имя пославшего: $name1 \nТелефон: $phone \nАдрес:: $adress\nМеню Заказа:: $order";
    10. // ...
    11. ?>
     
  3. kaylanger

    kaylanger Активный пользователь

    С нами с:
    10 ноя 2011
    Сообщения:
    9
    Симпатии:
    0
    Благодарю за подробный ответ!
    Сделаю как Вы посоветовали.


    Еще вопрос: допустим я все исправил. если было отмечено, скажем так, 20 пунктов меню - то весь список из этих 20-ти пунктов должен будет отображаться в письме. Все верно?
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Если пунктов меню будет несколько (ну там, десяток-другой), можно особо не заморачиваться и просто все их прописать в коде. Хотя это и не самый лучший вариант, но если сделаешь по образцу выше - то это будет полностью рабочий код.
    Если их будет много-много, то можешь создать массив с данными и потом по нему проверять $_POST. Например, где-то в начале PHP сценария можешь вручную забить данные в массив:
    PHP:
    1. <?php
    2. $orders = array(
    3.     'order1' => 'Ролл 1',
    4.     'order2' => 'Ролл 2',
    5.     'sake1' => 'Сакэ "Выпил и упал"',
    6.     'sake2' => 'Сакэ "Клёвый напиток"',
    7.     'kalmar1' => 'Кальмарчик',
    8.     'krevedka1' => 'Йа креведко, сожри меня'
    9.     // Ну и так далее
    10. );
    11. // ...
    12. ?>
    А потом, перед созданием переменной $message таким образом заполнить переменную $order:
    PHP:
    1. <?php
    2. $order = '';
    3. foreach($orders as $id => $title) {
    4.     if(isset($_POST[$id]))
    5.         $order .= "\n{$title}";
    6. }
    7. ?>
    Если же пунктов меню будет дофига и они будут периодически обновляться (а скорее всего это будет именно так), то лучше хранить их в базе данных. Например, MySQL - есть практически на любом хостинге. Соответственно, массив $orders нужно будет строить на основе данных, которые лежат в б.д. Ну и саму форму заказа тоже тогда генерировать средствами PHP на основе данных из б.д.
    По поводу б.д. - я, конечно, сказал сейчас очень общие слова, не показав конкретных примеров, но... Если ты не пользовался никогда - то объяснять очень долго, да и глупо - ведь есть куча литературы по теме PHP + MySQL, да и в интернете тонны статей найти можно. Ну а если уже знаком - то тут не должно вопросов особых возникнуть. Реализация вышенаписанного - это, по сути, элементарные вещи.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Да.
     
  6. kaylanger

    kaylanger Активный пользователь

    С нами с:
    10 ноя 2011
    Сообщения:
    9
    Симпатии:
    0
    Еще раз огромное спасибо!

    Вы мне очень помогли!