@Ayk72

Как обработать данные?

Доброй ночи!

Не могу понять, как обработать данные.
Суть в том, что есть n-ое количество пар полей в форме:

<input type="text" name="text[god][1]" value="">
<input type="text" name="text[god][2]" value="">


Где:
god - название поля
1, 2 - значения поля

Таких пар может быть очень много, и все они имеют уникальные названия, т.е. god.

Задача обработать их и вывести в запросе where sql.

Я делал так по-разному, но всегда если у поля [1] нет пары, то он берет значение [2] с поля другого названия поля god:

foreach ($_POST["text"] as $key3 => $value3) {
foreach ($value3 as $key4 => $value4) {
if($value4 != '') { 
if($key4 == 1) $wheres1 = $key3.' >= '.$value4;
if($key4 == 2) $wheres2 = $key3.' <= '.$value4;
}
}

if ($wheres1!='' && $wheres2!='') {
$wheres = '('.$wheres1.' AND '.$wheres2.')';
}else{
if($wheres1!='') $wheres = $wheres1;
if($wheres2!='') $wheres = $wheres2;
}
}


Скажите, как это все хорошо обработать? Чтобы если у поля [1] нет пары, он у другого поля не брал значение. И вставить это все в sql запрос where.

Заранее спасибо!!!
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Wol_fi
php, js, mysql, highload
Для начала я бы рекомендовал ознакомиться с prepared statements - php.net/manual/ru/pdo.prepared-statements.php
И потом, воспользоваться каким-нибудь билдером запросов, наподобие framework.zend.com/manual/current/en/modules/zend....
и использовать его примерно так:
if ($condition) {
   $query->where('blabla = ?', $blabla)
} else {
   $query->where('foo = ?', $foo);
}
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Допустим, ваш запрос я собрал
$test_data['text']['god'][1] = 1234;
$test_data['text']['god'][2] = 5678;
$test_data['text']['cat'][1] = 111;
$test_data['text']['cat'][2] = 222;
$test_data['text']['meow'][2] = 888; // there is only one "meow"

$conditions = [];
foreach ($test_data['text'] as $fieldname => $values) {
	$subconditions = [];
	if (!empty($values[1])) $subconditions[] = $fieldname." >= ".intval($values[1]);
	if (!empty($values[2])) $subconditions[] = $fieldname." <= ".intval($values[2]);
	if(!empty($subconditions)) $conditions[] = '('.implode(' AND ', $subconditions).")\n";
}
$sql = "SELECT * FROM tbl_name\n";
if (!empty($conditions)) $sql .= 'WHERE '.implode(' AND ', $conditions);
echo '<pre>' . $sql;
/*
SELECT * FROM tbl_name
WHERE (god >= 1234 AND god <= 5678)
 AND (cat >= 111 AND cat <= 222)
 AND (meow <= 888)
*/

Демо: codepad.viper-7.com/ukJK5V

Но это прокатит только если вы тренируетесь где-то у себя на локальном сервере. А вообще ТАК ДЕЛАТЬ НЕЛЬЗЯ потому что возможны sql инъекции.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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