Как да накарм всяка част от заявката да зависи от другата ?

lfc321

Registered
Добре ето какъв ми е проблемът. Имам готова заявка, която се получи малко по-дълга от необходимото. Имам и 4 критерия в хтмл форма.

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

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

Пример:

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

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

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

Код:
<?php
//Connection
include "connect.php";
header("Content-Type:text/html; charset=utf-8");
    $d1 = date("Y-m-d", strtotime($_POST['d1']));
    $d2 = date("Y-m-d", strtotime($_POST['d2']));
    $md = (isset($_POST['md'])) ? $_POST['md'] : ''; 
    $col = (isset($_POST['col'])) ? $_POST['col'] : '';
    $hp1 = $_POST['hp1'];
    $hp2 = $_POST['hp2'];
//Query
    $sql = "SELECT cars.brand,cars.model,cars.reg_num,cars.horse_powers,cars.color,clients.first_name, clients.last_name FROM cars INNER JOIN clients_cars ON cars.id=clients_cars.cars_id INNER JOIN clients ON clients_cars.clients_id=clients.id WHERE cars.id"
            . " IN (SELECT DISTINCT clients_cars.cars_id FROM clients_cars WHERE (rent_date between '$d1' AND '$d2') OR (return_date between '$d1' AND '$d2') OR ((return_date>'$d2')AND(rent_date<'$d1')) OR ((horse_powers > '$hp1') AND (horse_powers < '$hp2')) OR cars.model LIKE '$md' OR cars.color LIKE '$col') "; 
        
   
    $result = mysqli_query($con, $sql) or die(mysqli_error($con,$sql));
         echo mysqli_error($con);
        while ($row= mysqli_fetch_array($result)){
            $brand = $row['brand'];
            $model = $row['model'];
            $reg_num = $row['reg_num'];
            $horse_powers = $row['horse_powers'];
            $color = $row['color'];
            $f_name = $row['first_name'];
            $l_name = $row['last_name'];
            echo $brand;
            
          
        }
    
?>


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


П.П. Проблемът ми не е в 'AND' u 'OR' операторите, защото ако обърна всичко в 'AND' не ми чете заявката въобще не знам защо.
 
Защо трябва да обръщаш всичко във AND ?
От това което си дал, предполагам, този ред е за избиране на цвят и модел(метра, от примера ти)
[sql]cars.model LIKE '$md' OR cars.color LIKE '$col') ";[/sql]

Предполагам този OR ако го смениш на AND, не би трябвало да има проблем
 
mapka7a каза:
Защо трябва да обръщаш всичко във AND ?
От това което си дал, предполагам, този ред е за избиране на цвят и модел(метра, от примера ти)
[sql]cars.model LIKE '$md' OR cars.color LIKE '$col') ";[/sql]

Предполагам този OR ако го смениш на AND, не би трябвало да има проблем
Дано да стане, но по-скоро му трябва един explode($delimiter,$string) и да ползва foreach за да обходи всеки въведен параметър. Коя променлива ти връща въпросните параметри и какво ги разделя примерно :
зелен|15-30 или зелен 15-30 ?
 
PHP:
$sql = "
SELECT cars.brand,cars.model,
    cars.reg_num,cars.horse_powers,
    cars.color,clients.first_name,
    clients.last_name
FROM cars
INNER JOIN clients_cars
ON cars.id = clients_cars.cars_id
INNER JOIN clients
ON clients_cars.clients_id = clients.id
WHERE cars.id IN
    (SELECT DISTINCT clients_cars.cars_id
    FROM clients_cars
    WHERE (rent_date between '".$d1."' AND '".$d2."')
    OR (return_date between '".$d1."' AND '".$d2."')
    OR (return_date > '".$d2."' AND rent_date < '".$d1."')
    OR (horse_powers > '".$hp1."' AND horse_powers < '".$hp2."')
    OR (cars.model LIKE '".$md."' AND cars.color LIKE '".$col."'))";
 
