php用一个单页读取数据库中带有超链接的内容并提供人工清理链接的功能(超链接部分可替换为任何查询条件)/ 代码拿去用

news2024/9/27 17:36:33

起因

  • 某客户安全报告提示有一个过期网站的链接,且该过期网站变成了羞羞网站~~
  • 这个问题是他们平时发文的时候直接复制了别的网站内容,又没有用编辑器的清理工具导致的。
  • 事后,客户提出能不能把所有内容都查一遍,并去掉所有链接?
  • 很显然,他想当然了~~

在这里插入图片描述

思路

  1. 一种是找到所有链接,然后和客户说按照他的要求把链接干光了,客户一开始可能会谢谢,但没多久就会来和你说,怎么这个没有,怎么那个不能用,所以别自找麻烦了
  2. 一种是找到所有带链接的信息,系统判断是否为无效链接后自动清除,但问题如果这个无效链接已经变成了有效的羞羞站,那么你怎么判断?难道还要判断外链的网站是否带有羞羞内容或不合规内容?为了这件小事,我有病?嗯~~等以后发病的时候再说吧
  3. 一种是,也就剩这种,人工判断后手动删除,毕竟我怎么知道哪些链接是你要的?哪些不是,既然不是所有的外网链接都要去掉,既然需要“人”的参与,那自然就用这个方法了。而且让客户自己去删,避免了误删的纠纷,让客户参与其中,体会操控的乐趣。。。。

当然,我事先数据库搜了一遍,涉及到外链的也就300多篇文章,就算客户不愿意自己手动,我们来手工的整一遍,也不累。

结构

数据库中基础数据放在tableN表中,内容等数据放在tableN_data表中,主要字段有tableN.idtableN.categorytableN.titletableN.showtimetableN_data.idtableN_data.didtableN_data.content,其中id为两张表的关联字段

比如直接在数据库里查的时候就用下面的sql语句搜一遍带http的内容,也可以看看www或者特定字符的。

select * from table1 as a join table1_data as b on b.id=a.id where content like "%http%";
select * from table2 as a join table2_data as b on b.id=a.id where content like "%http%";
select * from table3 as a join table3_data as b on b.id=a.id where content like "%http%";
select * from table4 as a join table4_data as b on b.id=a.id where content like "%http%";
select * from table5 as a join table5_data as b on b.id=a.id where content like "%http%";
// ...

这样写的搜索结果就会分成N张表供你仔细端详

在这里插入图片描述

但给客户的当然不能这么弄,肯定要弄一个页面让其操作。

好了,最后就是人懒,用传统的php单页面直接完成这个事情了。

代码

不分段解析了,整合在一段里自己看,实用代码有些内容不能泄露,所以发文的时候略作修改,如果期间有bug不能运行,可以留个言~~有可以用的也留个言

<!DOCTYPE html>
<html>
<head>
	<title>超链接清理</title>
	<meta charset="utf-8">
</head>
<body>
<?php

// 连接数据库
$dsn = "mysql:host=127.0.0.1;dbname=testDb;charset=utf8mb4";
$username = "test";
$password = "test";
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
];

try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    echo "连接数据库失败:" . $e->getMessage();
    exit;
}

// 分块查询数据
$perPage = 5;
$page = isset($_GET['page']) ? $_GET['page'] : 1;

// 表结构是一样的,先放一个数组里,以后好调整
$tables = array(
    'table1 ',
    'table2',
    'table3',
    'table4',
    'table5',
    'table6',
    'table7'
);

// 想用哪个条件自己选,注意mysql支持正则查询
$condition = array(
	//"content like '%http:%'",
	//"content like '%http:%'",
	//"content like '%www%'",
	//"content like '%<a%'",
	//"content REGEXP '<a[^>]+href\s*=\s*[\"\'][^\"\']*www[^\"\']*'",
	"content REGEXP '<a[^>]+href\s*=\s*[\"\'][^\"\']*http[^\"\']*'"
);
$conditionString = implode(' or ', $condition);

