Вытянуть название из select
Привет люди!
Столкнулся с проблемой. Написал форму с зависимыми списками. Страна, регион, город. Все подтягивается из БД. Вопрос: Как это все дело зафиксировать и отправить на почту? Так же написал скрипт PHP , но на почту вместо названий стран и городов приходят id значения из value. А надо, чтобы на почту приходили названия. <form class="messages" id="ajaxform" action="sendmail.php" method="post" > <input type="text" class="email" id="user_name" name="name" placeholder="Ваше имя" required="" value="" > <input type="email" class="password" id="user_email" name="email" placeholder="Ваша электронная почта" required="" value=""> <select name="country_id" id="country_id" class="form-control option-alsols" value=""> <option value="0">- Страна отправления -</option> <option value="3159">Россия</option> <option value="9908">Украина</option> <option value="248">Беларусь</option> <option value="245">Армения</option> <option value="81">Азербайджан</option> <option value="9638">Туркменистан</option> <option value="9787">Узбекистан</option> <option value="2303">Киргызстан</option> <option value="1894">Казахстан</option> <option value="2788">Молдова</option> <option value="9575">Такжикистан</option> </select> <select name="region_id" id="region_id" disabled="disabled" class="form-control option-alsols" value="";> <option value="0">- Регион отправления -</input> </select> <select name="city_id" id="city_id" disabled="disabled" class="form-control option-alsols" value="";> <option value="0">- Город отправления -</input> </select> <select name="strana" id="strana" class="form-control option-alsols" value="";> <option value="0">- Страна доставки -</option> <option value="3159">Россия</option> <option value="9908">Украина</option> <option value="248">Беларусь</option> <option value="245">Армения</option> <option value="81">Азербайджан</option> <option value="9638">Туркменистан</option> <option value="9787">Узбекистан</option> <option value="2303">Киргызстан</option> <option value="1894">Казахстан</option> <option value="2788">Молдова</option> <option value="9575">Такжикистан</option> </select> <select name="regio" id="regio" disabled="disabled" class="form-control option-alsols" value="";> <option value="0">- Регион доставки -</option> </select> <select name="city" id="city" disabled="disabled" class="form-control option-alsols" value="0"> <option value="0">- Город доставки -</option> </select> <select name="tip" id="tip" class="form-control option-alsols" value=""> <option>Тип груза</option> <option>EUR-паллет</option> <option>FIN-паллет</option> <option>US-паллет</option> </select> <input type="submit" id="submit" class="hvr-shutter-in-vertical" value="Отправить"> </form> Обработчик PHP формирование и отправка письма: <?php if (isset($_POST['name'])) {$name = $_POST['name']; if ($name == '') {unset($name);}} if (isset($_POST['email'])) {$email = $_POST['email']; if ($email == '') {unset($email);}} if (isset($_POST['country_id'])) {$country_id = $_POST['country_id']; if ($country_id == '') {unset($country_id);}} if (isset($_POST['region_id'])) {$region_id = $_POST['region_id']; if ($region_id == '') {unset($region_id);}} if (isset($_POST['city_id'])) {$city_id = $_POST['city_id']; if ($city_id == '') {unset($city_id);}} if (isset($_POST['strana'])) {$strana = $_POST['strana']; if ($strana == '') {unset($strana);}} if (isset($_POST['regio'])) {$regio = $_POST['regio']; if ($regio == '') {unset($regio);}} if (isset($_POST['city'])) {$city = $_POST['city']; if ($city == '') {unset($city);}} if (isset($_POST['tip'])) {$tip = $_POST['tip']; if ($tip == '') {unset($tip);}} if (isset($name) && isset($email) && isset($country_id) && isset($region_id) && isset($city_id) && isset($strana) && isset($city) && isset($regio) && isset($tip)){ $address = "*****@gmail.com"; $mes = "Имя: $name \nE-mail: $email \nИз страны: $country_id \nИз региона: $region_id \nИз города: $city_id \nВ страну: $strana \nВ регион: $regio \nВ город: $city \nТип груза: $tip"; $send = mail ($address,$country_id,$mes,"Content-type:text/plain; charset = UTF-8\r\nFrom:$email"); if ($send == 'true') {echo "Сообщение отправлено . Вы будете направлены на главную страницу блога <a href=''></a>,где сможете продолжить ваш просмотр";} else {echo "Ошибка, сообщение не отправлено!";} } else { echo "Вы заполнили не все поля, вернитесь назад и заполните необходимые поля!"; } ?> И собственно сама выпадашка на js: $(document).ready(function () { $('#country_id').change(function () { var country_id = $(this).val(); if (country_id == '0') { $('#region_id').html('<option>- Регион отправления -</option>'); $('#region_id').attr('disabled', true); $('#city_id').html('<option>- Город отправления-</option>'); $('#city_id').attr('disabled', true); return(false); } $('#region_id').attr('disabled', true); $('#region_id').html('<option>загрузка...</option>'); var url = 'get_regions.php'; $.get( url, "country_id=" + country_id, function (result) { if (result.type == 'error') { alert('error'); return(false); } else { var options = ''; $(result.regions).each(function() { options += '<option value="' + $(this).attr('region_id') + '">' + $(this).attr('name') + '</option>'; }); $('#region_id').html('<option value="0">- Регион отправления -</option>'+options); $('#region_id').attr('disabled', false); $('#city_id').html('<option>- Город отправления -</option>'); $('#city_id').attr('disabled', true); } }, "json" ); }); $('#region_id').change(function () { var region_id = $(this).val(); //$('#region_id :selected').val(); //alert (region_id); if (region_id == '0') { $('#city_id').html('<option>- Город отправления -</option>'); $('#city_id').attr('disabled', true); return(false); } $('#city_id').attr('disabled', true); $('#city_id').html('<option>загрузка...</option>'); var url = 'get_city.php'; $.get( url, "region_id=" + region_id, function (result) { if (result.type == 'error') { alert('error'); return(false); } else { var options = ''; $(result.citys).each(function() { options += '<option value="' + $(this).attr('city_id') + '">' + $(this).attr('name') + '</option>'; }); $('#city_id').html('<option value="0">- Город отправления -</option>'+options); $('#city_id').attr('disabled', false); $('#city_id').change(function(){ var value = $('#city_id :selected').text(); var city_id = $('#city_id :selected').val(); if (city_id !== '0') { $('#selectBoxInfo').html('Выбран '+ value). fadeIn(1000,function(){ $(this); }); } }); } }, "json" ); }); }); $(document).ready(function () { $('#strana').change(function () { var country_id = $(this).val(); if (country_id == '0') { $('#regio').html('<option>- Регион доставки -</option>'); $('#regio').attr('disabled', true); $('#city').html('<option>- Город доставки-</option>'); $('#city').attr('disabled', true); return(false); } $('#regio').attr('disabled', true); $('#regio').html('<option>загрузка...</option>'); var url = 'regio.php'; $.get( url, "country_id=" + country_id, function (result) { if (result.type == 'error') { alert('error'); return(false); } else { var options = ''; $(result.regions).each(function() { options += '<option value="' + $(this).attr('region_id') + '">' + $(this).attr('name') + '</option>'; }); $('#regio').html('<option value="0">- Регион доставки -</option>'+options); $('#regio').attr('disabled', false); $('#city').html('<option>- Город доставки -</option>'); $('#city').attr('disabled', true); } }, "json" ); }); $('#regio').change(function () { var region_id = $(this).val(); //$('#region_id :selected').val(); //alert (region_id); if (region_id == '0') { $('#city').html('<option>- Город доставки -</option>'); $('#city').attr('disabled', true); return(false); } $('#city').attr('disabled', true); $('#city').html('<option>загрузка...</option>'); var url = 'city.php'; $.get( url, "region_id=" + region_id, function (result) { if (result.type == 'error') { alert('error'); return(false); } else { var options = ''; $(result.citys).each(function() { options += '<option value="' + $(this).attr('city_id') + '">' + $(this).attr('name') + '</option>'; }); $('#city').html('<option value="0">- Город доставки -</option>'+options); $('#city').attr('disabled', false); $('#city').change(function(){ var value = $('#city :selected').text(); var city_id = $('#city :selected').val(); if (city_id !== '0') { $('#selectBoxInfo').html('Выбран '+ value). fadeIn(1000,function(){ $(this); }); } }); } }, "json" ); }); }); Задача не из легких. И информации мало с примерами. |
Цитата:
Цитата:
if (isset($name) && isset($email) .... else "Вы заполнили не все поля ... Это глупость, ибо так if (isset($_POST['name'])) {$name = $_POST['name']; if ($name == '') {unset($name);}} ... а тем более при асинхронном обмене не поступают. И функция mail не может сказать отправлена ли почта, получил ли ее адресат. Эта функция все лишь отдает почтовое отправление sendmail, который и занимается почтой. Функция mail возвращает удача/нет лишь факт того, что sendmail принял или есть ошибка. |
value-это идентификаторы, их убирать нельзя иначе не будет работать зависимый список.
Данные подтягиваются из отдельной таблицы "city". Через запросы , что-то вроде <?php include_once 'connect.php'; $region_id = @intval($_GET['region_id']); //$region_id = 4312; $regs=mysql_query("SELECT name, city_id FROM city WHERE region_id=$region_id"); if ($regs) { $num = mysql_num_rows($regs); $i = 0; while ($i < $num) { $citys[$i] = mysql_fetch_assoc($regs); $i++; } $result = array('citys'=>$citys); } else { $result = array('type'=>'error'); } /** * if ($regs) { * $num = mysql_num_rows($regs); * $citys = array(); * for ($i=0; $i<$num; $i++) * $city[$i] = mysql_fetch_row($regs); * $i=0; * foreach ($city as $r) { * $citys[] = array('id'=>$i, 'title'=>$r); * $i++; * } * $result = array('type'=>'success', 'citys'=>$citys); * } * else { * $result = array('type'=>'error'); * } */ //echo "<pre>"; //print_r ($result); //echo "</pre>"; print json_encode($result); //print var_dump($result) ?> |
Так ведь работает же?!
|
если value списков, это идентификаторы городов, что и должен получать сервер, и под этими идентификаторами в базе содержится вся другая информация о городах? Да. Но надо получить именно название городов, как это можно сделать? |
Dan922,
Для Из города, например на сервере SELECT name FROM city WHERE city_id = $city_id где $city_id - индекс города, полученный из селекта |
Цитата:
Это же самое нужно получать по приему формы. Зная, что списки возвращают идентификаторы городов и т.д., получить по ним названия в БД. Проверка же не заполненных полей, это: $post = array_map('trim', $_POST); if($empty = array_intersect($post, [''])) { //массив $empty содержит поля формы, которые не заполнены //возвращаем клиенту сообщение об ошибках заполнения в них } else { //иначе проверка на корректность заполнения полей //имя какое разрешено, корректно ли введен email //остальные поля должны быть цифры - привести их к intereg //если же есть ошибки ввода, то возвращаем сообщения клиенту //если все Ок, то запрашиваем по идентификатору города его название в базе $city = mysql_query("SELECT name FROM city WHERE city_id=" . $post['city_id']); //таким же образом и названия для другого получить не проблема //формируем и отправляем почту } |
Цитата:
А существует ли возможность более простого построения зависимого списка с отправкой на почту? ...уже мозг сломал :( |
Цитата:
Если на клиенте, то да. Клиентский код что у вас, это слишком громоздко и не оправдано. Для построения зависимых списков и на клиенте нужен всего лишь один обработчик запросов для всех списков, так как и на клиенте он будет делать одно и тоже - запрашивать сервер, получать ответ, строить по ответу списки. Разница только в том, что список может быть 2, 3, 4,... в наборе связанных списков (первый список обычно уже заполнен и отдается клиенту сразу при запросе страницы, и он не изменяется). Не охота повторятся еще раз, об этом уже писалось, поищите на форуме, темы такие были и не раз. Почта же конкретно к спискам зависимым, или к чему либо еще не привязана, это просто почта, она может отправлять сообщения не обязательно данными из формы, ее можно просто и не отправлять. |
Перерыл все.
С подобным вопросом не обращался. В основном все начинается и заканчивается на обсуждении построения самих списков. А вот как дальше быть, как достать из них названия и отправить на почту-нет ничего :( |
А вот нет.
Не получается. Почему то на прием формы пришло id а не название :( |
да блин он все равно выводит только id :(
|
Цитата:
|
Не совсем понятно, где надо запрос писать?
Еще один обработчик делать? Или как? |
Цитата:
Там что-то не понятно? Может закажите оплачиваемую работу если сами не можете? |
Да нет, там все понятно но этот метод не работает. Увы.
И в существующей конструкции он вроде как и работать не должен. |
Вы пишете про "прием формы" которого нет.
Есть отображение формы и данных в полях формы по запросам. Есть submit который уносит это все на мыло. О каком приеме формы речь? Как вариант - вытаскивать эти данный JS, формировать свой запрос и слать через JS, а не формой иными словами, даже если использовать тот запрос то в value, который необходим для связанного списка, он все равно вернет значение id. Если даже делать запрос по id в базу, то что вернется? Вернется имя, дальше что с ним делать? Он его не увидит и отправит на мыло пустую строку. И зачем это делать, если имя выводится в существующем js $('#city').change(function(){ var value = $('#city :selected').text(); var city_id = $('#city :selected').val(); if (city_id !== '0') { $('#selectBoxInfo').html('Выбран '+ value). fadeIn(1000,function(){ $(this); Снова возвращаемся к тому с чего начали. |
Посмотрите строки 14 и 17
<?php if (isset($_POST['name'])) {$name = $_POST['name']; if ($name == '') {unset($name);}} if (isset($_POST['email'])) {$email = $_POST['email']; if ($email == '') {unset($email);}} if (isset($_POST['country_id'])) {$country_id = $_POST['country_id']; if ($country_id == '') {unset($country_id);}} if (isset($_POST['region_id'])) {$region_id = $_POST['region_id']; if ($region_id == '') {unset($region_id);}} if (isset($_POST['city_id'])) {$city_id = $_POST['city_id']; if ($city_id == '') {unset($city_id);}} if (isset($_POST['strana'])) {$strana = $_POST['strana']; if ($strana == '') {unset($strana);}} if (isset($_POST['regio'])) {$regio = $_POST['regio']; if ($regio == '') {unset($regio);}} if (isset($_POST['city'])) {$city = $_POST['city']; if ($city == '') {unset($city);}} if (isset($_POST['tip'])) {$tip = $_POST['tip']; if ($tip == '') {unset($tip);}} if (isset($name) && isset($email) && isset($country_id) && isset($region_id) && isset($city_id) && isset($strana) && isset($city) && isset($regio) && isset($tip)){ $cityname=mysql_query("SELECT name FROM city WHERE city_id=$city_id"); $address = "*****@gmail.com"; $mes = "Имя: $name \nE-mail: $email \nИз страны: $country_id \nИз региона: $region_id \nИз города: $cityname \nВ страну: $strana \nВ регион: $regio \nВ город: $city \nТип груза: $tip"; $send = mail ($address,$country_id,$mes,"Content-type:text/plain; charset = UTF-8\r\nFrom:$email"); if ($send == 'true') {echo "Сообщение отправлено . Вы будете направлены на главную страницу блога <a href=''></a>,где сможете продолжить ваш просмотр";} else {echo "Ошибка, сообщение не отправлено!";} } else { echo "Вы заполнили не все поля, вернитесь назад и заполните необходимые поля!"; } ?> |
Спасибо, я уже так делал.
Ругается он на 14 строку и выдает пустое поле. :( Пишет , что типа закрыт доступ к БД , но на самом деле если бы он был закрыт то не выводились бы города в форме. Даже если я его отправляю к коннектору базы, он в нее заходит, но в письме все равно приходит пустое поле |
Dan922,
Запросы списков, это для построения других списков от них зависимых. А отправление почты происходит после приема формы и проверки ее данных. То есть клиент отправляет форму, а не щелкает по спискам. Зачем вы взялись за это, если вы не понимаете простейшего? |
Я думаю, что вы просто не знаете как решить этот вопрос.
Не надо мне объяснять то, что я сам сделал. Просто поставил вас в известность, что тот вариант, который вы мне предложили-не работает. И возвращает пустое поле. Можете посмотреть мой ответ выше для Dilettante_Pro И вроде как я вам даже объяснил почему ваш вариант не работает. Вот вариант который приходит на почту: Из страны: 3159 Из региона: 4312 Из города: В страну: 3159 В регион: 4312 В город: Тип груза: EUR-паллет "Из города" и в "В город" - это результат отработки вашего метода. |
Цитата:
Цитата:
|
Вы прикалываетесь?
Да нет, могу. И он не работает. А вот вы, судя по всему, код прочли не до конца. |
Цитата:
В двух кустах заблудится и еще лапшу на уши вешаете. Чтобы сделать проверку чего вернуло, сделайте вывод ошибок при запросе к базе, или будете на кофейной гуще гадать что и как? |
Цитата:
Я не знаю, кто и что вам там вешает, но вы вроде как не представляете почему ваш метод не работает. Ради интереса сами постройте это. И посмотрите. |
Запрос к базе возвращает ресурс, а не значение поля, и его надо еще получить из ресурса, как это делается смотрите в своем коде обрабатывающем запросы списков. Вы этого не делаете и ожидаете чего то.
Вы же просто скопировали мой запрос который просто показывает его сделать для получения имени. А на самом деле так ID полученного города из формы непосредственно подставлять в запрос нельзя, это дыра в безопасности! И при этом вы утверждаете что все понимаете? Я и писал просто как в принципе делается, а не "окончательный код и именно под ваши конкретные данные", думая что вы и понимаете, а далее дело техники как говорят. |
Не утверждал я , что прям все понимаю, иначе бы не обращался за помощью.
Конечно я делаю что-то не так и хочу понять где ошибка и как правильно сделать. Но все, что вы мне подсказали, я подставил, поменял на свое. Получил ресурс и повесил обработчик и все равно пустое поле. |
Цитата:
Вот из вашего кода: $regs = mysql_query("SELECT name, city_id FROM city WHERE region_id=$region_id"); здесь $regs, это возвращенный запросом ресурс, содержащий множество строк (по крайней мере это ожидается), поэтому далее в цикле извлекается строки (записи в базе) из этого ресурса функцией $citys[$i] = mysql_fetch_assoc($regs); после чего $citys[$i] (пионер писал, не нужно здесь никаких итераторов) будет содержать значения name, city_id под этими именами полей таблицы как под их ключами. Вы хотите получить название конкретного города, а значит запись должна вернуться одна, следовательно цикла не нужно, но извлечь из ресурса строку надо то. $city = mysql_query("SELECT name FROM city WHERE city_id=" . $post['city_id']); здесь $city это ресурс, вот только делать так тоже нельзя - все данные пришедшие извне сервер обязан проверять и тем более не подставлять их в запросы без экранирования или приведения к ожидаемому типу. И я писал в комментариях //иначе проверка на корректность заполнения полей //имя какое разрешено, корректно ли введен email //остальные поля должны быть цифры - привести их к intereg //если же есть ошибки ввода, то возвращаем сообщения клиенту Вы это делали? Вряд ли, а ведь ожидалось что сделано будет, и $post['city_id'] будет приведен к intereg и если не будет при этом равен 0, значит не халтура, и только после этого это значение можно смело подставлять в запрос. После получения ресурса извлечь строку, и уже полученное подставлять в текст письма. Вы думаете это просто писать тут "учебники"? Взялись писать код, будьте добры хотя бы интересоваться функциями которые в нем есть, и это описано в руководстве, которое можно скачать и всегда иметь под рукой. И там же прочтите, что оригинальное API MySQL устарело и не рекомендуется. |
Дайте пример вот на это
Вы это делали? Вряд ли, а ведь ожидалось что сделано будет, и $post['city_id'] будет приведен к intereg и если не будет при этом равен 0, значит не халтура, и только после этого это значение можно смело подставлять в запрос. |
я чет не совсем понимаю, так ведь приходят целые числа, нет?
Их снова надо чтоли проверять? |
Цитата:
Если вы не проверив, что прислал клиент, подставите его данные в запрос, то вашу базу могу и взломать, так как вы ожидали что там 5, а к ней еще добавят запрос. Цитата:
if($id = (int)имя_переменной) { теперь $id можно подставлять в запрос так как это число и не равно 0 } Ищите в руководстве раздел работы с переменными, где описана и функция проверки переменной является ли она числом или строкой, содержащей число - is_numeric. Также в РНР достаточный набор фильтров для проверки данных. Я вам не могу написать примеров хотя бы потому, что вы их вставите в свое, а в итоге не получится. Примеры использования той или иной РНР функции смотрите в разделе ее описания, есть там и примеры. Все потому, что нужно не просто проверять число/не число, но еще и отдавать клиенту сообщения об ошибках, то есть прием формы от клиента, это есть диалог клиент -> сервер -> клиент. Вы что хотите чтобы я вам полный скрипт всего и вся написал? Я не буду. Ищите здесь, в сети подобные вопросы, скрипты, изучайте и применяйте у себя познанное. Это не раздел РНР, серверным скриптам на этом форуме посвящен другой раздел и писать тут много о проблемах на сервере не стоит. В данном разделе можно было бы вести диалог о клиентской части вашего кода. А она никуда не годится - много лишнего. |
:lol:
Я привел к integer, подставил id в запрос и получил...снова число)) Может что-то не так с самим запросом? Потому что таблица имеет вид : city_id region_id name |
Dan922,
Как и говорил laimas Цитата:
Цитата:
|
да удалил уже, ересь написал :(
вроде понимаю что к чему, а как правильно записать хз. |
if($city_id = (int)$_POST['city_id']) { $city = mysql_query("SELECT name FROM city WHERE city_id=city_id" . $post['city_id']); } |
Цитата:
Считаем, что города всех регионов и содержатся в этой таблице, а значит city_id, это уникальное значение принадлежащее только одному городу. Следовательно, если запросить значение поля name для city_id равное 200, то вернется название именно этого города, а не другого, но с условием, что в этой таблице город с идентификатором 200 есть. В противном случае запрос вернет NULL. Будем считать, что входные данные обработаны и их можно подставлять в запрос, условно назовем эту обработанную переменную ID города полученную из формы как $id (ID региона в запросе указывать не надо, потому, что все города в этой таблице, читайте выше), тогда нужно выполнить такие действие: $q = mysql_query('SELECT `name` FROM `city` WHERE `city_id` = ' . $id); //проверяем вернул ли что-то запрос, если вернул, значит такой город в базе есть if(mysql_num_rows($q)) { //получить название города $name = mysql_fetch_row($q); //в тело почты подставляем "..... \nИз города: $name[0] ....."; } else { //запрос ничего не вернул, значит, хотя данные это число, но под таким идентификатором в базе города нет //а это означает, что подстава, принять действия } |
Все круто:)
Только почему он мне первую букву города вернул? :D |
Я слишком тупой, чтобы достать название города самостоятельно. :(
Да и вообще , скорее всего, изначально неправильно привел к integer , возможно ошибки в запросе. |
Смотрю в учебнике работу с формами.
Там приводится к integer. Написал примерно так же у себя. Но я так и не понял как вытащить строки из дскриптора. |
Цитата:
|
Часовой пояс GMT +3, время: 01:08. |