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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

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

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

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
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

  • Активист
  • *
  • Сообщений: 900
  • 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)

Оффлайн VestniK

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

Оффлайн alexander.pronin

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

Оффлайн nightmaredess

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

 

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