// 用union联合查询的方式生成sql
$selects = array();
$countSql = '';
$selectSql = array();
//data表的id字段改名为id2输出,以防冲突,将当前表名作为moudle字段输出
foreach ($tables as $table) {
    $selectSql[] = "(SELECT a.*,b.id as id2,b.content,b.did,'{$table}' as moudle FROM {$table} as a join {$table}_data as b ON b.id=a.id where (".$conditionString."))";
}
$selectSqlUnion = implode(' UNION ', $selectSql);

// 查询
$selectSqlString = "SELECT * FROM (".$selectSqlUnion.") as alldata";
$sql = $selectSqlString . ' LIMIT ' . (($page - 1) * $perPage) . ',' . $perPage;
$result = $pdo->query($sql);
$selected_rows = array();
if ($result->rowCount() > 0) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
        $column_value = $row["content"];
        $selected_rows[] = $row;
    }
}

// 总数
$total = 0;
$countSqlString = "SELECT COUNT(*) FROM (".$selectSqlUnion.") as alldata WHERE (".$conditionString.")";
$countResult = $pdo->query($countSqlString);
if ($countResult->rowCount() > 0) {
	while ($row = $countResult->fetch(PDO::FETCH_NUM)) {
		$total = $row[0];
	}
}
$totalPages = ceil($total / $perPage);

// 在前端页面将选中的行列出来让用户判断后勾选
$n = 0;
echo "<form method='post' action=''>";
foreach ($selected_rows as $row) {
	$n++;
    echo "<div style='border:1px solid gray;padding:20px;margin:20px;'>
    	<!--链接到网站预览-->
        <h2>【{$n}】 <a href='http://127.0.0.1/{$row["id"]}.html' target='_blank'>{$row["title"]}</a></h2>
        <p style='padding:5px;background-color:#F3F3F3;'>
            发布时间:{$row["showtime"]}&nbsp;&nbsp;&nbsp; 
            所在栏目:{$row["category"]}&nbsp;&nbsp;&nbsp;
            所在模型:{$row["moudle"]}&nbsp;&nbsp;&nbsp;
            模型编号:{$row["id"]}&nbsp;&nbsp;&nbsp;
            模型序号:{$row["did"]}
        </p>
        <p>{$row["content"]}</p>
        <label style='display:block;padding:5px;background-color:#CBC2EB;'>        	
    		<!--存储本条信息的表名、id号-->
            <input type='checkbox' name='selected_rows[]' value='{$row["moudle"]}|{$row["id"]}'>选择
        </label>
    </div>";
}
echo "<div style='text-align:center;padding:28x;line-height:3;'><input type='submit' value='提交去除超链接' style='font-size:18px;font-weight:bold;' /></div>";
echo "</form>";

// 分页
if ($totalPages > 1) {
	echo "<div style='text-align:center;'>";
	if ($page > 1) {
		echo "&nbsp;&nbsp;<a href=\"?page=" . ($page - 1) . "\">上一页</a>&nbsp;&nbsp;";
	}
	for ($i = 1; $i <= $totalPages; $i++) {
		if ($i == $page) {
			echo "&nbsp;&nbsp;<span>{$i}</span>&nbsp;&nbsp;";
		} else {
			echo "&nbsp;&nbsp;<a href=\"?page={$i}\">{$i}</a>&nbsp;&nbsp;";
		}
	}
	if ($page < $totalPages) {
		echo "&nbsp;&nbsp;<a href=\"?page=" . ($page + 1) . "\">下一页</a>&nbsp;&nbsp;";
	}
	echo "</div>";
}


// 处理用户提交的数据
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (!empty($_POST["selected_rows"])) {
        foreach ($_POST["selected_rows"] as $selected_row) {
			
			// 读取数据,判断该表是否存在该数据
			$p_row = explode('|',$selected_row);
			$p_data_sql = "SELECT * FROM {$p_row[0]}_data WHERE id='{$p_row[1]}'";
			$p_result = $pdo->query($p_data_sql);
			
			$row = $p_result->fetch(PDO::FETCH_ASSOC);
			
			if(!empty($row)) {		
				// 将超链接替换为链接内容
				$text = preg_replace('/<a\s+[^>]*>(.*?)<\/a>/is', '$1', $row["content"]);
				
				$stmt = $pdo->prepare("UPDATE {$p_row[0]}_data SET content = REPLACE(content, ?, ?) WHERE id = ?");
				$stmt->execute(array($row["content"], $text, $row["id"]));
			}
        }
        echo "数据更新成功";
    } else {
        echo "请选择要更新的数据行";
    }
}

