自己作孽呀.领到让写个管理员操作数据库的日志函数,记录管理员修改和删除数据库的记录,主要是记录修改以前有什么记录.万一被人搞了还能恢复.
我自己想别人方便点, 写一个函数 放在别人的sql 之后 query 之前. 让别人传进来 SQL 语句 函数自动分析. 得出 这个SQL 是要修改还是删除. 然后分析出删除修改的条件.如果是修改再分析出 SET 后和where 之间 ,需要修改的字段和值.
看似简单,开始写没事.最后发现很困难了.比如:
1.update user set name='dd' where id=1  
这很好办 很好解析.
2.update user set name='dd=12,33,445553,2=21' ,p='dddd,ffg=3' where id =1
这个也好办 根据 set 和 where 来截取 再分析里面的 根据 '号的 配对情况 得到字段和值,再去先去搜索原值 再去执行updete 去修改成新值.
3. update user set name='sddsd where ddd set \'dd = d,,d=3' ,p='sddsd where ddd set \'dd = d,,d=3' where ss='22' and ff='dd and 2'
这个直接就傻了. 字符串中什么情况都可能的 .这个分析就难了.用什么来截取都不行了. 一位一位移动字符串读取来分析也不行了. 
晕倒了 怎么办????

解决方案 »

  1.   

    update user set name='sddsd where ddd set \'dd = d,,d=3' ,p='sddsd where ddd set \'dd = d,,d=3' where ss='22' and ff='dd and 2' 其实和其他的一样 只是中间加了一个\'转义
    相当于你 第一句这么写 update user set name='dd\'asdasdasdasd' where id=1    
      

  2.   

    你都可以根据name配对了 那直接用update (.*) set name=(.*) p=(.*) WHERE (.*) 来配对呀
      

  3.   

    另外,这个需求为什么不直接使用mysql的递增备份功能?
      

  4.   

    开启mysql的log-bin,用mysqlbinlog工具实现数据恢复。
    这需求也用代码去实现,是不是太蛋疼了些。
      

  5.   


    这个问题是这样的如果你在php里赋值:$sql="update user set name='sddsd where ddd set \'dd = d,,d=3' ,p='sddsd where ddd set \'dd = d,,d=3' where ss='22' and ff='dd and 2' ";这样是不对的。因为字符串内存中实际上是:update user set name='sddsd where ddd set 'dd = d,,d=3' ,p='sddsd where ddd set 'dd = d,,d=3' where ss='22' and ff='dd and 2' 这是一个错误的sql语句,所以赋值时是应该写成$sql="update user set name='sddsd where ddd set \\'dd = d,,d=3' ,p='sddsd where ddd set \\'dd = d,,d=3' where ss='22' and ff='dd and 2' ";这样的sql是可以执行的,同时你也是可以读到\这个字符的,就可以分析了。