基于用户选项的 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 !="" && in_array($key,$myKeysArr))
。理想情况下,您可能希望通过返回 MySql 表中的所有列名来构建 $myKeysArr,以防您要对表进行更改 - 或者想在其他地方使用此功能。以上是关于基于用户选项的 PHP 动态 SQL SELECT 语句的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP 在 html 中使用 SELECT 标记查询我的 SQL 数据库