// 关闭连接
$pdo = null;

?>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

风控系统就该这么设计(万能通用),那是相当稳定

一、背景 1.为什么要做风控? 2.为什么要自己写风控? 3.其它要求 二、思路 1.风控规则的实现 2.调用方式的实现 三、具体实现 1.风控计数规则实现 2.注解的实现 四、测试一下 1.写法 2.Debug看看 一、背景 1.为什么要做风控? 这不得拜产品大佬所赐&#xff0c;我们…

分享:集群吞吐量以1抵5,车企MySQL八大痛点的解决方案

本文来自社区分享&#xff0c;仅限交流探讨。原文作者&#xff1a;李婵玲&#xff0c;某智能车企DBA。欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 最近一年&#xff0c;我们完成了从MySQL到OceanBase的替代过程&#xff0c;既降低了架构复杂度…

PostgreSQL 基础知识:psql 入门

PostgreSQL 有一个单独的命令行工具psql&#xff0c;该工具已经使用了几十年&#xff0c;并且包含在任何 PostgreSQL 安装中。许多 PostgreSQL 的长期用户、开发人员和管理员都依赖它来帮助他们快速连接到数据库、检查模式和执行 SQL 查询。 了解如何安装和使用基本psql命令是…

【每日一题】

文章目录 C 技术点多边三角形剖分的最低得分&#xff08;dp思路&#xff0c;选不选问题&#xff09;移动石子到连续&#xff08;思路&#xff09; C 技术点 1. string类型使用find函数。 int index s.find(""); if (inde ! string:npos){ xx }2. transform函数&…

[代码随想录]二叉树

二叉树 文章目录 二叉树1. 二叉树的递归遍历144.前序遍历94.中序遍历145.后续遍历 *2.二叉树的迭代遍历145.前序遍历94.中序遍历145.后续遍历 3.统一二叉树迭代遍历144.前序遍历94.中序排序145.后序遍历 4.层序遍历102.二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右…

[Dev‘Life] Dubai工签指南

Dubai工作签证一般为两年有效期&#xff0c;主要流程为 PCR-TEST-REPORT&#xff08;体检&#xff09;劳动者通识培训(听课)申请ID (录制指纹/掌静脉) 前置查询&#xff1a;Dubai-ICA官网查看签证有效期 免费查询签证的状态&#xff0c;相关查询连接在此&#xff1a; https://…

与伙伴同行,Serverless 让创新触手可及

今天 Serverless 的方式真正意义上做到了云产品、云技术的开箱即用&#xff0c;企业和开发者不需要再关注底层的资源配置&#xff0c;更多地把精力放在业务系统的开发中。 4 月 26 日&#xff0c;在 2023 阿里云合作伙伴大会现场&#xff0c;阿里云智能 CTO 周靖人发表主题演讲…

XML解析(DOM4j)检索(Xpath)

XML在以后更多的是用来作为配置文件的。 一. 配置文件 什么是配置文件 用来保存程序在运行时需要的一些参数。 当配置信息比较复杂的时候&#xff0c;我们就可以用XML。 二. XML概述 三. XML的创建、语法规则 根标签就是写在最外面的标签。 <?xml version"1.0&quo…

【Unity3D小功能】Unity3D中实现Text显示版本功能

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在项目开发中&#xff0c;会遇到要控制版本的情况&#xff0c;…

Python基础篇

大家好&#xff0c;我是易安&#xff01; Python语言比起C、Java等主流语言&#xff0c;语法更简洁&#xff0c;也更接近英语&#xff0c;对编程世界的新人还是很友好的&#xff0c;这也是其显著优点。最近总有人问我Python相关的问题&#xff0c;这些问题也偏基础&#xff0c;…

