当前位置: 首页 > article >正文

PHP:PHP脚本通过正则表达式动态修改指定文件下的php文件的sql内容加入指定条件enable_flag = ‘Y‘(“Y“)

效果

1、目录

2、aaa.php文件实现效果

3、bbb.php文件实现效果

4、执行后,输出提示

代码

1、aaa.php修改前代码

<?php
$sql = 'SELECT * FROM sf_item_no b WHERE b.status = "active"';
?>

2、bbb.php修改前代码

<?php
$sql = "SELECT * FROM sf_item_no b WHERE b.status = 'active'";
?>

3、脚本代码

<?php

header('Content-Type: text/html; charset=utf-8');
// 遍历 PHP 文件目录
$phpDir = "H:/software/wampserver/wamp/www/person";
$files = scandir($phpDir);
foreach ($files as $file) {
    if (pathinfo($file, PATHINFO_EXTENSION) === "php") {
        $filepath = $phpDir . "/" . $file;
        processPhpFile($filepath);
    }
}

function processPhpFile($filepath) {
    // 检查文件是否存在
    if (!file_exists($filepath)) {
        echo "文件不存在: $filepath\n";
        return;
    }

    // 检查文件是否可读
    if (!is_readable($filepath)) {
        echo "文件不可读: $filepath\n";
        return;
    }

    // 检查文件是否可写
    if (!is_writable($filepath)) {
        echo "文件不可写: $filepath\n";
        return;
    }

    // 读取文件内容
    $content = file_get_contents($filepath);

    // 正则表达式匹配 SQL 查询
    $pattern = "/\\\$sql\s*=\s*([\"'])(.*?SELECT.*?FROM.*?sf_item_no.*?)\\1;/is";
    
    // 检查是否有匹配
    if (preg_match_all($pattern, $content, $matches)) {
        echo "匹配到的内容:\n";
        print_r($matches); // 输出匹配到的内容
        $content = preg_replace_callback($pattern, function($matches) {
            $quote = $matches[1]; // 捕获的引号类型(单引号或双引号)
            $sql = $matches[2]; // 捕获的 SQL 查询语句
            $modifiedSql = addEnableFlagCondition($sql, $quote);
            
            echo "原始 SQL 查询: $sql\n";
            echo "修改后的 SQL 查询: $modifiedSql\n";
            
            // 返回修改后的 SQL 语句,保留原始引号类型
            return "\$sql = $quote$modifiedSql$quote;";
        }, $content);
        
        // 将修改后的内容写回文件
        file_put_contents($filepath, $content);
        echo "文件已更新: $filepath\n";
    } else {
        echo "未找到匹配的 SQL 查询\n";
        return; // 跳过该文件
    }
}

function addEnableFlagCondition($sql, $quote) {
    // 动态设置 enable_flag 的引号
    $enableFlagQuote = ($quote === "'") ? '"' : "'";
    
    // 正则表达式匹配 sf_item_no 表及其别名
    $pattern1 = "/(FROM|JOIN)\s+(?:sf_item_no\s+(\w+)|`sf_item_no`\s+(\w+))\s*(WHERE|ON|$)/i";
    
    // 检查是否已经有 WHERE 关键字
    if (preg_match("/\bWHERE\b/i", $sql)) {
        // 如果已经有 WHERE,在 AND 后添加 enable_flag 条件
        $replacement = "$1 sf_item_no $2 $3 WHERE $2.enable_flag = $enableFlagQuote" . "Y" . "$enableFlagQuote AND ";
    } else {
        // 如果没有 WHERE,添加 WHERE 和 enable_flag 条件
        $replacement = "$1 sf_item_no $2 WHERE $2.enable_flag = $enableFlagQuote" . "Y" . "$enableFlagQuote ";
    }

    // 替换
    $sql = preg_replace($pattern1, $replacement, $sql);

    // 确保 WHERE 和 AND 的顺序正确
    if (strpos($sql, "WHERE") !== false && strpos($sql, "AND") !== false) {
        // 如果 WHERE 和 AND 都存在,确保 AND 在 WHERE 之后
        $sql = preg_replace("/(WHERE.*?)\s+AND\s+/i", "$1 AND ", $sql);
    }

    // 确保 WHERE 后面紧跟条件
    $sql = preg_replace("/WHERE\s*/i", "WHERE ", $sql);

    // 确保 AND 后面紧跟条件
    $sql = preg_replace("/AND\s*/i", "AND ", $sql);

    return trim($sql);
}

?>

http://www.kler.cn/a/471584.html

相关文章:

  • TensorRT-LLM中的MoE并行推理
  • 设计模式 行为型 命令模式(Command Pattern)与 常见技术框架应用 解析
  • 路由器的转发表
  • 快速学习 pytest 基础知识
  • Swin-Transformer
  • IP查询于访问控制保护你我安全
  • JSON Schema属性使用汇总
  • Python入门教程 —— 文件操作
  • 对比式机器学习揭示了跨物种共享和特异性的脑功能结构|文献速递-视觉大模型医疗图像应用
  • AI生成前端页面:解放前端开发,拥抱AI时代的高效
  • 【深入理解Mysql】
  • 《Python趣味编程》专栏介绍与专栏目录
  • 常用存储器介绍
  • ros2-4.1 服务通信介绍
  • 【git命令】--- git经典常用操作命令大全
  • 实时计算 Flink 版:赋能数据驱动,让决策快人一步
  • 英语外刊写作积累(2024.09)
  • JavaWeb—Servlet详解
  • Unigui基于vue+elementui的自研框架
  • JVM一之类加载子系统
  • 多模态图文检索实战——基于CLIP实现图文检索系统(附源码)
  • AI驱动的可演化架构与前端开发效率
  • 【Java基础】正则表达式的使用与常用类分享
  • 业务日志设计
  • # Java 发送电子邮件示例
  • 『SQLite』常见函数的使用