PHP:
$sql = "
SELECT cars.brand,cars.model,
    cars.reg_num,cars.horse_powers,
    cars.color,clients.first_name,
    clients.last_name
FROM cars
INNER JOIN clients_cars
ON cars.id = clients_cars.cars_id
INNER JOIN clients
ON clients_cars.clients_id = clients.id
WHERE cars.id IN
    (SELECT DISTINCT clients_cars.cars_id
    FROM clients_cars
    WHERE ((rent_date between '".$d1."' AND '".$d2."')
    OR (return_date between '".$d1."' AND '".$d2."')
    OR (return_date > '".$d2."' AND rent_date < '".$d1."')
    OR (horse_powers > '".$hp1."' AND horse_powers < '".$hp2."'))
    AND cars.model LIKE '".$md."' AND cars.color LIKE '".$col."')";
Пробвай така $md каква стойност има примерно?
 
$md е променлива, която заема стойност от селект форма. Ето и хтмл формата ми.


Код:
<!DOCTYPE html>
<head>
    <title>Заети коли по критерии</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" href="jquery-ui.css">
    <script src="jquery.min.js" type="text/javascript" ></script>
    <script src="jquery-ui.js"></script>
<script>
$(function() {
$( "#datepicker" ).datepicker();
});
$(function() {
$( "#datepicker1" ).datepicker();
});
</script>
</head>
<body>
	<form method="POST" action="cars2.php">
		<fieldset>
                    <legend>Rent A Car</legend>
			<div class='ddate'><p>Дата за наемане:<input type="date" id="datepicker" name="d1" ></p></div>
                        <div class='ddate'><p>Дата за връщане:<input type="date" id="datepicker1" name="d2"></p></div>
                       Модел: <select name='md' multiple="yes" size="10">
				<optgroup label="Оpel">
					<option value="Astra" name='Ast'>Astra</option>
                                </optgroup>
                                <optgroup label="Nissan">        
					<option value="Pulsar" name='Puls'>Pulsar</option>
					<option value="Almera" name='Alm'>Almera</option>
				</optgroup>
				<optgroup label="Honda">
					<option value="Civic" name='Civ'>Civic</option>
                                 </optgroup>     
                                 <optgroup label="Audi">
					<option value="Q7" name='Q'>Q7</option>					
				</optgroup>
                                
				<optgroup label="BMW">
					<option value="M3" name='M'>M3</option>
					</optgroup>
                                <optgroup label="Renault">
                                        <option value="Megane" name='Meg'>Megane</option>
					</optgroup>
                                <optgroup label="Mercedes">
                                        <option value="G-Class" name='G'>G-Class</option>
                                        </optgroup>
                        </select></br></br>
                        
                        Цвят :<select name='col' size='5'>
                            <option value='white' name='wh'>Бял</option>
                            <option value='black' name='bl'>Черен</option>
                            <option value='yellow' name='ye'>Жълт</option>
                            <option value='brown' name='br'>Кафяв</option>
                            <option value='grey' name='gr'>Сив</option>
                        </select></br></br>
                        
                        Мощност в конски сили:</br>
                        ОТ:<input type='text' name='hp1'/></br>
                        ДО:<input type='text' name='hp2'/></br></br>
                        <input type="submit" value="Провери Заети Коли" name="submit"/>
                        
                </fieldset>	
	</form>
</body>
</html>

Дака, как ще се получи с експлоуд функция. Не ми е много ясно там как става. По принцип не съм работил със стрингове до сега много са ми неясни и затова заявката ми е такава дърварска.
 
Ти никаде не задаваш колко метра да е колата трябват ти допълнително полета/селекти за това и полета в базата данни за minMetra, maxMetra
 
Не не то това беше просто пример смисъл, за да го опростя малко иначе нямам размери.

То е като форма за сайт за рента кар. Смисъл имам Дата на наемане , дата на връщане, цвят , конски сили, модел и марка.

