首先,我想说我不是最优秀的PHP开发人员。话虽这么说,我想在我的代码上输入一些内容。我花了一个小时试图让它工作,我终于让它工作,但是,我想知道这是否是最好的方法。我问社区是因为我想成为更好的开发者。
我正在构建一个使用POST方法将值发送到搜索页面的搜索表单。然后,此页面获取值,检查条件语句,并根据结果更新查询。
这是我的代码。
搜索表单代码
echo '<form method="post" class="cat-search" action="'.esc_url( home_url( '/search' ) ).'" role="search" >
<div class="gender-fields">
<span class="label-wrap">
<input type="radio" name="gender" value="male" id="male">
<label for="male">Male</label>
</span>
<span class="label-wrap">
<input type="radio" name="gender" value="female" id="female">
<label for="female">Female</label>
</span>
<span class="label-wrap">
<input type="radio" name="gender" value="" id="both">
<label for="both">Both</label>
</span>
</div>
<select class="cat-letters" name="letter">
<option value="">Search by letter</option>';
foreach ( $categories as $category ) {
echo'<option value="'.$category->slug.'">'.$category->name.'</option>';
}
echo '</select>
<input class="search-submit" value="Search" type="submit" />
</form>';
搜索页面条件代码
$let = esc_html($_POST["letter"]);
$gen = esc_html($_POST["gender"]);
if ( !empty($_POST["gender"]) && !empty($_POST["letter"])) {
$cat_array = array($let,$gen);
$cat_string = implode("+", $cat_array);
} else if ( empty($_POST["gender"] ) ) {
$cat_string = $let;
} else {
$cat_string = $gen;
}
首先,我尝试使用isset()
函数代替empty()
,但我无法让它工作。
这是正确的方法,还是有更好的方法来达到相同的效果?
*我从未遇到过表单问题,问题出在条件语句上。
答案 0 :(得分:1)
我建议在这里使用isset
$let = esc_html(isset($_POST["letter"]) ? $_POST['letter'] : '');
$gen = esc_html(isset($_POST["gender"]) ? $_POST['gender'] : '');
因此,如果没有收到字母和性别参数,您就不会有任何PHP错误;)
详细了解ternay运营商here
答案 1 :(得分:1)
最好避免直接使用GLOBAL变量,而是获取临时变量。
$post = $_POST;
$let = esc_html(isset($post['letter']) ? $post['letter'] : '');
使用PHP 7,您可以使用operator ??
,无需检查未定义的索引:
$let = esc_html($post['letter'] ?? '');
尽可能使用(单个)''
覆盖(双)""
引号,并通过修剪检查空格
在PHP 7之前:
$post = $_POST;
$cat_array = array();
foreach(array('letter','gender') as $field){
if(isset($post[$field]) && trim(esc_html($post[$field]))){
array_push($cat_array,esc_html($post[$field]));
}
}
$cat_str = implode('+',$cat_array);
- 为什么在if语句中添加trim()?
醇>
如果用户只输入空格怎么办?您的代码将允许它,并且会破坏验证过程。
- 如果只选择一个字段,内爆函数最后不会添加+,怎么办?是因为它是一个阵列吗?
醇>
是的,implode()
将加入/连接两个或多个数组元素。
答案 2 :(得分:1)
首先,使用PHP编写HTML内容不是一个好习惯。尝试在HTML表单中将HTML与PHP分开,如下所示。
<form method="post" class="cat-search" action="<?php echo esc_url(home_url( '/search' ));?>" role="search" >
<div class="gender-fields">
<span class="label-wrap">
<input type="radio" name="gender" value="male" id="male">
<label for="male">Male</label>
</span>
<span class="label-wrap">
<input type="radio" name="gender" value="female" id="female">
<label for="female">Female</label>
</span>
<span class="label-wrap">
<input type="radio" name="gender" value="" id="both">
<label for="both">Both</label>
</span>
</div>
<select class="cat-letters" name="letter">
<option value="">Search by letter</option>
<?php foreach ( $categories as $category ) { ?>
<option value="<?php echo $category->slug;?>"><?php echo $category->name;?></option>
<?php } ?>
</select>
<input class="search-submit" value="Search" type="submit" />
</form>
然后搜索页面条件代码
$let = trim(esc_html($_POST["letter"]));
$gen = trim(esc_html($_POST["gender"]));
if ($let != "" && $gen != "") {
$cat_array = array($let,$gen);
$cat_string = implode("+", $cat_array);
} else if ($let != "") {
$cat_string = $let;
} else {
$cat_string = $gen;
}