Автор Тема: Как да накарм всяка част от заявката да зависи от другата ?  (Прочетена 1042 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

lfc321

  • Newbie
  • *
  • Благодарности
  • -Казани: 1
  • -Получени: 0
  • Публикации: 17
Цитат
Добре ето какъв ми е проблемът. Имам готова заявка, която се получи малко по-дълга от необходимото. Имам и 4 критерия в хтмл форма.

Две инпут полета и две селект полета. Няма смисъл да ви ги копирам при тях всичко си работи нормално. Заявката ми също работи нормано.

Целта ми е когато потребител въведе някой критерии в хтмл формата да му излизат резултатите от таблицата. Заявката ми работи нормално ако само един критерии е използван. Но когато се използват повече от един заявката чете и двата. Изкарва всички редове, които отговарят на единия зададен критерии и всички редове които отговарят на другия дори и да нямат нищо общо.

Пример:

Задавам Цвят: Зелен и задавам Размер: между 15-30 метра, заявката ми изкарва всички елементи които са зелени дори и да не са с размер между 15-30 метра и всички редове между 15-30 метра дори и да са съвсем различен цвят.

Та въпросът ми е какво да променя, за да ми изкарва само тези редове с елементи които имат зелен цвят и са между 15-30 метра?

Ето целият ми пхп файл:

Код: PHP
  1. <?php
  2. //Connection
  3. include "connect.php";
  4. header("Content-Type:text/html; charset=utf-8");
  5. $d1 = date("Y-m-d", strtotime($_POST['d1']));
  6. $d2 = date("Y-m-d", strtotime($_POST['d2']));
  7. $md = (isset($_POST['md'])) ? $_POST['md'] : '';
  8. $col = (isset($_POST['col'])) ? $_POST['col'] : '';
  9. $hp1 = $_POST['hp1'];
  10. $hp2 = $_POST['hp2'];
  11. //Query
  12. $sql = "SELECT cars.brand,cars.model,cars.reg_num,cars.horse_powers,cars.color,clients.first_name,clients.last_name
  13.        FROM cars
  14.        INNER JOIN clients_cars ON cars.id = clients_cars.cars_id
  15.        INNER JOIN clients ON clients_cars.clients_id = clients.id
  16.        WHERE cars.id IN (
  17.            SELECT DISTINCT clients_cars.cars_id
  18.            FROM clients_cars
  19.            WHERE (rent_date between '$d1' AND '$d2')
  20.                OR (return_date between '$d1' AND '$d2')
  21.                OR ((return_date > '$d2') AND (rent_date < '$d1'))
  22.                OR ((horse_powers > '$hp1') AND (horse_powers < '$hp2'))
  23.                OR cars.model LIKE '$md'
  24.                OR cars.color LIKE '$col'
  25.        )";
  26.  
  27. $result = mysqli_query($con, $sql) or die(mysqli_error($con,$sql));
  28. echo mysqli_error($con);
  29. while ($row= mysqli_fetch_array($result)){
  30.     $brand = $row['brand'];
  31.     $model = $row['model'];
  32.     $reg_num = $row['reg_num'];
  33.     $horse_powers = $row['horse_powers'];
  34.     $color = $row['color'];
  35.     $f_name = $row['first_name'];
  36.     $l_name = $row['last_name'];
  37.     echo $brand;
  38. }
  39.  

Надявам се някой да може да помогне тук ще съм му благодарен.

П.П. По възможност ако може решението да не е със стрингове ако има такъв вариант.

П.П.П. Админ: Редактирах ти поста малко, за да стане кода по-лесно четим, надявам се не възразяваш.
« Последна редакция: 06 Декември 2014, 14:10:45 от Avalanche »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
Здрасти,

Код: SQL
  1.  ...OR cars.model LIKE '$md' OR cars.color LIKE '$col'

Тази част от кода ти кара да се появяват толкова много резултати, условието трябва да е AND (задължително), а не OR (или). Тоя LIKE също може да ти яде главата.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

lfc321

  • Newbie
  • *
  • Благодарности
  • -Казани: 1
  • -Получени: 0
  • Публикации: 17
Здрасти,

Код: SQL
  1.  ...OR cars.model LIKE '$md' OR cars.color LIKE '$col'

Тази част от кода ти кара да се появяват толкова много резултати, условието трябва да е AND (задължително), а не OR (или). Тоя LIKE също може да ти яде главата.

Да, но като заменя OR с AND ми се изменя цялата заявка и не я чете правилно и ми върща празна страница.

Вместо LIKE как да го запиша ?

Нека да ви дам и хтмл формата, за да ви стане по-ясно.

Код: HTML
  1. <!DOCTYPE html>
  2.     <title>Заети коли по критерии</title>
  3.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4.     <link rel="stylesheet" href="jquery-ui.css">
  5.     <script src="jquery.min.js" type="text/javascript" ></script>
  6.     <script src="jquery-ui.js"></script>
  7. $(function() {
  8. $( "#datepicker" ).datepicker();
  9. });
  10. $(function() {
  11. $( "#datepicker1" ).datepicker();
  12. });
  13. </head>
  14.         <form method="POST" action="cars2.php">
  15.                 <fieldset>
  16.                     <legend>Rent A Car</legend>
  17.                         <div class='ddate'><p>Дата за наемане:<input type="date" id="datepicker" name="d1" ></p></div>
  18.                         <div class='ddate'><p>Дата за връщане:<input type="date" id="datepicker1" name="d2"></p></div>
  19.                        Модел: <select name='md' multiple="yes" size="10">
  20.                                 <optgroup label="Оpel">
  21.                                         <option value="Astra" name='Ast'>Astra</option>
  22.                                 </optgroup>
  23.                                 <optgroup label="Nissan">        
  24.                                         <option value="Pulsar" name='Puls'>Pulsar</option>
  25.                                         <option value="Almera" name='Alm'>Almera</option>
  26.                                 </optgroup>
  27.                                 <optgroup label="Honda">
  28.                                         <option value="Civic" name='Civ'>Civic</option>
  29.                                  </optgroup>    
  30.                                  <optgroup label="Audi">
  31.                                         <option value="Q7" name='Q'>Q7</option>                                
  32.                                 </optgroup>
  33.                                
  34.                                 <optgroup label="BMW">
  35.                                         <option value="M3" name='M'>M3</option>
  36.                                         </optgroup>
  37.                                 <optgroup label="Renault">
  38.                                         <option value="Megane" name='Meg'>Megane</option>
  39.                                         </optgroup>
  40.                                 <optgroup label="Mercedes">
  41.                                         <option value="G-Class" name='G'>G-Class</option>
  42.                                         </optgroup>
  43.                         </select></br></br>
  44.                        
  45.                         Цвят :<select name='col' size='5'>
  46.                             <option value='white' name='wh'>Бял</option>
  47.                             <option value='black' name='bl'>Черен</option>
  48.                             <option value='yellow' name='ye'>Жълт</option>
  49.                             <option value='brown' name='br'>Кафяв</option>
  50.                             <option value='grey' name='gr'>Сив</option>
  51.                         </select></br></br>
  52.                        
  53.                         Мощност в конски сили:</br>
  54.                         ОТ:<input type='text' name='hp1'/></br>
  55.                         ДО:<input type='text' name='hp2'/></br></br>
  56.                         <input type="submit" value="Провери Заети Коли" name="submit"/>
  57.                        
  58.                 </fieldset>    
  59.         </form>
  60. </body>
  61. </html>
« Последна редакция: 06 Декември 2014, 15:40:29 от lfc321 »

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Е как пък работи с един критерий?
Ако примерно rent_date е между $d1 и $d2 всички останали критерии нямат значение, защото са всичи с OR.

Примерно имаш червен трабант, който е нает на 06.12.2014. Като си изпълниш заявката със следните критерии
$d1 =  01.12.2014
$d2 =  15.12.2014
$md = запорожец
$col = жълт
правиш първата проверка (rent_date between '$d1' AND '$d2') т.е. 06.12.2014 да е между 01 и 15.12, което е вярно. Това автоматично прави цялата ти WHERE клауза вярна и ти връща червения трабант въпреки. че нито е жълт нито е зазка.

Та както виждаш нито един от двата ти критерия не се взима под внимание. 

lfc321

  • Newbie
  • *
  • Благодарности
  • -Казани: 1
  • -Получени: 0
  • Публикации: 17
Е как пък работи с един критерий?
Ако примерно rent_date е между $d1 и $d2 всички останали критерии нямат значение, защото са всичи с OR.

Примерно имаш червен трабант, който е нает на 06.12.2014. Като си изпълниш заявката със следните критерии
$d1 =  01.12.2014
$d2 =  15.12.2014
$md = запорожец
$col = жълт
правиш първата проверка (rent_date between '$d1' AND '$d2') т.е. 06.12.2014 да е между 01 и 15.12, което е вярно. Това автоматично прави цялата ти WHERE клауза вярна и ти връща червения трабант въпреки. че нито е жълт нито е зазка.

Та както виждаш нито един от двата ти критерия не се взима под внимание.

В този случай ще ми върне освен трабанта, ще ми върне и ако има други жълти коли или други зазки не зависимо от датата или от цвета.

Имах предвид, че работи ако е въведен само 1 критерий, а останалите останат празни. В формата.

Та, можеш ли да ми кажеш как да я променя, за да може примерно в твоя пример да ми връща празна заявка, защото трабанта е червен, а е зададен жълт цвят. ?

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Ами аз и вчера ти го писах и Avalanche ти го писа по-горе. Използвай AND вместо OR.
WHERE ( (rent_date between '$d1' AND '$d2') OR  ...) AND color = $col AND model = $mod

Тъй-като не знам каква ти е логиката на заявката точно, не мога да ти кажа дали скобите така поставени изпълняват желания критерий.


Като си напишеш критериите на лист хартия замести и с AND и или с OR.
                                                       OR                          AND
Искам всички дами с хубаво тяло или (прилично тяло и много пари).
« Последна редакция: 06 Декември 2014, 16:26:07 от kjufte »

lfc321

  • Newbie
  • *
  • Благодарности
  • -Казани: 1
  • -Получени: 0
  • Публикации: 17
Да, обаче някъде явно бъркам при заявката преди WHERE клаузата, тъй като когато направя навсякъде задължителни критериите ми изкарва празна заявка. Не знам защо.

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Ами трудно е да се каже кое не е правилно, когато не знаем какво точно искаш.
Аз като ти гледам кода ми се струва, че пращаш грешни критерии със заявката си.
Код: PHP
  1. <?php
  2. $md = (isset($_POST['md'])) ? $_POST['md'] : '';
  3. $col = (isset($_POST['col'])) ? $_POST['col'] : '';
...
Код: PHP
  1. OR cars.model LIKE '$md'
  2. OR cars.color LIKE '$col'


Като имаш такива опционални местенца си направи и заявката да ги съдържа опцинално. Иначе му пращаш един филтър цвета или модела да е като '' и той ти връща едно голямо нищо.
Примерно
Код: PHP
  1. $md = (isset($_POST['md'])) ? $_POST['md'] : '';
  2. $col = (isset($_POST['col'])) ? $_POST['col'] : '';
  3. $sql = "SELECT cars.brand,cars.model,cars.reg_num,cars.horse_powers,cars.color,clients.first_name,clients.last_name
  4.         FROM cars
  5.             INNER JOIN clients_cars ON cars.id = clients_cars.cars_id
  6.             INNER JOIN clients ON clients_cars.clients_id = clients.id
  7.        WHERE cars.id IN( SELECT DISTINCT clients_cars.cars_id
  8.                           FROM clients_cars
  9.                           WHERE ((rent_date between '$d1' AND '$d2') OR
  10.                                  (return_date between '$d1' AND '$d2') OR
  11.                                  (return_date > '$d2' AND rent_date < '$d1') OR
  12.                                  (horse_powers > '$hp1' AND horse_powers < '$hp2'))"
  13.                                 .(!empty($md) ? " AND cars.model = '$md'" : $md)
  14.                                 .(!empty($col) ? " AND cars.color = '$col'" : $col)
  15.                               .");";
  16.  
или нещо подобно.