ermolaevalexey
@ermolaevalexey
frontend веб-разработчик

Пустая строка передается $_POST по умолчанию. Почему?

Очень-очень прошу помочь. Принимаются любые предположения и гипотезы/Помогаю знакомым делать проект. Суть такова:
По заполненным полям формы на странице делается выборка в бд и достаются результаты.
Скрипт исполняется тут же на странице. По submit'у методом POST на странице вызывается функция fetchFlats(), возвращающая массив значений из базы.
Возникла проблема - форму не удается проверить на заполненность - текстовые инпуты оказываются заполненными пустыми строками при каждом вызове функции. То есть в поля еще ничего не введено, но массив с данными приходит. Дополнительный Header проблему не решил.
Подскажите, пожалуйста, как избавиться от этих пустых строк.
Очень-очень срочно нужно. Спасибо заранее

index.php, где и происходит действие:

<?php
	//Подключение библиотек
	require "inc/db.inc.php";
	require "inc/lib.inc.php";
	
	//header('Content-Type:text/html;charset=utf-8');
?>
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>База</title>
    </head>
    <body>
    	<div>
    	<fieldset legend="Укажите парпаметры выбора">
    		<form action="" method="post">
    			  <select name="city">
    			  		<option selected disabled>Выберите город</option>
    			  		<?
                          $cities = selectCity();
    			  		  foreach ($cities as $city) {?>
						<option value="<?=$city['ID_City']?>"><?=$city['Name']?></option>
    			  		<?}?>
    			  </select>
    			  <select name="metro">
    			  		<option selected disabled>Выберите метро</option>  
    			  		<?
                          $metros = selectMetro();
    			  		  foreach ($metros as $metro) {?>
    			  		<option value="<?=$metro['ID_Metro']?>"><?=$metro['Name']?></option>  	
    			  		<?}?>
    			  </select>
    			  <label for="area">
    			    Общая площадь
                    <input type="number" name="area_from" min="30" max="150"/>
                    <input type="number" name="area_to" min="30" max="150"/>
    			  </label>
    			  <label for="price">
    			    Цена
                    <input type="number" name="price_from"/>
                    <input type="number" name="price_to"/>
    			  </label>
    			  <button type="submit">Показать варианты</button>
    		</form>
    	</fieldset>
    	<table border="1" cellpadding="5" cellspacing="0" width="100%">
            <tr>
    			<? 
                  if(empty($_POST) ){
                    echo 'Введите данные для поиска!';
                  } else {
                    $flats = fetchFlats();
                    echo "<pre>";
                    var_dump($flats);
                    print_r($_POST);
                    echo "</pre>";
                    echo count($_POST);
                 }
    			?>  
    		</tr>
    	</table>
    	</div>
    </body>
</html>

Функция fetchFlats в подключаемом файле lib.inc.php: (чтобы хоть не совсем говнокод был)
function fetchFlats() {
		global $link;
		$where = '';
		if(isset($_POST['city'])){
			if (count($_POST) >= 1) {
				$where .= 'rc.id_city = '.$_POST['city'].' ';
			} else {
				$where .= 'rc.id_city = '.$_POST['city'];
			}
		}
		if(isset($_POST['metro'])){
			if (count($_POST) >= 1) {
				$where .= 'AND rc.id_metro = '.$_POST['metro'].' ';
			} else {
				$where .= 'rc.id_metro = '.$_POST['metro'];
			}
		}	
		if(isset($_POST['area_from']) && isset($_POST['area_to'])){
			if (count($_POST) >= 1) {
				$where .= 'AND f.total_area >= '.$_POST['area_from'].' AND f.total_area <= '.$_POST['area_to'].' ';
			} else {
				$where .= 'f.total_area >= '.$_POST['area_from'].' AND f.total_area <= '.$_POST['area_to'];
			}
		}
		if(isset($_POST['price_from']) && isset($_POST['price_to'])){
			if (count($_POST) >= 1) {
				$where .= 'AND f.cost >= '.$_POST['price_from'].' AND f.cost <= '.$_POST['price_to'].' ';
			} else {
				$where .= 'f.cost >= '.$_POST['price_from'].' AND f.cost <= '.$_POST['price_to'];
			}
		}
		$sql = "SELECT * 
				FROM flat f
				INNER JOIN building b ON f.id_building = b.id_building
				INNER JOIN residential_complex rc ON b.id_residential_complex = rc.id_residential_complex WHERE ".$where;

		if (!$result = mysqli_query($link,$sql)) {
			echo $where;
		} else {
			$items = mysqli_fetch_all($result, MYSQLI_ASSOC);
			mysqli_free_result($result);
			return $items;
		}
	}

