基于if条件优化PHP变量
我有一个用户页面,默认情况下系统中的所有用户都显示在该页面中 我正在尝试应用过滤器,以便用户可以优化对用户的搜索。例如,查看所有男性用户 默认情况下,要在基于if条件优化PHP变量,php,mysql,Php,Mysql,我有一个用户页面,默认情况下系统中的所有用户都显示在该页面中 我正在尝试应用过滤器,以便用户可以优化对用户的搜索。例如,查看所有男性用户 默认情况下,要在users.php上显示所有用户,我在默认情况下运行此查询: $get_all_users = "SELECT * FROM users"; 但是,例如,当一个用户选择了要查看系统上所有女性用户时,我想运行此查询(示例): 但由于某些原因,默认情况下显示所有用户的查询总是在执行。我的做法如下: // get gender from radio
users.php
上显示所有用户,我在默认情况下运行此查询:
$get_all_users = "SELECT * FROM users";
但是,例如,当一个用户选择了要查看系统上所有女性用户时,我想运行此查询(示例):
但由于某些原因,默认情况下显示所有用户的查询总是在执行。我的做法如下:
// get gender from radio buttons
$refined_gender = htmlentities (strip_tags(@$_POST['gender']));
$get_all_users = "SELECT * FROM users";
if (isset($_POST['submit'])){
if (isset($_POST['gender'])) {
if ($refined_gender){
$get_all_users = "SELECT * FROM users WHERE gender = '$refined_gender'";
}
}
}
比如我会构建WHERE子句(至少是这样的) 未测试
$get_all_users = "SELECT * FROM users" . buildWhereClause($_POST);
function buildWhereClause($_POST) {
$where = 'WHERE 1=1';
foreach($_POST as $k => $v) {
//check if $v is valid with a different function
switch($k) {
case 'gender':
$where .= sprintf('AND `gender` = `%s`', $v);
break;
case 'age':
$where .= sprintf('AND `age` = %d', $v);
break;
}
}
return $where;
}
这是一个非常蹩脚的函数,不应按原样使用。作为一个例子,它可能导致。我相信有聪明的方法可以做到这一点,而且你并不总是想要一个
和1。您是否已验证(var\u dump($\u POST)
)这两项是否已实际设置?2.这可能不是它现在不起作用的原因,但是htmlentities
和strip\u标记
不适合转义SQL查询的输入。之所以要执行@$\u POST['gender']
是因为有一个恼人的警告,警告您POST数组中不存在此键。那么,为什么不事先检查一下,然后在其他地方构建WHERE子句,在这里检查(在一个switch案例中)用户在前端选择了什么。1/2这意味着,在未来,有了更多的过滤器,你就有了一个大的if-else结构,这很难让人注意到。因此,有一个功能构建,这是一个更好的方法。此外,它还将消除过程中的重复代码。2/2为什么不加载页面上的所有内容,并根据用户选择使用客户端筛选器显示/隐藏内容。例如,当您将结果回显到页面中时,将性别设置为每个条目的类,然后在用户选择中切换要显示/隐藏的类这样做的两个好处是减少了服务器负载,并加快了向用户显示过滤结果的速度。然后,您可以在中添加其他筛选器(例如,所有名为“Bob”的人都可以在客户端进行筛选,而无需另一个查询。是否需要在“@$\u POST['gender']”旁边添加“@”?我从未见过这样的用法,因此这可能是个问题。
$get_all_users = "SELECT * FROM users" . buildWhereClause($_POST);
function buildWhereClause($_POST) {
$where = 'WHERE 1=1';
foreach($_POST as $k => $v) {
//check if $v is valid with a different function
switch($k) {
case 'gender':
$where .= sprintf('AND `gender` = `%s`', $v);
break;
case 'age':
$where .= sprintf('AND `age` = %d', $v);
break;
}
}
return $where;
}