Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вытянуть название из select (https://javascript.ru/forum/misc/70704-vytyanut-nazvanie-iz-select.html)

Dan922 27.09.2017 02:32

Вытянуть название из 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" 
		);
	});	
});



Задача не из легких. И информации мало с примерами.

laimas 27.09.2017 06:06

Цитата:

Сообщение от Dan922
Все подтягивается из БД.

Откуда тогда может возникать вопрос

Цитата:

Сообщение от Dan922
но на почту вместо названий стран и городов приходят id значения из value

если value списков, это идентификаторы городов, что и должен получать сервер, и под этими идентификаторами в базе содержится вся другая информация о городах?

if (isset($name) && isset($email) .... else "Вы заполнили не все поля ...

Это глупость, ибо так if (isset($_POST['name'])) {$name = $_POST['name']; if ($name == '') {unset($name);}} ... а тем более при асинхронном обмене не поступают.

И функция mail не может сказать отправлена ли почта, получил ли ее адресат. Эта функция все лишь отдает почтовое отправление sendmail, который и занимается почтой. Функция mail возвращает удача/нет лишь факт того, что sendmail принял или есть ошибка.

Dan922 27.09.2017 12:05

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)
?>

Dan922 27.09.2017 12:23

Так ведь работает же?!

Dan922 27.09.2017 12:31

если value списков, это идентификаторы городов, что и должен получать сервер, и под этими идентификаторами в базе содержится вся другая информация о городах?


Да.
Но надо получить именно название городов, как это можно сделать?

Dilettante_Pro 27.09.2017 12:45

Dan922,
Для Из города, например
на сервере
SELECT name FROM city WHERE city_id = $city_id
где $city_id - индекс города, полученный из селекта

laimas 27.09.2017 12:58

Цитата:

Сообщение от Dan922
Данные подтягиваются из отдельной таблицы "city". Через запросы , что-то вроде

Это вы так получаете данные для списка на клиенте (обслуживание асинхронных запросов клиента). Только сабака здесь @intval($_GET['region_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']);
    //таким же образом и названия для другого получить не проблема
    //формируем и отправляем почту   
}

Dan922 27.09.2017 14:28

Цитата:

Сообщение от laimas (Сообщение 465593)
Откуда тогда может возникать вопрос



если value списков, это идентификаторы городов, что и должен получать сервер, и под этими идентификаторами в базе содержится вся другая информация о городах?