После исполнения кода распечатываю $_POST:
Array
(
    [area_from] => 
    [area_to] => 
    [price_from] => 
    [price_to] => 
)

var_dump дает понять что на месте значений закралась пустая строка, соответственно, $_POST никогда не бывает пуст. Я уже весь мозг сломал, думая, как это побороть. Очень-очень нужна ваша помощь. Еще раз спасибо.
  • Вопрос задан
  • 798 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Введите что-нибудь в поля area_* или price_*, нажмите "Показать варианты".
Форма отправится, и там будут значения.

Попробуйте открыть новую страницу с этим адресом - увидите что $_POST будет пустым.

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

P.S.: И да, на счет "срочно нужно", это вы зря. Это всё придется потом или выбросить, или сильно-сильно переписать, потому что в этом коде дырок больше чем в шапке у почтальона Печкина. Любой десятилетний хакер сделает вашему сайту ат-ат-ат.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ermolaevalexey
@ermolaevalexey Автор вопроса
frontend веб-разработчик
function fetchFlats() {
		global $link;
		$where = '';
		if(!empty($_POST['city'])){
			if (count($_POST) > 1) {
				$where .= 'rc.id_city = '.$_POST['city'].' ';
			} else {
				$where .= 'rc.id_city = '.$_POST['city'];
			}
		} else {//если пустой параметр то выкидываем
			unset($_POST['city']);
		}
		if(!empty($_POST['metro']))  {
			if (count($_POST) > 1) { //если параметров больше одного добавляем AND
				$where .= 'AND rc.id_metro = '.$_POST['metro'].' ';
			} else {//если один параметр
				$where .= 'rc.id_metro = '.$_POST['metro'];
			}
		} else {
			unset($_POST['metro']);
		}	
		if(  !empty($_POST['area_from']) ) {
			if (count($_POST) > 1) {
				$where .= 'AND f.total_area >= '.$_POST['area_from'].' ';
			} else {
				$where .= 'f.total_area >= '.$_POST['area_from'];
			}
		} else {
			unset($_POST['area_from']);
		}
		if(  !empty($_POST['area_to']) ) {
			if (count($_POST) > 1) {
				$where .= 'AND f.total_area <= '.$_POST['area_to'].' ';
			} else {
				$where .= 'f.total_area <= '.$_POST['area_to'];
			}
		} else {
			unset($_POST['area_to']);
		}
		if( !empty($_POST['price_from']) ) {
			if (count($_POST) > 1) {
				$where .= 'AND f.cost >= '.$_POST['price_from'].' ';
			} else {
				$where .= 'f.cost >= '.$_POST['price_from'];
			}
		} else {
			unset($_POST['price_from']);
		}
		if( !empty($_POST['price_to']) ) {
			if (count($_POST) > 1) {
				$where .= 'AND f.cost <= '.$_POST['price_to'].' ';
			} else {
				$where .= 'f.cost <= '.$_POST['price_to'];
			}
		} else {
			unset($_POST['price_to']);
		}
		$sql = "SELECT * 
				FROM flat f
				INNER JOIN building b ON f.id_building = b.id_building
				INNER JOIN residential_complex rc ON b.id_residential_complex = rc.id_residential_complex WHERE ".$where;

		if (!$result = mysqli_query($link,$sql)) {
			echo $where;echo "<br/>";
			var_dump($link);
		} else {
			$items = mysqli_fetch_all($result, MYSQLI_ASSOC);
			mysqli_free_result($result);
			return $items;
		}
	}


Результат получается неожиданный:
AND f.total_area >= 60  //распечатанный остаток строки запроса - переменная $where
Ошибка синтаксиса MySql //(это ожидаемо, когда после WHERE идет сразу AND)
//И самое главное - распечатанный пост:
Array
(
    [area_from] => 60
)
1 //кол-во параметров 1! Почему не выполняется вторая часть условия, и $where не идет      
   //без AND?

Получается что один больше единицы, это бред какой-то или такой косячный код, но я уже не могу увидеть что именно не так, может быть Вы поможете еще разок?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы