我需要一个php脚本,它将使用表单复选框的值作为MySQL查询来检索数据。我想我需要在查询中使用WHERE和OR运算符。
我的PHP和MySql级别是初学者。
<form id="form1" name="form1" method="post" action="">
<p>
<h3>story</h3>
<label><input type="checkbox" name="story" value="1" id="story_1" />one story</label>
<label><input type="checkbox" name="story" value="2" id="story_2" />two story</label>
</p>
<p>
<h3>bedrooms</h3>
<label><input type="checkbox" name="bedroom" value="2" id="bed_2" />two beds</label>
<label><input type="checkbox" name="bedroom" value="3" id="bed_3" />three beds</label>
<label><input type="checkbox" name="bedroom" value="4" id="bed_4" />four beds</label>
</p>
<p>
<h3>baths</h3>
<label><input type="checkbox" name="bath" value="1" id="bath_1" />one bath</label>
<label><input type="checkbox" name="bath" value="2" id="bath_2" />two baths</label>
<label><input type="checkbox" name="bath" value="3" id="bath_3" />three baths</label>
</p>
<input type="submit" name="search" value="search" />
</form>
到目前为止我的查询
SELECT * FROM homes WHERE story='1' OR story='2' OR bed='3' OR baths='3'
因此,如果没有选中复选框,则根本不会添加任何WHERE子句,它将默认检索所有记录。
答案 0 :(得分:2)
使用select语句,因为你有这么多或那么会导致问题。
SELECT * FROM homes WHERE story='1' OR story='2' OR bed='3' OR baths='3'
这将产生所有房屋 故事= 1,任何数量的浴室或卧室。 故事= 2,任何数量的浴室或卧室。 床= 3,任何数量的故事或浴室 浴缸= 3,任何数量的床或浴缸
所以你可能最终得到所有家庭的结果
你应该做的是用parens分隔出不同的类型,并在它们之间使用AND。
SELECT * FROM homes WHERE (story='1' OR story='2') and (bed='3') and (baths='3')
或更复杂的查询,如下所示。
SELECT * FROM homes WHERE (story='1' OR story='2')
and (bed='3' OR bed = '4')
and (baths='3' OR baths='4')
会产生一个故事为1或2,卧室为3或4,浴室为3或4的结果。你不会得到任何3层楼的房子,你不会得到任何2卧室的房子,你不会得到2间浴室。
我认为这样做会。
答案 1 :(得分:2)
您可以通过使用相同的内容命名输入,然后使用方括号来获取数组中的所有选定值:
HTML:
&lt; input type =“checkbox”name =“bed []”value =“1”/&gt;一卧室
&lt; input type =“checkbox”name =“bed []”value =“2”/&gt;两间卧室
然后,您可以在WHERE子句中使用mysql IN() function。 PHP:
$aBeds = $_POST['bed']; // array (1,2) if both are checked
$aBeds = array_map ('intval', $aBeds); // filter with intval for sql injection
$sBeds = implode (',', $aBeds); // "1,2" if both are checked
$query = "SELECT * FROM homes WHERE bed IN($sBeds) and ...";
注意:我在那里做了一些快速和脏的输入过滤,但请注意,这可能不是避免SQL注入的最佳方法。最好使用数据访问层,预处理语句或其他一些通用方案,其中每个查询都不需要自己的过滤代码。
答案 2 :(得分:1)
您需要在HTML中的每个输入上都有唯一的“名称”属性。表单发布后,将发送到“action”属性的URL地址。你有空白,所以你可能想把它发送到“something.php”并在服务器上有一个同名的PHP文件。
如果空($ _ POST)返回True,您将知道表单是否已发布到PHP文件。此变量保存表单中的已发布数据。
每个输入标记的name属性将在$ _POST全局变量中创建一个数组条目。因此,如果启用了复选框,$ _POST [“bath_1”]将为1。
有许多不同的方法可以将$ _POST数据转换为SQL语句,以满足您的需求。我建议首先处理发布的数据,然后返回一个与处理数组和生成SQL语句相关的更具体的问题。
答案 3 :(得分:1)
我为注射攻击避免添加了一些额外内容。
$query = 'SELECT * FROM homes WHERE 1';
// Protect against injection attacks
$valid_responses = array(
'story' => array(
'1','2'),
'bedroom' => array(
'2','3','4'),
'bath_1' => array(
'1','2','3'),
);
foreach ($valid_responses as $field=>$values) {
$selection = array_intersect($_POST[$field],$values);
if (!empty($selection)) {
$query .= ' AND ' . $field . ' IN (' . implode(',',$selection) . ')';
}
}