if (isset($name) && isset($email) .... else "Вы заполнили не все поля ...

Это глупость, ибо так if (isset($_POST['name'])) {$name = $_POST['name']; if ($name == '') {unset($name);}} ... а тем более при асинхронном обмене не поступают.

И функция mail не может сказать отправлена ли почта, получил ли ее адресат. Эта функция все лишь отдает почтовое отправление sendmail, который и занимается почтой. Функция mail возвращает удача/нет лишь факт того, что sendmail принял или есть ошибка.


А существует ли возможность более простого построения зависимого списка с отправкой на почту?
...уже мозг сломал :(

laimas 27.09.2017 14:48

Цитата:

Сообщение от Dan922
А существует ли возможность более простого построения зависимого списка

Если речь о сервере, то это единственный запрос (или с вложенными) в котором изменяется только параметр, проще уже некуда.

Если на клиенте, то да. Клиентский код что у вас, это слишком громоздко и не оправдано. Для построения зависимых списков и на клиенте нужен всего лишь один обработчик запросов для всех списков, так как и на клиенте он будет делать одно и тоже - запрашивать сервер, получать ответ, строить по ответу списки. Разница только в том, что список может быть 2, 3, 4,... в наборе связанных списков (первый список обычно уже заполнен и отдается клиенту сразу при запросе страницы, и он не изменяется).

Не охота повторятся еще раз, об этом уже писалось, поищите на форуме, темы такие были и не раз.

Почта же конкретно к спискам зависимым, или к чему либо еще не привязана, это просто почта, она может отправлять сообщения не обязательно данными из формы, ее можно просто и не отправлять.

Dan922 27.09.2017 16:04

Перерыл все.

С подобным вопросом не обращался.
В основном все начинается и заканчивается на обсуждении построения самих списков.
А вот как дальше быть, как достать из них названия и отправить на почту-нет ничего :(

Dan922 27.09.2017 16:06

А вот нет.
Не получается.
Почему то на прием формы пришло id а не название :(

Dan922 27.09.2017 16:21

да блин он все равно выводит только id :(

laimas 27.09.2017 16:28

Цитата:

Сообщение от Dan922
Почему то на прием формы пришло id а не название

А что должно? Значением списка будет значение свойства value выбранной его опции, а не ее текста! И это будет id города. Делайте запрос в БД в таблицу городов по этому id и получайте его название. Какие тут проблемы?

Dan922 27.09.2017 17:47

Не совсем понятно, где надо запрос писать?
Еще один обработчик делать? Или как?

laimas 27.09.2017 18:00

Цитата:

Сообщение от Dan922
Не совсем понятно, где надо запрос писать?

Здесь я писал все https://javascript.ru/forum/misc/707...tml#post465633

Там что-то не понятно? Может закажите оплачиваемую работу если сами не можете?

Dan922 27.09.2017 18:15

Да нет, там все понятно но этот метод не работает. Увы.
И в существующей конструкции он вроде как и работать не должен.

Dan922 27.09.2017 18:35

Вы пишете про "прием формы" которого нет.
Есть отображение формы и данных в полях формы по запросам.
Есть 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);

Снова возвращаемся к тому с чего начали.

Dilettante_Pro 27.09.2017 18:53

Посмотрите строки 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 "Вы заполнили не все поля, вернитесь назад и заполните необходимые поля!";
}
?>

Dan922 27.09.2017 19:01

Спасибо, я уже так делал.
Ругается он на 14 строку и выдает пустое поле.
:(
Пишет , что типа закрыт доступ к БД , но на самом деле если бы он был закрыт то не выводились бы города в форме.
Даже если я его отправляю к коннектору базы, он в нее заходит, но в письме все равно приходит пустое поле

laimas 27.09.2017 19:23

Dan922,
Запросы списков, это для построения других списков от них зависимых. А отправление почты происходит после приема формы и проверки ее данных. То есть клиент отправляет форму, а не щелкает по спискам.

Зачем вы взялись за это, если вы не понимаете простейшего?

Dan922 27.09.2017 19:50

Я думаю, что вы просто не знаете как решить этот вопрос.
Не надо мне объяснять то, что я сам сделал.
Просто поставил вас в известность, что тот вариант, который вы мне предложили-не работает. И возвращает пустое поле.
Можете посмотреть мой ответ выше для Dilettante_Pro

И вроде как я вам даже объяснил почему ваш вариант не работает.
Вот вариант который приходит на почту:
Из страны: 3159 
Из региона: 4312 
Из города:  
В страну: 3159 
В регион: 4312 
В город:  
Тип груза: EUR-паллет

"Из города" и в "В город" - это результат отработки вашего метода.

laimas 27.09.2017 19:56

Цитата:

Сообщение от Dan922
Я думаю, что вы просто не знаете как решить этот вопрос.

Я прекрасно знаю как строятся и списки зависимые, и как отправляются, принимаются и проверяются формы, и серверными языками я занимаюсь давно, и что такое почта прекрасно знаю.

Цитата:

Сообщение от Dan922
Просто поставил вас в известность, что тот вариант, который вы мне предложили-не работает.

Просто вы копируете чужое не понимая того, что это "концепция". Вы даже в свой код не можете вставить простого запроса в базу, а таковой я даже на ваших реальных именах таблиц и судя по ключам и полям его написал.

Dan922 27.09.2017 20:00

Вы прикалываетесь?

Да нет, могу.
И он не работает.

А вот вы, судя по всему, код прочли не до конца.

laimas 27.09.2017 20:20

Цитата:

Сообщение от Dan922
А вот вы, судя по всему, код прочли не до конца.

Видал я ваш код, в помойку его, если о нем говорить, все равно дырявый. У вас имя ключа под которым форма отдает ID города не равно имени переменной под которым он вставляется в текст письма. Это ни на какие мысли не наводит?

В двух кустах заблудится и еще лапшу на уши вешаете.

Чтобы сделать проверку чего вернуло, сделайте вывод ошибок при запросе к базе, или будете на кофейной гуще гадать что и как?

Dan922 27.09.2017 20:24

Цитата:

Сообщение от laimas (Сообщение 465747)
Видал я ваш код, в помойку его, если о нем говорить, все равно дырявый. У вас имя ключа под которым форма отдает ID города не равно имени переменной под которым он вставляется в текст письма. Это ни на какие мысли не наводит?

В двух кустах заблудится и еще лапшу на уши вешаете.

Ну да , конечно наводит на мысль, что работаю с кодом , пробуя разные варианты. Поэтому, возможно, скопировал "как есть на данный момент".

Я не знаю, кто и что вам там вешает, но вы вроде как не представляете почему ваш метод не работает.

Ради интереса сами постройте это. И посмотрите.

laimas 27.09.2017 20:32

Запрос к базе возвращает ресурс, а не значение поля, и его надо еще получить из ресурса, как это делается смотрите в своем коде обрабатывающем запросы списков. Вы этого не делаете и ожидаете чего то.

Вы же просто скопировали мой запрос который просто показывает его сделать для получения имени. А на самом деле так ID полученного города из формы непосредственно подставлять в запрос нельзя, это дыра в безопасности!

И при этом вы утверждаете что все понимаете? Я и писал просто как в принципе делается, а не "окончательный код и именно под ваши конкретные данные", думая что вы и понимаете, а далее дело техники как говорят.

Dan922 27.09.2017 20:55

Не утверждал я , что прям все понимаю, иначе бы не обращался за помощью.
Конечно я делаю что-то не так и хочу понять где ошибка и как правильно сделать.

Но все, что вы мне подсказали, я подставил, поменял на свое. Получил ресурс и повесил обработчик и все равно пустое поле.

laimas 27.09.2017 21:15

Цитата:

Сообщение от Dan922
Но все, что вы мне подсказали, я подставил, поменял на свое. Получил ресурс и повесил обработчик и все равно пустое поле.

Ресурс он и в Африке ресурс, его нельзя подставить во что-то как текст.

Вот из вашего кода:

$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 устарело и не рекомендуется.

Dan922 27.09.2017 21:58

Дайте пример вот на это
Вы это делали? Вряд ли, а ведь ожидалось что сделано будет, и $post['city_id'] будет приведен к intereg и если не будет при этом равен 0, значит не халтура, и только после этого это значение можно смело подставлять в запрос.

Dan922 27.09.2017 22:01

я чет не совсем понимаю, так ведь приходят целые числа, нет?
Их снова надо чтоли проверять?

laimas 28.09.2017 05:48

Цитата:

Сообщение от Dan922
я чет не совсем понимаю, так ведь приходят целые числа, нет?

Нет, все что в значениях полей формы, это строки, строковые представления, и сервер получается строки. А все что присылают серверу может быть "подделкой". Ссылку на документацию РНР я дал, скачивайте. Там есть раздел о безопасности, в котором есть и о безопасности баз данных.
Если вы не проверив, что прислал клиент, подставите его данные в запрос, то вашу базу могу и взломать, так как вы ожидали что там 5, а к ней еще добавят запрос.

Цитата:

Сообщение от Dan922
Дайте пример вот на это

В самом простом случае, это привести к типу integer, так как знаем, что получаем идентификаторы:

if($id = (int)имя_переменной) {
     теперь $id можно подставлять в запрос так как это число и не равно 0
}


Ищите в руководстве раздел работы с переменными, где описана и функция проверки переменной является ли она числом или строкой, содержащей число - is_numeric. Также в РНР достаточный набор фильтров для проверки данных. Я вам не могу написать примеров хотя бы потому, что вы их вставите в свое, а в итоге не получится. Примеры использования той или иной РНР функции смотрите в разделе ее описания, есть там и примеры.

Все потому, что нужно не просто проверять число/не число, но еще и отдавать клиенту сообщения об ошибках, то есть прием формы от клиента, это есть диалог клиент -> сервер -> клиент. Вы что хотите чтобы я вам полный скрипт всего и вся написал? Я не буду. Ищите здесь, в сети подобные вопросы, скрипты, изучайте и применяйте у себя познанное.

Это не раздел РНР, серверным скриптам на этом форуме посвящен другой раздел и писать тут много о проблемах на сервере не стоит. В данном разделе можно было бы вести диалог о клиентской части вашего кода. А она никуда не годится - много лишнего.

Dan922 28.09.2017 12:52

:lol:
Я привел к integer, подставил id в запрос и получил...снова число))
Может что-то не так с самим запросом?

Потому что таблица имеет вид :
city_id region_id name

Dilettante_Pro 28.09.2017 13:06

Dan922,
Как и говорил laimas
Цитата:

Сообщение от laimas
Я вам не могу написать примеров хотя бы потому, что вы их вставите в свое, а в итоге не получится

Цитата:

Сообщение от Dan922
привел к integer, подставил id в запрос и получил...снова число))

