За последние 24 часа нас посетили 17765 программистов и 1677 роботов. Сейчас ищут 883 программиста ...

Поиск по возрасту средствами PHP и MySQL

Тема в разделе "PHP для новичков", создана пользователем Luter1984, 4 дек 2010.

  1. Luter1984

    Luter1984 Активный пользователь

    С нами с:
    9 ноя 2010
    Сообщения:
    66
    Симпатии:
    0
    Доброго времени суток. Встретился с интересной задачкой, сообразить решение которой пока не могу.
    Есть четыре ссылки в блоке - поиск по возрасту:
    1. <a href='age.php?age=1'>Поиск до 1 года</a>;
    2. <a href='age.php?age=2'>Поиск от 1 года до 3-х лет</a>;
    3. <a href='age.php?age=3'>Поиск от 3 лет до 6</a>;
    4. <a href='age.php?age=4'>Поиск от 6 лет и выше</a>;
    Причем в age=1,age=2,age=3,age=4 - 1,2,3 и 4 вытаскиваются динамически из базы данных. Другими словами из БД вытаскиваются все поля, где age соответствует одному из значений 1,2,3 или 4. Все работает как нужно и "товар" вытаскивается для того возраста, для которого он предназначается (в зависимости от поля age). Но вся проблема состоит в том, что "товар" может быть рассчитан для возраста от 2 лет и старше (подходит для age = 2, 3 и 4) или до 3-х лет (age=1 и age=2). Как сделать грамотный поиск по возрасту, чтобы из бызы вытаскивались все товары, которые удовлетворяют ссылке?
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    PHP:
    1. <?php
    2.  
    3. $age = isset($_GET['age'])?(int)$_GET['age']:0;
    4.  
    5. if($age >= 1 && $age <=4)
    6. {
    7. $query = null;
    8.  
    9. if($age == 1) $query = "`age` < 1";
    10. elseif($age == 2) $query = "`age` IN (1,2,3)";
    11. elseif($age == 3) $query = "`age` IN (4,5,6)";
    12. elseif($age == 4)  $query = "`age` > 6";
    13.  
    14. $temp = mysql_query("SELECT FROM `table` WHERE ".$query);
    15. }
    значения уже сам подправишь
     
  3. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    как вариант, хранить возраст в виде плавающего числа
    от 2-х лет - 2.01
    от 1-го года - 1.01
    до 3-х лет - 2.99

    запрос от 1 года до 3 был бы age > 1 and age < 3.
    но этот вариант не охватывает все случаи.


    вариант лучше - хранить мин и макс число в базе в отдельных полях мин и макс:
    от двух лет - мин 2, макс 99
    до двух лет - мин 0, макс 2
    от года до трёх - мин 1, макс 3

    и запрос будет логичнее
     
  4. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    $age = array(array(0,1), array(1,3), array(3,6), array(6,500));
    mysqL_query('SELECT........ WHERE age>="'.addslashes($age[$_GET['age']][0]).'" AND age<="'.addslashes($age[$_GET['age']][1]).'";');

    Можно так, так компактнее, единственное, обусловимя на том, что люди больше 500 лет не живут))
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    опять проблемы с логикой? =)

    если стоит задача отлавливать ОТ и ДО, то и ОТ и ДО должны быть в базе прописаны :D
    иначе никак. компьютер хоть и умный, но если в базе только один age, то чему будут равны эти мистические ОТ и ДО - никак не догадается.
     
  6. Luter1984

    Luter1984 Активный пользователь

    С нами с:
    9 ноя 2010
    Сообщения:
    66
    Симпатии:
    0
    Спасибочки огромное, да логика у меня, к сожалению, действительно страдает, будем исправляться :)
     
  7. Luter1984

    Luter1984 Активный пользователь

    С нами с:
    9 ноя 2010
    Сообщения:
    66
    Симпатии:
    0
    Рановато обрадовался. Товары вытаскиваются строго для той возрастной категории к которой они относятся. Т.е. если товар_1 имеет в БД начальное значение 0, а конечное 1, а товару_2 присвоено начальное значение 0, а конечное 6, то по ссылке до 1 года вытаскивается только товар_1, а товар_2 (должен вытаскиваться по ссылкам - до 1 года, от 2 до 3 лет, от 3 до 6 лет) не появляется вообще...
    Синтаксис ссылок на странице 1:
    HTML:
    1. <div id="coolmenu0">              
    2. <div id="coolmenu1"><a href="searchage.php?miniage=0&maxiage=1">До 1 года</a></div>
    3. <div id="coolmenu2"><a href="searchage.php?miniage=1&maxiage=3">От 1 до 3 лет</a></div>
    4. <div id="coolmenu3"><a href="searchage.php?miniage=3&maxiage=6">От 3 до 6 лет</a></div>
    5. <div id="coolmenu4"><a href="searchage.php?miniage=6&maxiage=100">От 6 лет</a></div>
    6. </div>
    ...................................................................
    SQL запрос на странице searchage.php:
    /*делаем выборку из базы данных*/
    PHP:
    1. $res_searchage = mysql_query("SELECT id,cena,categorynalichie,mini_image,big_image,title
    2. FROM rubriki WHERE minvosrast >= '$miniage' AND maxvosrast <= '$maxiage' ORDER BY data DESC LIMIT $start, $num",
    3. $databasic);
    [/img]
     
  8. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Luter1984
    Используй конструкцию BETWEEN либо IN (первое лучше).
     
  9. Luter1984

    Luter1984 Активный пользователь

    С нами с:
    9 ноя 2010
    Сообщения:
    66
    Симпатии:
    0
    Совсем незнаком с конструкцией BETWEEN, если несложно, то как должен выглядеть мой запрос в данном случае
     
  10. ridraider

    ridraider Активный пользователь

    С нами с:
    23 окт 2010
    Сообщения:
    65
    Симпатии:
    0
  11. Luter1984

    Luter1984 Активный пользователь

    С нами с:
    9 ноя 2010
    Сообщения:
    66
    Симпатии:
    0
    Вариант 1:
    PHP:
    1. $res_searchage = mysql_query("SELECT id,cena,categorynalichie,mini_image,big_image,title FROM rubriki WHERE BETWEEN $miniage AND $maxiage ORDER BY data DESC LIMIT $start, $num", $databasic);
    PHP:
    1.  
    2. Ошибка:
    3. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BETWEEN 0 AND 1 ORDER BY data DESC LIMIT 0, 2' at line 1
    4. Вариант 2:
    5. [php]$res_searchage = mysql_query("SELECT id,cena,categorynalichie,mini_image,big_image,title FROM rubriki WHERE BETWEEN '$miniage' AND '$maxiage' ORDER BY data DESC LIMIT $start, $num", $databasic);
    Ошибка:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BETWEEN 1 AND 3 ORDER BY data DESC LIMIT 0, 2' at line 1[/php]
     
  12. ridraider

    ridraider Активный пользователь

    С нами с:
    23 окт 2010
    Сообщения:
    65
    Симпатии:
    0
    field BETWEEN min AND max

    Мускул пока не умеет читать мысли и не может добавить "minvosrast" в ваш запрос.
     
  13. Luter1984

    Luter1984 Активный пользователь

    С нами с:
    9 ноя 2010
    Сообщения:
    66
    Симпатии:
    0
    Все решил задачку несколько по другому:
    PHP:
    1. $res_searchage = mysql_query("SELECT id,cena,categorynalichie,mini_image,big_image,title
    2. FROM rubriki WHERE (minvosrast >= '$miniage' OR maxvosrast >= '$miniage') AND (maxvosrast <= '$maxiage' OR minvosrast <= '$maxiage') ORDER BY data DESC LIMIT $start, $num", $databasic);
    Но, тем не менее, огромное вам спасибо, за то, что сразу откликнулись :)
     
  14. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Присмотрись sql inj на лицо
     
  15. Luter1984

    Luter1984 Активный пользователь

    С нами с:
    9 ноя 2010
    Сообщения:
    66
    Симпатии:
    0
    Как она проявляется и как ее можно избежать?