`

thinkphp框架where使用数组进行删除的坑

    博客分类:
  • php
 
阅读更多

晚上做网站维护的时候,希望删除文章的时候将文章的所有感言也一并删掉,使用了一个M('ganyan')->where(array('aid' => $row['id'])->delete();,没想到,设置条件的时候我没有去查数据库字段,仅凭记忆就写了代码,没有备份mysql数据就去测试,结果造成ganyan表所有数据被删除掉了。

万幸的是,mysql开启了binlog,我还可以通过如下方式来找回数据:

mysql通过binlog找回数据 写道
/data/web/mysql/bin/mysqlbinlog --start-date='2017-01-01 00:00:00' mysql-bin.000012 | grep think_ganyan_2017 >> ganyan.sql

 通过上面的命令,我可以把binlog文件中关于think_ganyan_2017表的操作提取出来,然后再对文件进行cat ganyan.sql | grep -v "CREATE TABLE IF NOT EXISTS" 将其中多余的建表语句删掉,再打开文件,删掉里面最后那句delete from think_ganyan_2017。这样,一个从2017年0点开始的关于这个表的所有操作的sql语句就都筛选出来了。

 

通过这次操作,我总结了如下几点:

1、开启mysql的binlog是非常必须的!而且对mysql整个数据库的数据备份必须比binlog的保存周期要短,这样能保证恢复数据库后还能将上次备份时间到当前时间的数据从binlog中找回。

2、thinkphp等框架,对where语句的数组条件进行了防止sql注入的过滤,这是很好的,但另一方面,它还进行了容错,如果你传递进去的条件的key并不是数据表的字段,它会忽略这个条件,这很致命,在update, delete这样的语句中,会直接导致更大范围的数据被更新或删除。那么像这类删除某一个表中含有另一个表id的数据,最好直接传入字符串,比如M('ganyan_2017')->where(''aid={$row['id']}")->delete();这样执行sql语句时就会报错了。

3、在做一个表的更新、删除操作的维护时,最好先把表备份下来再说。如果可能,备份整个网站的数据库。

4、每天备份网站是个好习惯!

5、写条件语句的时候,最好核对表数据,用复制--粘贴的方法来写代码,不要盲目相信自己的准确度,智者千虑,必有一失。

 

附注mysql开启binlog的参数:

mysql开启binlog的方法 写道
# 添加log-bin = xxx就可以了,xxx就是binlog文件名的前缀
log-bin = mysql-bin

 如果想要设置日志文件大小,可以设置max_binlog_size 

# 如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。
# max_binlog_size = 512m

如果不想人工去清理mysql产生的binlog(要知道年复一年binlog可能占用完你的linux磁盘空间),可以设置binlog的回滚周期(超过这个周期的binlog将被删除)。
# 二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。
# expire_logs_days = 30 #

分享到:
评论

相关推荐

    Thinkphp使用mongodb数据库实现多条件查询方法

    这一修改让Thinkphp框架能够更好地适应使用MongoDB的应用场景,并为开发人员提供了更大的灵活性来处理复杂的查询需求。 总之,Thinkphp虽然支持MongoDB,但在进行复杂查询时需要根据具体需求对驱动文件进行定制和...

    Thinkphp将二维数组变为标签适用的一维数组方法总结

    在PHP编程中,特别是在开发...以上就是关于ThinkPHP中将二维数组转换为一维数组以适应标签使用的三种方法的详细解析,以及相关的PHP和ThinkPHP框架的知识点。理解并掌握这些方法和概念,有助于提高在实际开发中的效率。

    ThinkPHP Where 条件中常用表达式示例(详解)

    在使用ThinkPHP框架进行数据库操作时,`Where`条件是不可或缺的一部分,它允许我们根据特定的条件筛选数据。本文将详细解析在ThinkPHP中`Where`条件表达式的使用方法,以及与SQL运算符的对应关系。 `Where`条件...

    ThinkPHP6.0以上兼容mysql下JSON_CONTAINS使用

    在使用`JSON_CONTAINS`函数时,开发者可以借助ThinkPHP的查询构造器或者模型方法来实现。 1. 使用查询构造器: 在查询构造器中,你可以直接使用字符串形式的SQL语句,如下所示: ```php $result = Db::query(...

    ThinkPHP CURD方法之where方法详解

    需要注意的是,ThinkPHP框架能够智能地将传入的变量进行格式转换,以符合占位符类型要求。 数组条件是ThinkPHP推荐使用的where方法参数形式,它提供了更加灵活和安全的查询方式。例如,可以定义一个数组,其中每个...

    ThinkPHP查询返回简单字段数组的方法

    首先,当我们使用ThinkPHP框架的模型进行数据查询时,通常会使用模型的`select`方法。这个方法会执行一个SQL查询,并且返回一个包含所有字段的对象数组。比如: ```php $map['parentid'] = $id; $sub_ids = D('...

    ThinkPHP中where()使用方法详解

    ThinkPHP是一个基于PHP开发的简单而快速的轻量级MVC框架,它支持多种数据库操作,并且提供了丰富的查询方法来帮助...了解并掌握ThinkPHP的where() 方法,对于任何使用ThinkPHP进行Web开发的程序员来说都是非常重要的。

    thinkphp框架实现删除和批量删除

    在使用ThinkPHP框架进行Web开发的过程中,数据的删除和批量删除是一项基础且重要的操作。ThinkPHP作为一个轻量级的PHP开发框架,其MVC(模型 Model、视图 View、控制器 Controller)的架构模式能够帮助开发者快速...

    thinkphp3.1.2学习笔记

    使用数组格式`['字段名'] = array('表达式','查询条件')`进行复杂查询,例如范围查询、模糊查询等。表达式包括`gt`(大于)、`lt`(小于)、`eq`(等于)等,可以配合`or`、`and`操作符。 总结:ThinkPHP3.1.2提供的CRUD...

    thinkPHP框架实现多表查询的方法

    ThinkPHP框架提供了一种非常方便的方式来进行多表查询,其中JOIN语句是关键。在ThinkPHP中,开发者可以通过`Model`类的`join`方法来实现表与表之间的连接查询。这个`join`方法可以接受多个参数,主要用来指定连接...

    thinkphp学信心得

    在学习ThinkPHP框架的过程中,理解并掌握其核心概念和常用功能至关重要。以下是一些关键知识点的详细解释: 1. **Action类与控制器**:`indexAction.class`是ThinkPHP中的一个默认控制器类,通常用于定义页面的操作...

    ThinkPHP数据操作方法总结

    在本篇知识总结中,我们将详细探讨ThinkPHP框架中数据操作的核心方法,包括添加数据、更新数据、查询数据和删除数据。 ### 添加数据 在ThinkPHP中添加数据通常会使用模型的add()方法,这是一个非常便捷且强大的方式...

    thinkPHP框架中执行原生SQL语句的方法

    ThinkPHP框架提供了方便的接口来执行这些原生SQL,这使得开发者能够灵活地利用数据库的强大功能。本篇文章将深入探讨如何在ThinkPHP中执行原生SQL语句,并对比`query()`和`execute()`这两个方法的使用场景和差异。 ...

    Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解

    以上就是Thinkphp5.0框架中模型Model进行数据操作的基本用法,包括添加、更新和删除。在实际开发中,可以根据需求灵活组合这些方法,实现对数据库的高效管理。注意,在进行数据库操作时,确保遵循最佳实践,如事务...

    thinkphp分页

    本篇文章将深入探讨ThinkPHP框架中的分页实现。 一、ThinkPHP分页基础 1. 分页配置: 在ThinkPHP中,分页配置主要通过`paginate()`方法完成。例如: ```php $articles = ArticleModel::where('status', 1)->order...

    ThinkPHP5.0完全开发手册

    在数据库方面,ThinkPHP5.0提供了丰富的数据库操作功能,支持数据库连接、查询构造器、查询数据添加数据更新数据删除数据查询方法查询语法链式操作、where、table、alias、field、order、limit、page、group、having...

    ThinkPHP有变量的where条件分页实例

    其中,使用变量作为where条件进行分页查询是常见的需求,本文就将详细介绍如何在ThinkPHP框架中实现带有变量条件的分页查询。 在ThinkPHP中,分页主要是依靠内置的分页类Page来完成。要实现带有变量的where条件分页...

    ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例

    在开发过程中,数据库操作是必不可少的部分,特别是在使用像ThinkPHP这样的PHP框架时。ThinkPHP提供了一些内置的功能,使得开发者能够...了解这些工具和方法,将有助于你在使用ThinkPHP框架进行开发时更加得心应手。

Global site tag (gtag.js) - Google Analytics