帝国cms 内容存文本转数据库处理方案修改优化版
使用方法:
根目录建一个 index2.php的文件,把代码复制到里面去,在把数据库信息换成自己的:然后再浏览器打开点击操作就可以了:
重点:先备份 ,先备份,先备份
代码如下:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
@set_time_limit(1000000); // 设置超时时间,越长越好
function ReadFiletext($filepath) {
$filepath = trim($filepath);
if (!file_exists($filepath)) {
throw new Exception("File not found: $filepath");
}
$string = file_get_contents($filepath);
if ($string === false) {
throw new Exception("Failed to read file: $filepath");
}
return $string;
}
function GetTxtFieldText($pagetexturl) {
try {
$text = ReadFiletext($pagetexturl);
$text = substr($text, 12); // 去除exit
return $text;
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "<br>";
return false;
}
}
// 配置数据库参数
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
try {
$dbh = new PDO('mysql:host=数据库地址;dbname=cs', 'cs', '123456', $options);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Database connection failed: " . $e->getMessage());
}
// 数据表第一条信息的ID
try {
$stmt = $dbh->prepare("SELECT id FROM phome_ecms_article ORDER BY id ASC LIMIT 1");
$stmt->execute();
$num1 = $stmt->fetchColumn();
} catch (PDOException $e) {
die("Query failed: " . $e->getMessage());
}
// 数据表最后一条信息的ID
try {
$stmt = $dbh->prepare("SELECT id FROM phome_ecms_article ORDER BY id DESC LIMIT 1");
$stmt->execute();
$num2 = $stmt->fetchColumn();
} catch (PDOException $e) {
die("Query failed: " . $e->getMessage());
}
if (isset($_POST['start'])) {
$start = $_POST['start'];
$end = $start + 29999;
if ($end > $num2) {
$end = $num2;
}
$updateStmt = $dbh->prepare("UPDATE phome_ecms_article SET newstext1 = :text WHERE id = :id");
// 批量处理
$batchSize = 100; // 每次处理100条数据
$batchUpdateData = [];
for ($i = $start; $i <= $end; $i++) {
try {
$stmt = $dbh->prepare("SELECT newstext FROM phome_ecms_article WHERE id = :id");
$stmt->bindParam(':id', $i, PDO::PARAM_INT);
$stmt->execute();
$text = $stmt->fetchColumn();
// 判断是否是存文本的信息
if (strlen($text) == 42 && preg_match("/^[0-9a-z\d\/]*$/i", $text)) {
$pagetexturl = "d/txt/" . $text . ".php"; // 因为帝国存文本中有exit中断,所以需要用读文件的方法去读取代码,文本的路径要正确,存在本文件所以目录下的子目录"d/txt/"下
$newText = GetTxtFieldText($pagetexturl);
if ($newText !== false) {
$batchUpdateData[] = [
'id' => $i,
'text' => $newText
];
// 达到批量处理的大小,执行批量更新
if (count($batchUpdateData) >= $batchSize) {
batchUpdate($dbh, $updateStmt, $batchUpdateData);
$batchUpdateData = []; // 清空数据
}
}
}
} catch (PDOException $e) {
echo "Error processing ID $i: " . $e->getMessage() . "<br>";
}
}
// 处理剩余的数据
if (!empty($batchUpdateData)) {
batchUpdate($dbh, $updateStmt, $batchUpdateData);
}
if ($end == $num2) {
echo "OK,已完成!";
} else {
echo "已处理完 $end 条数据,继续处理下一批数据";
echo "<form method='post' action='index2.php'>";
echo "<input type='hidden' name='start' value='$end'>";
echo "<input type='submit' name='submit' value='继续处理'>";
echo "</form>";
}
} else {
echo "<form method='post' action='index2.php'>";
echo "<input type='hidden' name='start' value='$num1'>";
echo "<input type='submit' name='submit' value='从 $num1 开始处理'>";
echo "</form>";
}
function batchUpdate($dbh, $updateStmt, $batchUpdateData) {
$dbh->beginTransaction();
try {
foreach ($batchUpdateData as $data) {
$updateStmt->bindParam(':text', $data['text'], PDO::PARAM_STR);
$updateStmt->bindParam(':id', $data['id'], PDO::PARAM_INT);
$updateStmt->execute();
}
$dbh->commit();
} catch (PDOException $e) {
$dbh->rollBack();
echo "Batch update failed: " . $e->getMessage() . "<br>";
}
}
声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至201542412@QQ.com举报,一经查实,本站将立刻删除。
相关推荐
-
帝国CMS多表调用最新信息的方法
这篇文章主要为大家介绍了帝国CMS多表调用最新信息的方法,主要通过灵动标签的sql语句调用结合union来实现,是非常实用的技巧,需要的朋友可以参考下
-
帝国CMS判断是否有内容分页的方法
帝国CMS判断是否有内容分页,有就显示,没有就不显示。以免没有的分页的时候占了一行位子,不是非常美观。
-
帝国CMS商城系统如何实现在线支付后发送订单邮件提醒功能
帝国CMS是个强大的内容管理系统,其商城的功能也很强大,当用户下单,支付后我们怎么知道有用户下单了呢?因为我们不能时时刻刻都在网站后台,不断的刷新页面去看有无订单,最常用的做法是用邮件提醒我们,有人下单了.
-
帝国CMS内容页附件中文显示或者显示代码名称下载
在帝国CMS模板制作中,比如内容页面显示该内容的附件地址,必须显示原始路径地址,或者说想要中文的路径地址。那么就要用以下方法来实现了:
-
帝国cms加载更多时调用对应文章的tags标签和链接
帝国cms如果使用点击加载更多的时候怎么样连gs标签和链接一起循环出来,如果是调用标题,简介,浏览,时间,这些单一的字都很简单