基于用户选项的 PHP 动态 SQL SELECT 语句

Posted

技术标签:

【中文标题】基于用户选项的 PHP 动态 SQL SELECT 语句【英文标题】:Dynamic SQL SELECT Statement with PHP based on user options 【发布时间】:2013-01-23 13:31:04 【问题描述】:

首先我想提一下,我一直在疯狂地尝试和寻找解决方案,但到目前为止还没有运气。我的问题如下:

我有一个包含几十行的 mysql 数据库,我创建了一个 jQuery 网格来显示数据;这个页面已经在工作了。 根据要求,我正在整理一个页面,人们可以在其中从复选框中选择几个选项并过滤结果。这就是它的工作原理:

第 1 页将有 3 组复选框(姓名、地点、语言),每组都有不同的选项([姓名:大卫、尼克等]、[地点:纽约、华盛顿、孟买、伦敦、迈阿密]、 [语言:英语,西班牙语]。一旦用户选择了他的选项,它将提交一个类似这样的表单

grid.php?location=Washington&location=Mumbai&language=English&name=David

创建字符串很容易,但接收器将获取此参数并将其放入数组中以创建 SQL 语句,这就是我苦苦挣扎的地方。

我尝试过这样的事情:

$location= $_GET['location'];
$language= $_GET['language'];
$name= $_GET['name'];

if($location!="")
    $where[] = 'location=';
    $where_args[] = $location;

//same code for the other 2 options

$where_clause = implode(' OR ', $where_args);

$sql_json = "SELECT * FROM myTable WHERE $where_clause ORDER BY id DESC";

没有一个选项是强制性的,因此查询需要接受该值可能设置也可能不设置的可能性,因此它最终可能类似于 grid.php?language=English。

我知道上面的代码不太好用,但如果有人能指出正确的方向,我将不胜感激。

【问题讨论】:

那么,他可以选择多个位置吗?因为您的表单提交示例显示如此。 正确。 Kristen 下面的代码有效,但不适用于我目前的情况。我提到不仅变量有时可以为空(不传递),而且在我创建 SELECT SQL 语句时所有变量都可以重复。该变量可能如下所示: grid.php?location=Washington&location=Mumbai&language=English&name=David&name=Mario 请注意 2 个“名称”变量和 2 个“位置”。 Kristen 的代码有效,但不适用于数组,因为最后一个变量将覆盖其他变量,这意味着我可以传递“Mario”但不能传递“David”。还有什么建议吗? 您是否尝试过通过 $_SERVER['QUERY_STRING'] 而不是 $_GET 访问获取值? $_GET 方式将只返回一个特定名称的最后一个值。并且 $_SERVER['QUERY_STRING'] 将返回整个字符串,可以对其进行拆分和操作。请参阅此链接:***.com/questions/2605414/…。 这正是我最终使用 $_SERVER['QUERY_STRING'] 遍历数组所做的事情。感谢 Mt.Schneiders 和 @Akam,这个社区很震撼!! 【参考方案1】:

试试这个:

<?php
$location= $_GET['location'];
$language= $_GET['language'];
$name= $_GET['name'];

if($location!="")
    $where[] = " `location` = '".mysql_real_escape_string($location)."'";

if($language!="")
    $where[] = " `language` = '".mysql_real_escape_string($language)."'";

if($name!="")
    $where[] = " `name` = '".mysql_real_escape_string($name)."'";

$where_clause = implode(' OR ', $where);
//same code for the other 2 options

$sql_json = "SELECT * FROM myTable WHERE $where_clause ORDER BY id DESC";
?>

【讨论】:

伙计们,我正在参加一个会议,所以我没有机会尝试你们的解决方案。我现在正在测试。感谢您的帮助!!! 我会将 $name = $_GET['name'] 更改为 if(isset($_GET['name'])$name = $_GET['name'] 只是为了良好的实践。 完美。谢谢。【参考方案2】:

您总是可以遍历 $_GET 并获取带有值的键,所以:

foreach ($_GET as $key=>$val) 
   if ($val != "") 
      $where_args[] = "$key='$val'";
  
 
$where_clause = implode(' OR ', $where_args);

不过,您可能希望进行比上述示例更好的验证,如果您需要对特定值执行检查,可以添加 select/case 语句...

【讨论】:

各位,感谢大家的帮助。我遇到了另一个问题。我现在面临的问题是,由于我使用 $_SERVER['QUERY_STRING'] 从 URL 中获取所有值,因此它正在捕获 jQxGrid 发送额外变量的所有额外值: grid.php?location=Miami&location= Orlando&language=english&name=David&filterscount=0&groupscount=0&pagenum=0&pagesize=20&recordstartindex=0&recordendindex=18 如何忽略这些变量?我尝试了 unset 和 array_diff ,但我可能没有使用正确的语法,因为两者都不起作用。额外的东西从 &filterscount 开始。 @Akam 如果您知道您想要哪些字段并且它们不会更改,您可以使用这些字段构建一个数组,即$myKeysArr = array('location','language',...);,然后通过更改@987654323 行来检查特定键是否有效@ 到 if ($val !="" &amp;&amp; in_array($key,$myKeysArr)) 。理想情况下,您可能希望通过返回 MySql 表中的所有列名来构建 $myKeysArr,以防您要对表进行更改 - 或者想在其他地方使用此功能。

以上是关于基于用户选项的 PHP 动态 SQL SELECT 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 在 html 中使用 SELECT 标记查询我的 SQL 数据库

带有动态 ajax url 选项的 ng2-select2

动态添加选项到 select2

如何根据选项类动态过滤 select2 列表

使用 select2 4.0.3 创建下拉数组并禁用基于其他 select2 值的选项

单击某些按钮后select2中的动态选项