我有一个 HTML 表单。我有四种不同类型的字段连接到数据库表,应该根据用户在 HTML 表单字段中选择的内容向用户提供结果。
我有开始日期和结束日期字段。
<div class='ddate'><p>Start Date:<input type="date" id="datepicker" name="d1" ></p></div>
<div class='ddate'><p>End Date:<input type="date" id="datepicker1" name="d2"></p></div>
日期字段将用户给定的开始日期和结束日期之间的表格中的所有行取出到 HTML 字段中。
我有并选择字段。
<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>
还有两个用于马力的输入字段。
<input type='text' name='hp1'/></br>
ДО:<input type='text' name='hp2'/></br></br>
这是我的表单,这是我的 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' OR cars.color LIKE '$col') ";
这是我的查询。它工作得很好。当我添加开始日期和结束日期时,如果我只使用其中一个字段,它会将添加日期之间的所有行与 html 表单中的任何其他字段相同。
当我使用多个时(例如我选择颜色:黑色和 120-150 之间的马力)。当我这样做时,它会带我取出所有黑色汽车和所有 120-150 马力之间的汽车,并且查询不关心 120-150 马力之间汽车的颜色和黑色汽车的马力。
我的观点是,我希望所有领域都能相互照顾。如果有一辆 HP 120-150 的黑色汽车只带我出去这辆车而不是所有黑色汽车和所有 120-150 HP 的汽车。
最佳答案
您混淆了 Sql 中的“AND”和“OR”语句。 这应该会产生魔力:
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')
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'
)
关于php - 如何使我的 HTML 表单查询同时适用于所有表单元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27320627/