效果
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);
}
?>