• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Организация поиска в БД по параметрам введенным в форме

  • Автор темы prosto_lynx
  • Дата начала
P

prosto_lynx

Как грамотнее сделать обработку формы для поиска по параметрам в базе данных (я использую MySQL)?..
Т.е.:
Например есть интернет магазин, где множество разных товаров и форма для поиска, в которой вводишь, например, цвет и высоту товара...
Тогда в обработчике формы (т.е. в файле php, который обрабатывается по нажатии submit) пишу:

PHP:
if (isset($_POST['color']))
{
if (isset($_POST['height']))
$result = mysql_query ("select * from tpredl where system='{$_POST['color']}' and city='{$_POST['height']}';");
else
$result = mysql_query ("select * from tpredl where system='{$_POST['color']}';");
}
else
{
if (isset($_POST['city']))
$result = mysql_query ("select * from tpredl where city='{$_POST['height']}';");
else
$result = mysql_query ("select * from tpredl;");
}

Но такой способ уж очень громоздкий получается... (и с добавлением каждого нового параметра размер кода увеличивается в 2 раза...)
Как проще решить этот вопрос?...
 
H

hosm

в качестве идеи, сам язык не знаю=)
пхп не позволяет задать массив, хранящий соответствие имен полей $_POST (на форме пост-запроса - 'color' и т.д.) и БД (system и т.д.) и потом пройтись по элементам этого массива, проверяя, задано ли значение у поля (isset), получить значение поля в БД и подкорректировать условие Where запроса к БД? (для первого условия дописать where, для последующих - and)
просто всё еще зависит от логики сочетания условий.
и еще - так копипакостничать не стоит:
("select * from tpredl where city='{$_POST['height']}';");
а также задавать вопросы в теме, где выкладываются уже готовые решения.
 
A

acorn

ой, ваш сайт так сразу улетит если в посте будет часть sql-кода..

в помощь могу дать одну из функции одного старого проекта (урезанную):

PHP:
	public function get($params = array()) {
$id = null;
$system = null;
$type = null;
...................

extract($params, EXTR_IF_EXISTS);

list($id, ) = pca($id, 'intval');
list($system,) = pca($system, array($this->db, 'escape'), true);
list($type, ) = pca($type, 'intval');
........................

$where = '';
$where .= $id ? ($where ? ' AND ' : '') . 'MDL.id IN (' . $id . ')' : '';
$where .= $system ? ($where ? ' AND ' : '') . 'MDL.system IN (' . $system . ')' : '';
$where .= $type ? ($where ? ' AND ' : '') . 'MDL.type IN (' . $type . ')' : '';
..............

$query = '
SELECT
fields
FROM
%prefix%table AS table'
. ($where ? '
WHERE
' . $where : '')
. ($order ? '
ORDER BY
' . $order : '');
return $this->db->select($query, $params);
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!