Qt绘图类

Qt绘图类 QPainter绘图1&#xff0e;QPainter与QPaintDevice2&#xff0e;paintEvent事件和绘图区3&#xff0e;QPainter绘图的主要属性4&#xff0e;创建实例 QPen的主要功能1&#xff0e;线条样式2&#xff0e;线条端点样式3. QBrush的主要功能4. 渐变填充 5 QPainter绘制…

Python小姿势 - Python连接MySQL数据库

Python连接MySQL数据库 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;&#xff0c;于1989年底圣诞节期间&#xff0c;为了打发无聊的圣诞节&#xff0c;决心开发一个新的脚本解释程序…

云表无代码开发平台,助力制造业练就数字化转型"硬功"

制造业作为国民经济的基础&#xff0c;也是我国的支柱产业&#xff0c;对我国经济发展具有重要意义。但随着近年来我国制造业转型升级步伐的加快&#xff0c;我国制造业在发展过程中也面临着许多困难和挑战。比如&#xff1a;企业生产设备老化、生产过程自动化程度低、产品质量…

Spark大数据处理讲课笔记3.3 掌握RDD分区

文章目录 零、本讲学习目标一、RRD分区&#xff08;一&#xff09;RDD分区概念&#xff08;二&#xff09;RDD分区作用 二、RDD分区数量&#xff08;一&#xff09;RDD分区原则&#xff08;二&#xff09;影响分区的因素&#xff08;三&#xff09;使用parallelize()方法创建RD…

【计算机视觉】Visual Transformer (ViT)模型结构以及原理解析

文章目录 一、简介二、Vision Transformer如何工作三、ViT模型架构四、ViT工作原理解析4.1 步骤1&#xff1a;将图片转换成patches序列4.2 步骤2&#xff1a;将patches铺平4.3 步骤3&#xff1a;添加Position embedding4.4 步骤4&#xff1a;添加class token4.5 步骤5&#xff…

数字图像处理--matlab图像反转、对数变换、伽马变换、对比度拉伸详解和代码实现

灰度变换在图像的单个像素上操作&#xff0c;主要以对比度和阈值处理为目的 空间滤波涉及改善性能的操作&#xff08;邻域操作&#xff09;&#xff0c;如通过图像中每一个像素的邻域处理来锐化图像 这两种方法均属于图像增强。 灰度变换 邻域基本增强变换定义数学表达三种基本…

QTableWidget表格控件的用法(非常详细)

QTableWidget表格控件的用法&#xff08;非常详细&#xff09; QTableWidget表格控件的用法&#xff08;非常详细&#xff09;QTableWidget详解1.常用API设置自动调整行高和列宽设置表格内容是否可编辑设置行表头、列表头是否显示 2.添加子项3.右键弹出菜单4.设置风格5.清空6.运…

LED灯内常见驱动电路

如今LED灯已成为照明的主流&#xff0c;使用白炽灯的家庭少之又少。其主要优势是LED灯更节能&#xff0c;相同光效的情况下&#xff0c;LED灯消耗的电能要比白炽灯减少70%以上。 LED灯的寿命比白炽灯要长&#xff0c;使用过白炽灯的人都知道&#xff0c;使用不了多长时间&…

简析Linux内核中的各种锁:信号量/互斥锁/读写锁/原子锁/自旋锁/内存屏障等

首先得搞清楚&#xff0c;不同锁的作用对象不同。 下面分别是作用于临界区、CPU、内存、cache 的各种锁的归纳&#xff1a; 一、atomic原子变量/spinlock自旋锁 — —CPU 既然是锁CPU&#xff0c;那就都是针对多核处理器或多CPU处理器。单核的话&#xff0c;只有发生中断会使…

生成C++工程的UML类图和类继承关系图

简介 在进行软件开发时&#xff0c;了解代码结构和关系、类之间的继承关系以及类内部的成员函数和变量定义是非常重要的。为此&#xff0c;我们可以使用Doxygen和Graphviz工具来生成UML类图和类集成关系图。 Doxygen是一个用于从注释的C源代码中生成文档的工具&#xff0c;支…