0

0

将DevExtreme过滤数组转换为MySQL WHERE条件语句

碧海醫心

碧海醫心

发布时间:2025-09-23 14:24:01

|

536人浏览过

|

来源于php中文网

原创

将DevExtreme过滤数组转换为MySQL WHERE条件语句

本文详细介绍了如何使用PHP将DevExtreme等前端框架生成的类NoSQL过滤数组动态转换为标准的MySQL WHERE条件语句。教程提供了基于PDO和MySQLi两种数据库扩展的实现方法,包括如何安全地构建SQL查询字符串和参数,以有效防止SQL注入,并确保字段名和值的正确处理,从而实现灵活的数据查询功能。

1. 理解DevExtreme过滤数组结构

devextreme等前端数据网格组件在进行远程数据过滤时,通常会发送一个结构化的json对象,其中包含一个filter字段。这个filter字段是一个数组,它以一种类似lisp或nosql的语法来表达过滤条件。例如:

{
  "from": "get_data",
  "skip": 0,
  "take": 50,
  "requireTotalCount": true,
  "filter": [["SizeCd","=","UNIT"],"or",["SizeCd","=","JOGO"]]
}

其中filter数组的结构特点是:

  • 单个条件表示为[字段名, 操作符, 值],例如["SizeCd","=","UNIT"]。
  • 逻辑操作符(如"or"、"and")作为独立的字符串元素插入到条件之间。

我们的目标是将这样的数组转换为形如WHERESizeCd= 'UNIT' ORSizeCd= 'JOGO'的MySQL WHERE子句。

2. 使用PDO构建预处理语句

使用PDO(PHP Data Objects)是PHP中推荐的数据库交互方式,因为它支持预处理语句,能够有效防止SQL注入。我们将创建两个辅助函数:一个用于生成带有占位符的SQL查询字符串,另一个用于提取参数值。

假设我们有以下过滤数组:

$filterArray = [
    ["SizeCd","=","UNIT"],
    "or",
    ["SizeCd","=","JOGO"],
    "or",
    ["SizeCd","=","PACOTE"]
];

2.1 生成SQL查询字符串(带占位符)

arrayToQuery函数负责遍历过滤数组,根据数组元素的类型(条件数组或逻辑操作符)来构建SQL WHERE子句。对于条件数组,它将字段名用反引号包围,操作符直接使用,值则用?作为占位符。

2.2 提取参数值

arrayToParams函数负责从过滤数组中提取所有条件的值,这些值将作为PDO预处理语句的绑定参数。

2.3 PDO使用示例

将上述函数结合PDO进行实际查询:

美图AI开放平台
美图AI开放平台

美图推出的AI人脸图像处理平台

下载
 PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false, // 禁用模拟预处理,使用真实预处理
    ]);
} catch (PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}

$tableName = "your_table_name"; // 您的表名
$sql = arrayToQuery($tableName, $filterArray);
$params = arrayToParams($filterArray);

echo "生成的SQL查询字符串: " . $sql . "\n";
echo "提取的参数: " . print_r($params, true) . "\n";

try {
    $stmt = $conn->prepare($sql);
    $stmt->execute($params);
    $results = $stmt->fetchAll();

    echo "查询结果:\n";
    print_r($results);

} catch (PDOException $e) {
    echo "查询执行失败: " . $e->getMessage() . "\n";
}

?>

输出示例:

生成的SQL查询字符串: SELECT * FROM `your_table_name` WHERE `SizeCd` = ? or `SizeCd` = ? or `SizeCd` = ?
提取的参数: Array
(
    [0] => UNIT
    [1] => JOGO
    [2] => PACOTE
)
查询结果:
Array
(
    // ... 您的查询结果 ...
)

3. 使用MySQLi构建查询语句(带转义)

如果您的项目仍在使用MySQLi扩展,并且无法切换到PDO,那么在构建动态SQL时,手动对值进行转义是至关重要的,以防止SQL注入。

3.1 生成SQL查询字符串(带转义)