Покажите запрос и где получили число

Dan922 28.09.2017 13:13

да удалил уже, ересь написал :(
вроде понимаю что к чему, а как правильно записать хз.

Dan922 28.09.2017 13:35

if($city_id = (int)$_POST['city_id']) {
     $city = mysql_query("SELECT name FROM city WHERE city_id=city_id" . $post['city_id']);
}

laimas 28.09.2017 13:44

Цитата:

Сообщение от Dan922
Потому что таблица имеет вид :
city_id region_id name

Чтобы судить о структуре вашей таблицы это как минимум нужно видеть ее дамп. Но если по ID города получить его название и таблица городов, это: идентификатор города - city_id, идентификатор региона - region_id, название города - name, этих сведений достаточно.

Считаем, что города всех регионов и содержатся в этой таблице, а значит 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 {
    //запрос ничего не вернул, значит, хотя данные это число, но под таким идентификатором в базе города нет
    //а это означает, что подстава, принять действия
}

Dan922 28.09.2017 14:24

Все круто:)
Только почему он мне первую букву города вернул? :D

Dan922 28.09.2017 14:31

Я слишком тупой, чтобы достать название города самостоятельно. :(
Да и вообще , скорее всего, изначально неправильно привел к integer , возможно ошибки в запросе.

Dan922 28.09.2017 14:40

Смотрю в учебнике работу с формами.
Там приводится к integer.
Написал примерно так же у себя. Но я так и не понял как вытащить строки из дскриптора.

laimas 28.09.2017 14:47

Цитата:

Сообщение от Dan922
Я слишком тупой, чтобы достать название города самостоятельно.

Заказывайте работу, оплачивайте и используйте написанное, но пояснять все никто не станет, все таки тут не школа.


Часовой пояс GMT +3, время: 01:08.