前言:
解释:
案例:
准备:
2.1 typecho_contents表: 文章主要内容,标题,发布时间,分类信息查询id,html内容导入到这里. 2.2 typecho_relationships表: 文章内容表对应 (cid) 和文章分类/或是标签 (mid) 进行关联. 2.3 typecho_metas表:文章分类名,标签名,都是存在这里的,typecho_relationships表mid与这里关联的.
问题:
- -- 如果备份表已存在,先删除
- DROP TABLE IF EXISTS `typecho_contents_bak`;
- -- 创建备份表,结构与原表一致
- CREATE TABLE `typecho_contents_bak` LIKE `typecho_contents`;
- -- 将原表中的数据插入到备份表中
- INSERT INTO `typecho_contents_bak` SELECT * FROM `typecho_contents`;
执行:
<?php
// 加载并解析HTML文件
$htmlFile = 'yourfile.html'; // 替换为你的HTML文件路径
$html = file_get_contents($htmlFile);
·
·
·
// 保存到文件
file_put_contents($filename, $content);
echo "保存成功:$filename\n";
?>
问: 上面问题忘记加上批量读取输出,补上 "$htmlFile = 'yourfile.html'; " 将其修改为当前目录下所有的html文件,批量获取并批量保存 答:
<#?php
// 获取当前目录下所有 .html 文件
$htmlFiles = glob("*.html");
foreach ($htmlFiles as $htmlFile) {
·
·
·
// 保存到文件
file_put_contents($filename, $content);
echo "保存成功:$filename\n";
'}
#?#>
验证结果: 无法获取发布日期,文章内容
问: (发现提取处理的txt无正文内容与标题,但是目录内txt过多故出现新问题) PHP删除当前目录下所有txt后缀文件,给出案例代码 答:
<?php
// 获取当前目录下所有 .txt 文件
$txtFiles = glob("*.txt");
foreach ($txtFiles as $txtFile) {
// 尝试删除文件
if (unlink($txtFile)) {
echo "成功删除文件: $txtFile\n";
} else {
echo "无法删除文件: $txtFile\n";
}
}
?>
执行结果: 成功删除所有txt文件
问: 提供html源码示例如下:
<title>根据句柄取进程路径- 紫灵幽梦</title>
<div class="entry">
<div class="person-info">
<span style="font-size: 75%;color: #393939;">2016-11-8 <br />18:29</span>
·
·
·
<br />
<div style="margin-top: 20pt;"></div>
<?php
// 获取当前目录下所有 .html 文件
$htmlFiles = glob("*.html");
foreach ($htmlFiles as $htmlFile) {
·
·
·
// 保存到文件
file_put_contents($filename, $content);
echo "保存成功:$filename\n";
;}
?>
答: 根据html代码给出新的答案
<?php
// 获取当前目录下所有 .html 文件
$htmlFiles = glob("*.html");
·
·
·
// 保存到文件
file_put_contents($filename, $content);
echo "保存成功:$filename\n";
;}
?>
验证结果: 依然无法提取正确的文章正文与分类信息
1、)<title>根据句柄取进程路径-紫灵幽梦</title>这是标题,修改为只提取-前面字符;
2、)<div class="person-info"><span style="font-size: 75%;color: #393939;">
2016-11-8 <br />18:29</span> </div> 这是发布日期;
3、)<div class="post-header-right"><h4 class="post-title"><a>[程序代码]根据句
柄取进程路径 </a> </h4></div>这是发分类,只提取"[]"内部,只提取第一个class="post-title"内容;
4、)<div class="post-contents">~</div>这是正文部分,只提取第一个class="post-contents"内容;
<?php
// 获取当前目录下所有 .html 文件
$htmlFiles = glob("*.html");
foreach ($htmlFiles as $htmlFile) {
·
·
·
// 保存到文件
file_put_contents($filename, $content);
echo "保存成功:$filename\n";
}
?>
答:
<?php
// 获取当前目录下所有 .html 文件
$htmlFiles = glob("*.html");
foreach ($htmlFiles as $htmlFile) {
·
·
·
// 保存到文件
file_put_contents($filename, $content);
echo "保存成功:$filename\n";
}
?>
提取内容标题不满意(之前网站名与现在不符合,继续追问) 问: 修改为只提取-前面字符;
<title>根据句柄取进程路径-紫灵幽梦</title>这是标题
答: 重新修正代码如下:
<?php
// 获取当前目录下所有 .html 文件
$htmlFiles = glob("*.html");
foreach ($htmlFiles as $htmlFile) {
// 加载并解析HTML文件
·
·
·
·
echo "保存成功:$filename\n";
}
?>
验证结果: 成功提取出文章标题,内容,发布时间(搞定继续下一步)
INSERT INTO `typecho_contents` (`cid`, `title`, `slug`, `created`, `modified`, `text`, `order`, `authorId`, `template`, `type`, `status`, `password`, `commentsNum`, `allowComment`, `allowPing`, `allowFeed`, `parent`, `views`, `digg`, `bury`, `agree`) VALUES
这是typecho存储文章的数据表,读取当前目录下所有txt后缀文件,并写入表中,请给出完整php代码:
sql数据库配置信息如下:
'host' => 'localhost',
'port' => 3306,
'user' => 'xxxx',
'password' => 'xxxx',
'charset' => 'utf8mb4',
'database' => 'xxxx',
'engine' => 'InnoDB',
以下为导入txt文件字段信息获取信息;
cid =为自增id,从191开始(导入文章的id范围);
title=标题,读取txt文本中第一行;
slug=与cid相同数据;
created=文章创建日期,读取txt文本第二行数据并转换为Unix 时间戳,这位原始格式:2016-11-8 18:33;
modified=文章最后修改日期,输入当前日期并转换为Unix 时间戳;
text=正文内容,读取txt文本第三行到末位所有数据;
order=0;
authorId=1;
template=NULL;
type=''post';
status='publish';
password=NULL;
commentsNum=0
allowComment=1
allowPing=0
allowFeed=1
parent=0
views=5
digg=0
bury=0
agree=0
答:
<?php
// 数据库配置信息
'host' => 'localhost',
'port' => 3306,
'user' => 'xxxx',
'password' => 'xxxx',
'charset' => 'utf8mb4',
'database' => 'xxxx',
// 连接到数据库
$dsn = "mysql:host=$host;port=$port;dbname=$database;charset=$charset";
$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, $user, $password, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// 获取当前目录下所有 .txt 文件
$txtFiles = glob("*.txt");
$cid = 191; // 初始自增ID
foreach ($txtFiles as $txtFile) {
$lines = file($txtFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if (count($lines) < 3) {
echo "文件 $txtFile 格式不正确,跳过。\n";
continue;
}
$title = trim($lines[0]); // 第一行作为标题
$slug = $cid; // slug 使用 cid
$created = strtotime(trim($lines[1])); // 第二行作为创建日期并转换为 Unix 时间戳
$modified = time(); // 当前时间作为最后修改日期
$text = implode("\n", array_slice($lines, 2)); // 第三行开始的所有内容作为正文
// 插入数据到数据库
$sql = "INSERT INTO `typecho_contents`
(`cid`, `title`, `slug`, `created`, `modified`, `text`, `order`, `authorId`, `template`, `type`, `status`, `password`, `commentsNum`, `allowComment`, `allowPing`, `allowFeed`, `parent`, `views`, `digg`, `bury`, `agree`)
VALUES
(:cid, :title, :slug, :created, :modified, :text, 0, 1, NULL, 'post', 'publish', NULL, 0, 1, 0, 1, 0, 5, 0, 0, 0)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':cid' => $cid,
':title' => $title,
':slug' => $slug,
':created' => $created,
':modified' => $modified,
':text' => $text
]);
echo "文件 $txtFile 已成功导入。\n";
$cid++; // 自增ID
}
echo "所有文件已处理完成。\n";
验证结果: 参数数据完整一次性完成导入,未出现报错信息;
<?php
// 数据库配置信息
'host' => 'localhost',
'port' => 3306,
'user' => 'xxxx',
'password' => 'xxxx',
'charset' => 'utf8mb4',
'database' => 'xxxx',
try {
// 创建PDO实例并连接到数据库
$pdo = new PDO("mysql:host=$host;port=$port;dbname=$database;charset=$charset", $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 准备插入SQL语句
$stmt = $pdo->prepare("INSERT INTO `typecho_relationships` (`cid`, `mid`) VALUES (:cid, :mid)");
// 循环插入 cid=191 到 238 的记录,并设置 mid=33
for ($cid = 191; $cid <= 238; $cid++) {
$stmt->execute([
':cid' => $cid,
':mid' => 33
]);
}
echo "插入成功!";
} catch (PDOException $e) {
// 处理错误
echo "数据库操作失败:" . $e->getMessage();
}
?>
验证结果: 生成完毕,未发现错误,但是自己粗新对应分类id应该是32设置成33了,继续修复; 问:
<?php
// SQL 数据库配置信息
$host = 'localhost';
$port = 3306;
$user = 'xxxx';
$password = 'xxxx';
$database = 'xxxx';
try {
// 创建 PDO 实例连接数据库
$dsn = "mysql:host=$host;port=$port;dbname=$database;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 更新 typecho_relationships 表的 mid 值
$sql = "UPDATE `typecho_relationships`
SET `mid` = 32
WHERE `cid` BETWEEN 191 AND 238";
// 执行 SQL 语句
$pdo->exec($sql);
echo "成功更新 typecho_relationships 表中的数据。";
} catch (PDOException $e) {
echo "数据库操作失败: " . $e->getMessage();
}
?>
验证结果: 修复成功,文章从主页可正常访问,分类显示正常
<?php
// SQL 数据库配置信息
$host = 'localhost';
$port = 3306;
$user = 'erecc';
$password = 'erecc';
$database = 'erecc';
try {
// 创建 PDO 实例连接数据库
$dsn = "mysql:host=$host;port=$port;dbname=$database;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 获取 cid 在 191 到 238 范围内的所有记录
$sql = "SELECT `cid`, `text`, `title` FROM `typecho_contents` WHERE `cid` BETWEEN 191 AND 238";
$stmt = $pdo->query($sql);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
$cid = $row['cid'];
$text = $row['text'];
$title = $row['title'];
// 删除 text 字段的最后一行
$textLines = explode("\n", $text);
if (count($textLines) > 1) {
array_pop($textLines); // 移除最后一行
$newText = implode("\n", $textLines);
} else {
$newText = $text; // 如果只有一行,则不进行删除
}
// 在 title 字段前加上前缀【VB】
$newTitle = "【VB】" . $title;
// 更新数据库中的记录
$updateSql = "UPDATE `typecho_contents` SET `text` = :newText, `title` = :newTitle WHERE `cid` = :cid";
$updateStmt = $pdo->prepare($updateSql);
$updateStmt->execute([
':newText' => $newText,
':newTitle' => $newTitle,
':cid' => $cid,
]);
}
echo "成功更新 typecho_contents 表中的数据。";
} catch (PDOException $e) {
echo "数据库操作失败: " . $e->getMessage();
}
?>
验证结果: 标题标签修复完成,底部无效链接清除,
AI站点:
关于:
最终修改: 2024.08.22
版 权: https://www.ximi.me
花了几个小时写出此文(比实际操作更费时),整理不易后续不定期更新,如转载请保留原文链接;