arrayToQueryMysqli函数与arrayToQuery类似,但它直接将值嵌入到SQL字符串中,并在嵌入前使用$mysqli->real_escape_string()进行转义。

real_escape_string($tableName) . "` WHERE ";
    $conditions = [];

    foreach ($filterArray as $item) {
        if (is_array($item)) {
            // 处理单个条件:[字段名, 操作符, 值]
            // 字段名用反引号包围,并进行转义以防万一。
            $fieldName = "`" . $mysqli->real_escape_string($item[0]) . "`";
            $operator = $item[1];
            // 值使用 real_escape_string 进行转义,并用单引号包围。
            $escapedValue = "'" . $mysqli->real_escape_string($item[2]) . "'";
            $conditions[] = "{$fieldName} {$operator} {$escapedValue}";
        } else {
            // 处理逻辑操作符:"or", "and"
            $lowerItem = strtolower($item);
            if (in_array($lowerItem, ['and', 'or'])) {
                $conditions[] = " {$lowerItem} ";
            }
        }
    }

    $select .= implode("", $conditions);
    return $select;
}

?>

3.2 MySQLi使用示例

connect_errno) {
    die("数据库连接失败: " . $mysqli->connect_error);
}

$tableName = "your_table_name"; // 您的表名
$query = arrayToQueryMysqli($mysqli, $tableName, $filterArray);

echo "生成的SQL查询字符串: " . $query . "\n";

try {
    $result = $mysqli->query($query);

    if ($result) {
        echo "查询结果:\n";
        while ($row = $result->fetch_assoc()) {
            print_r($row);
        }
        $result->free();
    } else {
        echo "查询执行失败: " . $mysqli->error . "\n";
    }

} catch (Exception $e) {
    echo "查询执行异常: " . $e->getMessage() . "\n";
} finally {
    $mysqli->close();
}

?>

输出示例:

生成的SQL查询字符串: SELECT * FROM `your_table_name` WHERE `SizeCd` = 'UNIT' or `SizeCd` = 'JOGO' or `SizeCd` = 'PACOTE'
查询结果:
Array
(
    // ... 您的查询结果 ...
)

4. 注意事项与最佳实践

  • SQL注入防护:
    • PDO预处理语句是首选。 它们将SQL逻辑与数据分离,自动处理参数转义,是防止SQL注入最安全有效的方法。
    • MySQLi的real_escape_string至关重要。 如果必须使用MySQLi且构建动态SQL,务必对所有用户输入的值进行real_escape_string处理,并且字段名和表名也应进行适当的验证或转义。
  • 字段名和表名转义: 在MySQL中,字段名和表名通常用反引号(`)包围,以避免与SQL关键字冲突,并允许使用特殊字符或空格(尽管不推荐)。在代码中,我们对字段名和表名也进行了反引号处理,并对反引号本身进行了转义,以增加安全性。
  • 操作符验证: 在实际应用中,应严格验证filterArray中的操作符(如=、>、
  • 复杂条件处理: 本教程仅处理了扁平化的AND或OR连接的条件。DevExtreme的filter数组可以支持嵌套的AND/OR组(例如[["field1", "=", "value1"], "and", ["field2", ">", "value2"], "or", [["field3", "
  • 错误处理: 在生产环境中,数据库操作应包含健壮的错误处理机制,例如使用try-catch块捕获PDOException或检查mysqli的错误属性。
  • 性能考量: 对于非常复杂的过滤条件或大量数据,考虑在数据库层面建立合适的索引,以优化查询性能。

总结

通过本教程,我们学习了如何将DevExtreme等前端框架生成的类NoSQL过滤数组转换为可执行的MySQL WHERE条件语句。我们分别探讨了使用PDO预处理语句和MySQLi配合real_escape_string的两种方法,并强调了SQL注入防护的重要性。选择适合您项目需求的方法,并始终将安全性放在首位,以构建健壮、可靠的数据查询功能。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2653

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1658

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1515

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1418

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1468

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 801人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号