首页 > 数据库 >将代码和笔记之类的保存到数据库

将代码和笔记之类的保存到数据库

时间:2023-07-04 19:56:19浏览次数:43  
标签:代码 数据库 笔记 public connect sql table where options

平时记录在工作中,会把随手查到的内容,记在文件里面,时间一久,比较零乱,文件太长,在里面查找也不方便。于是想到随便整理一下存数据库得了。

先创建数据库,mysql8 支持全文索引,自带分词器,用起来很方便。

CREATE TABLE `books` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `title` (`title`),
  FULLTEXT KEY `content` (`title`,`content`) WITH PARSER `ngram` 
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

 

然后就是保存数据,并通过全文索引搜索即可。

创建全文索引
CREATE FULLTEXT INDEX  idx_name  ON tablename(name, author, publisher) WITH PARSER NGRAM;
查询语句
select * from books where match(title,content)  against('北京日报'  IN NATURAL LANGUAGE MODE);
select * from books where match(title,content)  against('北京日报 -青鸟'  IN BOOLEAN MODE);

查询有两种模式,一个是自然模式,一个布尔模式,布尔模式就是支持+- 等符号更精准的条件。

 

nginx 配置,支持 php 的 pathinfo

server {

        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name loc.tool.com;
        root /mnt/d/dev/php/tools;

        charset utf-8;

        location / {
            index index.php index.html;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }


        location ~ \.php(.*)$ {
            fastcgi_pass unix:/run/php/fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO $1;
            include        fastcgi_params;
        }
}

 

下面是主要代码,用到一个mysql 工具类,是以前自己封装的,比较简陋。当时的想法是定义的查询方法和原生的一样,select(field)->from(table)->where(where)->limit()  像这样就没有学习成本了。

<?php

require './MysqlTool.php';

$db = new MysqlTool();
$db->connect(db:'test');
$table = 'books';

$pathinfo = trim($_SERVER['PATH_INFO'], '/');
$records = [];

if(!empty($pathinfo)){

    if($pathinfo == 'add'){

        echo $db->insert($table, ['title'=> $_POST[0], 'content' => $_POST[1]]) > 0 ? '<a href="/books.php">添加成功</a>' : '<a href="/books.php">添加失败</a>';

        exit(0);
    }else{
        $keyword = $_POST['search'];
        $records = $db->select('title,content')->from($table)->where("MATCH(title, content) AGAINST ('$keyword' IN BOOLEAN MODE)")->limit();

    }
}

