繁体   English   中英

从动态选择框构造MySQL查询

[英]Construct mySQL query from dynamic select boxes

我已经能够使用选择框构造一个mySQL查询。 像这样从ajax开始到PHP。

html / js(相关部分)

var call = true;
  switch(parseInt($(this).val())) {
    case 1:
   cat_code ="ager";
        sortv = "database_percent";
        sorto = "asc";
    break;
    case 2:
   cat_code ="ager";
        sortv = "database_percent";
        sorto = "desc";
    break;
    default:
     cat_code ="ager";
        sortv = "value";
        sorto = "asc";

    break;
}
if(call) {
$.ajax({
        url: 'all_get_2.php',
        type: 'GET',
        dataType: 'JSON',
        data: {cat_code: cat_code, sortvalue: sortv ,sortorder:sorto},
        success: function(data) {
//stuff
}
})

PHP(相关部分...只是一个例子)

$whereCategory = isset($_GET['cat_code'])? "{$_GET['cat_code']}" : '';
$sortvalue = isset($_GET['sortvalue'])? "{$_GET['sortvalue']}" : '';
$sortorder = isset($_GET['sortorder'])? "{$_GET['sortorder']}" : '';
$sql = "select count(guid) from full_db2 where '{$whereCategory}' = '{$sortvalue}'' and example = '{$sortorder};";

$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
header('Content-type: application/json');
echo json_encode($result);

很好 我在此示例中混合了一些变量,但这不是问题。 这将返回用户从选择中选择的属性的计数。 选择是根据用户在先前选择中选择的内容动态生成的。

如果我希望用户能够选择更多属性添加到查询中,该怎么办。 因此,例如,与其查找年龄在40岁以上的数据库(用户)中的条目数(计数),不如增加年龄在40岁以上,已婚并育有孩子的用户的数量。

我考虑过基本上要添加一个选项来添加另一组选择框(例如,单击“ +”,然后会出现新的选择框),但是我很快意识到我无法弄清楚有多少选择框和逻辑创建查询的方法。

允许用户选择(理论上)无限数量的属性以在单个mySQL查询中进行构造的最佳方法是什么?

我将使用HTML <select> & <option>标记来显示各种SQL条件运算符( AND, OR, >, <, =, != )以及您的字段/表名,然后将它们连接在一起以构建查询。

如评论中所述,您可以利用name="checkbox[]"类的数组功能并将其作为HTML表单(POST或GET)提交,以简化串联。

您将希望转义并清理发送到数据库的所有内容,以避免SQL注入,因为可以在客户端编辑HTML页面。 如果不进行消毒,那么精明的用户将可以访问整个数据库。 这可以简单到验证数组内容是否与实际表名或条件运算符之一匹配,然后在不匹配的情况下丢弃就可以了。 使用mysqli::escape_stringhttp://php.net/manual/en/mysqli.real-escape-string.php )转义也是一个好主意。

在弄清几件事之后,我不得不重做这个问题。 这是我的进度,并检查已接受的答案以查看所有步骤如何一起完成:

根据从jquery传递的变量为PDO创建数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM