Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: помогите с запросом  (Прочитано 422 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн nightmaredess

  • Автор темы
  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
помогите с запросом
« : 06 Май 2010, 13:25:19 »
Мне нужно построить запрос к базе(Oracle) таким образом что бы при отсутствии параметра выборки параметр не учитывался. То есть например SELECT * FROM table WHERE id = $_POST['id'] AND name = $_POST['name'];
Если параметр $_POST['name'] не приходит то нужно сделать так что бы он не учитывался или тоже самое с параметром $_POST['id'].

Заранее спасибо

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: помогите с запросом
« Ответ #1 : 06 Май 2010, 13:36:39 »
при отсутствии параметра выборки параметр не учитывался.
Решай средствами языка, с помощью которого передаётся запрос.

WHERE id = $_POST['id'] AND name = $_POST['name'];
А отмывать от инъекций post-данные кто будет?

Оффлайн nightmaredess

  • Автор темы
  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: помогите с запросом
« Ответ #2 : 06 Май 2010, 13:59:12 »
ну отмывает там специальный класс. Я пример набросал по быстрому что бы без лишнего геморроя. буду пробовать. Спасибо что откликнулся.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: помогите с запросом
« Ответ #3 : 06 Май 2010, 14:02:18 »
$query = "SELECT * FROM table"
$filters = array()
if ( isset($_POST['name']) ) {
   $filter = array();
   $filter['name'] = 'name';
   $filter['value'] = protectMePleaseFromSQLInjections($_POST['name']);
   $filters[] = $filter;
}
if ( isset($_POST['id']) ) {
   $filter = array();
   $filter['name'] = 'id';
   $filter['value'] = protectMePleaseFromSQLInjections($_POST['id']);
   $filters[] = $filter;
}
if ( size($filters) != 0 ) {
   $query += " WHERE";
   объеденяем все фильтры в строку ($filter['name'] = $filter['value']) AND ($nextfilter['name'].....)
}
Как-то примерно вот так.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
Re: помогите с запросом
« Ответ #4 : 06 Май 2010, 14:08:47 »
В общем виде.
По правильному принятые данные надо проверить по каким-то критериям и по результатам сделать варианты запросов или выкинуть сообщение о недопустимости таких параметров.

Оффлайн nightmaredess

  • Автор темы
  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: помогите с запросом
« Ответ #5 : 06 Май 2010, 14:18:18 »
$query += " WHERE"; - ну на самом деле эта строчка тоже работать не будет  ;) так как склеивание строк символ "."  ;)

isset() - тоже не подойдет так как переменная будет создаваться в любом случае просто она будет пустой. попробую empty
« Последнее редактирование: 06 Май 2010, 14:21:15 от nightmaredess »

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: помогите с запросом
« Ответ #6 : 06 Май 2010, 14:35:25 »
$query += " WHERE"; - ну на самом деле эта строчка тоже работать не будет  ;) так как склеивание строк символ "."  ;)
$query .= " WHERE";

isset() - тоже не подойдет так как переменная будет создаваться в любом случае просто она будет пустой. попробую empty
isset($_POST['name']) && $_POST['name'] != ""

Оффлайн nightmaredess

  • Автор темы
  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: помогите с запросом
« Ответ #7 : 06 Май 2010, 14:44:00 »
Да и ещё функции size() нету используется функция count()
« Последнее редактирование: 06 Май 2010, 14:49:57 от nightmaredess »

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: помогите с запросом
« Ответ #8 : 06 Май 2010, 14:51:00 »
isset($_POST['name']) && $_POST['name'] != "" - зачем выдумывать велосипед и не проще ли написать if(!empty($_POST['name'])) =)
1. При доступе к неициализированной переменной сыпятся варнинги, проверка по isset позволяет проверить этот момент.
2. Функция empty() значения string "0", int 0, NULL, FALSE интерпретирует как пустую строку, что может только навредить.

Оффлайн jack_solovey

  • Активист
  • *
  • Сообщений: 701
  • Mate, и никаких Unity
    • Просмотр профиля
Re: помогите с запросом
« Ответ #9 : 06 Май 2010, 14:53:48 »
Мне нужно построить запрос к базе(Oracle) таким образом что бы при отсутствии параметра выборки параметр не учитывался. То есть например SELECT * FROM table WHERE id = $_POST['id'] AND name = $_POST['name'];
Если параметр $_POST['name'] не приходит то нужно сделать так что бы он не учитывался или тоже самое с параметром $_POST['id'].

Заранее спасибо

Не владею синтаксисом Оракла,
но в T-SQL выглядит просто до примитива

set @id = :paramID
set @name = :paramName
SELECT * FROM table WHERE (id = @id OR @id=null ) AND (name = @name OR @name=null)
На работе Mint18.3+Mate и Win8+ClassicShell в VirtualBOX.
Дома Mint18.3+MATE.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: помогите с запросом
« Ответ #10 : 06 Май 2010, 16:02:18 »
То что я написал и не претендует на правильность. Это только идея. Так что править там действительно много чего надо.
Цитировать
В общем виде.
По правильному принятые данные надо проверить по каким-то критериям и по результатам сделать варианты запросов или выкинуть сообщение о недопустимости таких параметров.
Пять фильтров для таблицы с возможностью сортировки по любой из колонок это 32*2*(количество столбцов) "разных" SQL запросов. Для себя я решил всё с помощью подобного алгоритма. Который я могу использовать для всех таблиц в своём приложении. Приходиться извращаться и жалеть, что я не могу использовать Hibernate Criteria API так как жёстко привязан к JPA EntityManager.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
Re: помогите с запросом
« Ответ #11 : 07 Май 2010, 08:22:37 »
Некоторые меры для простоты формирования запросов.
1. Я для запросов использую комбобоксы допустимых вариантов выбора из БД, причем они тоже выбираются из БД.
Пользователю проще выбрать, чем что-то придумывать.
2. Еще на этапе заполнения запроса можно использовать промты и алерты для устранения заведомо странных запросов (клиентская часть -jquery).
3. Доп проверка при передаче формы (клиентская часть - jquery).
Если получается много вариантов запроса никто не запрещает формировать запрос пословно, добавляя или не добавляя что-то (серверная часть - php).

Оффлайн nightmaredess

  • Автор темы
  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: помогите с запросом
« Ответ #12 : 07 Май 2010, 14:04:01 »
VestniK - спасибо! Алгоритм до ужаса прост но работает хорошо ;) Я его немного модернизировал но не существенно =)

 

Страница сгенерирована за 0.06 секунд. Запросов: 24.