?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>我的代码库</title>
<style>
body{ font-family: "微软雅黑"; font-size: 14px; }
.warp h3{margin:0px; padding:0px; line-height:30px; margin-top:10px;}
table { border-collapse: collapse; border: 1px solid #CCC; background: #efefef; }
table th { font-weight: bold; line-height: 30px; font-size: 14px; border: 1px solid #CCC; text-align:left;  padding:0 4px;}
table td { height: 20px; font-size: 14px; border: 1px solid #CCC; background-color: #fff; padding:4px;}
td, th{white-space: nowrap;  word-break: keep-all;}

</style>
</head>
<body>


<form action="/books.php/search" method="post">
    <input type="text" name="search">

    <button type="submit">搜索</button>
</form>

<?php if(!empty($records)){ ?>

    <?php foreach($records as $key => $article) { ?>

        <div style="margin: 20px 10px 40px 10px">
            <h4><?php echo $article['title'] ?></h4>
            <pre><?php echo $article['content'] ?></pre>
        </div>


    <?php } ?>

<?php } ?>


</body>
</html>
<?php

class MysqlTool
{
    protected $sql = [];
    protected $error = '';
    protected $connect = null;
    protected $sth = null;

    public function connect($host = '127.0.0.1', $user='test', $password='123456', $db = 'test', $charset='utf8')
    {

        $this->connect = new PDO("mysql:dbname=$db;host=$host", $user, $password);
        $this->connect->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
        $this->connect->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $this->connect->query("SET NAMES $charset;");
        return $this;
    }


    public function beginTransaction()
    {
        $this->connect->beginTransaction();
    }

    public function commit()
    {
        $this->connect->commit();
    }

    public function rollBack()
    {
        $this->connect->rollBack();
    }

    public function query($sql='')
    {
        $this->sql($sql);
        return $this->connect->query($sql)->fetchAll();
    }

    public function select($field='*')
    {
        $this->options['select'] = 'SELECT ' . $field;
        return $this;
    }

    public function from($table)
    {
        $this->options['from'] = ' FROM `'. str_replace('.', '`.`', $table) .'`';
        return $this;
    }

    public function where($where, $param=null)
    {
        $this->options['where'] = ' WHERE '. $where;
        if (!empty($param)) {
            $this->options['param'] = $param;
        }

        return $this;
    }

    public function order($order)
    {
        $this->options['order'] = ' ORDER BY '. $order;
        return $this;
    }

    public function limit($start=0, $length=null)
    {
        if ($length == null) {
            if ($start > 0) {
                $length = $start;
                $start = 0;
            }
        }

        if ($length > 0) {
            $this->options['limit'] = ' LIMIT '. $start .','. $length;
        }

        $options = array('select', 'from', 'join', 'where', 'order', 'limit');
        $sql = '';
        foreach ($options as $keyword) {
            if (isset($this->options[$keyword])) {
                $sql .= $this->options[$keyword];
            }
        }

        if (isset($this->options['param'])) {
            $this->sth = $this->connect->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
            $this->sth->execute($this->options['param']);
            $query = $this->sth;
        } else {
            $query = $this->connect->query($sql);
        }
        $this->sql($sql);
        unset($this->options);
        return ($length == 1) ? $query->fetch() : $query->fetchAll();
    }


    public function insert($table, $data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $fields =  array_keys($data);
        $values = array_values($data);
        $sql = 'INSERT INTO `'. $table .'`(`' .implode('`,`', $fields). '`)VALUES("' .implode('","', $values).'")';
        $this->sql($sql);
        return $this->connect->exec($sql);
    }

    public function update($table, $data)
    {
        $sql = 'UPDATE `'. $table .'` SET ';

        if (isset($data['id'])) {
            $this->where('id="'.$data['id'].'"');
            unset($data['id']);
        }

        foreach ($data as $key => $value) {
            $sql .= "`$key`='$value', ";
        }
        $sql = rtrim($sql, ', ') . ' ';
        $sql .= $this->options['where'];
        $this->sql($sql);
        $result = $this->connect->exec($sql);
    }


    public function sql($sql='')
    {
        if (!empty($sql)) {
            $this->sql[] = $sql;
        } else {
            return $this->sql;
        }
    }
}

 

大概就是这样,只是我的提交页面,套用的我的工具箱,大概是这样的。

 

最后是查询

 

 

标签:代码,数据库,笔记,public,connect,sql,table,where,options
From: https://www.cnblogs.com/zbseoag/p/17526829.html

相关文章

  • 象群游牧优化算法(EHO)(Matlab完整代码实现)
    ......
  • 面试常问集锦——MySQL部分数据库的隔离级别
    聚集索引与非聚集索引的区别https://zhuanlan.zhihu.com/p/113917726Myisam引擎采用非聚集索引,索引与数据分开,叶子结点存放数据的地址。Innodb采用聚集索引,主键索引树的叶子结点存放真实数据,非主键索引树的叶子结点存放主键值索引底层的实现,为什么不选红黑树、B树等?总结(1)哈希表 ......
  • 深入浅出时序数据库之预处理篇——批处理和流处理,用户可定制,但目前流行influxdb没有做
    时序数据是一个写多读少的场景,对时序数据库以及数据存储方面做了论述,数据查询和聚合运算同样是时序数据库必不可少的功能之一。如何支持在秒级对上亿数据的查询分组聚合运算成为了时序数据库产品必须要面对的挑战。 本文会从时序数据库的查询以及聚合运算角度展开,最后会从如何解决......
  • JeecgBoot低代码开发平台与达梦数据完成兼容性互认证
    近日,JeecgBoot与达梦数据库管理系统V8完成兼容性认证测试;通过双方共同测试表明,Jeecgboot低代码开发平台与达梦数据库管理系统V8,相互兼容,系统功能运行稳定,能够满足用户更多的性能需求;并签署产品兼容互认证明。JeecgBoot将持续进行更多的国产化软件及国产化服务器的兼容性测试,将会不......
  • 时间序列数据库压缩
    无损压缩无损压缩是说被压缩的数据和解压后的数据完全一样,不存在精度的损失。对数据的压缩说到底是对数据规律性的总结。时序数据的规律可以总结为两点:1、timestamp稳定递增、2、数值有规律性,变化稳定。下面来举个例子。上图是一组时序数据,如果我们一行一行的看感觉压缩有点困难,但......
  • 时序数据库深入浅出之存储篇——本质LSMtree,同时 metric(比如温度)+tags 分片
    什么是时序数据库先来介绍什么是时序数据。时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。时序数据库就是存放时序数据的数据库,并且需要支持时序......
  • 种类并查集 学习笔记
    用于维护「敌人的敌人是朋友」这类的关系。例题:luoguP2024对于点\(i\in[0,n)\)(我习惯用这种方法编号),假想一个点\(i+n\)是它的食物,则\(i\)捕食\(j\)可以通过合并\(j\)和\(i+n\)实现(即认为\(j\)和\(i+n\)是同类),如此下去,开三倍大小并查集即可。......
  • 临时笔记
    编译型语言和解释型语言的区别解释型依赖虚拟机转换为可以执行的机器代码编译型,少了转换步骤诞生时机诞生之初就考虑到了多核cpu的情况。其他语言诞生就没有多核,通过后期加语法框架支持特点语法简洁、开发效率高执行性能好 ......
  • mysql数据库语法总结--存储过程、函数、视图、触发器、表
    ​概述抽空总结一下mysql的一些概念性内容,涉及存储过程、函数、视图、触发器等。一、查看存储过程、函数、视图、触发器、表1、存储过程select*frommysql.procwheretype='PROCEDURE';showprocedurestatus;showcreateprocedureproc_name;//存储过程定义​编......
  • CDQ分治 学习笔记
    按@ouuan大佬所说,CDQ分治可以当作ex归并看待。它的思想和归并排序十分相似:假设要对区间\([l,r)\)处理先不管\([\text{mid},r)\),计算\([l,mid)\)同理计算\([mid,r)\)补回之前忽略的部分,即“归并”例:三维偏序给定\(n\)个点\((a,b,c)\),求\(a_1\lea_2\we......