И искам когато потребителя въведе комплекс от параметри (няколко заедно, а не само 1 ) да ми изведе всички коли, които отговарят на абсолютно всички зададени от потребителя критерии.

Малко куцо ви обясних в началото. Надявам се да сте ме разбрали сега.
 
Ти използваш IN там където трябва, сега трябва да оптимизираш заявката която ти връща id-тата
[sql]SELECT DISTINCT clients_cars.cars_id
FROM clients_cars
WHERE (rent_date between '".$d1."' AND '".$d2."')
OR (return_date between '".$d1."' AND '".$d2."')
OR (return_date > '".$d2."' AND rent_date < '".$d1."')
OR (horse_powers > '".$hp1."' AND horse_powers < '".$hp2."')
OR cars.model LIKE '".$md."'
OR cars.color LIKE '".$col."'
OR (min_metra >= '".$min."' AND max_metra <= '".$max."')[/sql]
 
d_badboy каза:
Ти използваш IN там където трябва, сега трябва да оптимизираш заявката която ти връща id-тата
[sql]SELECT DISTINCT clients_cars.cars_id
FROM clients_cars
WHERE (rent_date between '".$d1."' AND '".$d2."')
OR (return_date between '".$d1."' AND '".$d2."')
OR (return_date > '".$d2."' AND rent_date < '".$d1."')
OR (horse_powers > '".$hp1."' AND horse_powers < '".$hp2."')
OR cars.model LIKE '".$md."'
OR cars.color LIKE '".$col."'
OR (min_metra >= '".$min."' AND max_metra <= '".$max."')[/sql]


Не аз нямам размери на колите и в таблицата. Виж по-горното ми мнение преди това за "IN".
 
Видях по горния ти коментар и не мисля че трябва да използваш IN в подзаявката. Първоначалната ти заявка в случая е правилна. Трябва да уточниш кое точно не ти връща правилно.
[sql]SELECT clients_cars.cars_id
FROM clients_cars
WHERE (
(rent_date between '".$d1."' AND '".$d2."')
OR (return_date between '".$d1."' AND '".$d2."')
OR (return_date > '".$d2."' AND rent_date < '".$d1."')
OR (horse_powers > '".$hp1."' AND horse_powers < '".$hp2."')
OR cars.model LIKE '".$md."'
OR cars.color LIKE '".$col."'
OR незадължителен параметър
)
AND задължителен параметър[/sql]
id би трябвало да ти е първичен ключ в такъв случай не трябва да използваш DISTINCT според мене. Пробвай различни варианти само за тази заявка в phpmyadmin :)
 
Връща ми всичко точно. Всеки параметър ми го връща, както трябва ако е въведен само един параметър. Ако се въведат два или повече заявката ги филтрира по отделно. И ми връща всички редове, които имат единия въведен критерии и всички редове които имат другия въведен критерии. Там ми е проблемът искам да ми филтрира изведен резултати през всичките въведени критерии заедно, а не по отделно.
 
Според това което писа последно заявката трябва да изглежда така че всички параметри да са задалжителни
[sql]SELECT cars.brand,cars.model,
cars.reg_num,cars.horse_powers,
cars.color,clients.first_name,
clients.last_name
FROM cars
INNER JOIN clients_cars
ON cars.id = clients_cars.cars_id
INNER JOIN clients
ON clients_cars.clients_id = clients.id
WHERE cars.id IN
(SELECT clients_cars.cars_id
FROM clients_cars
WHERE
(rent_date between '".$d1."' AND '".$d2."')
AND (return_date between '".$d1."' AND '".$d2."')
AND (return_date > '".$d2."' AND rent_date < '".$d1."')
AND (horse_powers > '".$hp1."' AND horse_powers < '".$hp2."')
AND cars.model LIKE '".$md."'
AND cars.color LIKE '".$col."')[/sql]
 
Да, обаче някъде явно бъркам при заявката преди WHERE клаузата, тъй като когато направя навсякъде задължителни критериите ми изкарва празна заявка. Нз защо.
 

Back
Горе