Warning: curl_exec() has been disabled for security reasons in /pub/host/sunboyu/sunboyu/www/wp-includes/http.php on line 1022
MYSQL 一个程序猿 孙小一,孙小二,PHP,MYSQL,LINUX,APACHE,原创技术,扯淡

mysql5.1触发器小试

作者 : admin 于 2009年08月25日, 22:51:18
2009
08-25

我一直以为mysql5.0的触发器好似没那么强大,被一个搞mssql的老大给忽悠了,其实mysql触发器从5.0就变得很强大,当然包括5.1。

这里拿一个demo说事:

  1. DROP TRIGGER IF EXISTS `ucenterhome`.`uchome_doing_test`;
  2. DELIMITER //
  3. CREATE TRIGGER `ucenterhome`.`uchome_doing_test` AFTER INSERT ON `ucenterhome`.`uchome_doing`
  4.  FOR EACH ROW BEGIN
  5.     INSERT INTO uchome_doing_1 SET doid= NEW.doid+3, uid= NEW.uid , username= NEW.username,`from`=NEW.`from`,dateline=NEW.dateline,message=NEW.message,ip=NEW.ip,replynum = NEW.replynum,mood=NEW.mood;   
  6. END
  7. //
  8. DELIMITER ;

每向uchome_doing表中插一条数据,就复制到uchome_dong_1表中一条。

有两个关键字:

  1. OLD  NEW

官方的解释:

The OLD and NEW keywords enable you to access columns in the rows affected by a trigger. (OLD and NEW are not case sensitive.) In an INSERT trigger, only NEW.col_name can be used; there is no old row. In a DELETE trigger, only OLD.col_name can be used; there is no new row. In an UPDATE trigger, you can use OLD.col_name to refer to the columns of a row before it is updated and NEW.col_name to refer to the columns of the row after it is updated.

还有两个关键字

  1. BEFORE AFTER

官方解释

The keyword BEFORE indicates the trigger action time. In this case, the trigger should activate before each row inserted into the table. The other allowable keyword here is AFTER.

mysql数据抽象层-PDO

作者 : admin 于 2009年08月20日, 16:02:02
2009
08-20

好久不用PDO了,公司这边有的项目使用PDO,再熟悉一下,继续沿用之前的方法:

没用数据绑定和一些高级的功能,只是实现基础功能。

  1. < ?php
  2. interface DateBaseConnect
  3. {
  4. #数据库连接
  5. public function Connect( $host , $user , $pass , $datebase );
  6. #使用数据库
  7. public function selectDateBase( $datebase );
  8. #执行一个查询
  9. public function query( $sql );
  10. #取得一行
  11. public function fetch( $sql );
  12. #取得所有
  13. public function fetchAll( $sql );
  14. #取得影响行数
  15. public function affectedRow();
  16. #取得结果行数
  17. public function recordCount();
  18. #取得上次插入ID
  19. public function insertID();
  20. #释放资源
  21. public function close();
  22. }
  23. class sPDO implements DateBaseConnect
  24. {
  25. #连接标识
  26. public $handle = false;
  27. #结果标识
  28. public $query;
  29. #查询次数
  30. public $exetime;
  31. #影响行数
  32. public $affectedRows;
  33. #statement
  34. public $statement;
  35. #数据库连接
  36. public function Connect( $host , $user , $pass , $datebase )
  37. {
  38. try
  39. {
  40. $this->handle = new PDO("mysql:dbname=".$datebase.";host=".$host, $user, $pass);
  41. }
  42. catch (PDOException $e)
  43. {
  44.             echo 'Connection failed: ' . $e->getMessage();
  45. }
  46. $this->exetime = 0;
  47. }
  48. #选择数据库
  49. public function selectDateBase( $database )
  50. {
  51.     return true;
  52. }
  53. #执行一个查询
  54. public function query( $sql )
  55. {
  56.     $this->affectedRows = $this->handle->exec( $sql );
  57. $this->exetime++;
  58. return true;
  59. }
  60. #取得一行
  61. public function fetch( $sql )
  62. {
  63. $this->statement = $this->handle->query( $sql );
  64. return $this->statement->fetch(PDO::FETCH_ASSOC);
  65. }
  66. #取得所有
  67. public function fetchAll( $sql )
  68. {
  69. $this->statement = $this->handle->query( $sql );
  70. return $this->statement->fetchAll(PDO::FETCH_ASSOC);
  71. }
  72. #取得影响行数
  73. public function affectedRow()
  74. {
  75. return $this->affectedRows;
  76. }
  77. #取得结果行数
  78. public function recordCount()
  79. {
  80. return $this->statement->rowCount();
  81. }
  82. #取得上次插入ID
  83. public function insertID()
  84. {
  85. $sql = sprintf("SELECT LAST_INSERT_ID() AS id");
  86. $pdostatement = $this->handle->query( $sql );
  87. $rs = $pdostatement->fetch();
  88. return $rs['id'];
  89. }
  90. #释放资源
  91. public function close()
  92. {
  93. unset($this->handle);
  94. }
  95. #析构函数
  96. function __destruct()
  97. {
  98. $this->close();
  99. }
  100. }
  101. #Demo
  102. $db = new sPDO;
  103. $db->Connect( 'localhost' , 'root' , '123456' , 'ucenterhome' );
  104. $rs = $db->fetchAll( "SELECT * FROM uchome_blogfield" );
  105. print_r( $rs );
  106. ?>

一个备份mysql的脚本,很简单

作者 : admin 于 2009年07月29日, 21:43:46
2009
07-29

帮朋友维护服务器的时候,习惯性得检查各项服务和维护,偶然间发现了这个脚本,冒着被BS的风险分享给大家,希望大家捧个钱场,施舍给老衲几万块钱买套房。

  1. @echo off
  2. C:
  3. CD "C:\Program Files\WinRAR"
  4.  
  5. net stop Mysql
  6. winrar.exe a -ag"-[YYYY-MM-DD-HH-MM-SS]" -k -r -s -ibck -inul "D:\MYSQL备份生成的文件.rar" "E:\bak\data\*.*"
  7. net start Mysql

Linux下APACHE MYSQL PHP FCgid Suexec 配置文档V1.0

作者 : admin 于 2009年05月22日, 11:14:12
2009
05-22

文档版本:V1.0

启动撰写时间: 2009年05月20日

目的:全面详细介绍LAMP fastcgi方式配置细节,基于之前的自动配置脚本,目的是把更多的细节转达给大家。

需要软件源码:

CentOS4.7

http://centos.ustc.edu.cn/centos/4.7/isos/i386/CentOS-4.7.ServerCD-i386.iso

http://centos.ustc.edu.cn/centos/4.7/isos/x86_64/CentOS-4.7.ServerCD-x86_64.iso

Apache-2.2.9

http://archive.apache.org/dist/httpd/httpd-2.2.9.tar.gz

MYSQL-5.2.6

http://downloads.mysql.com/archives/mysql-5.0/mysql-5.0.22.tar.gz

PHP-5.2.6

http://museum.php.net/php5/php-5.2.6.tar.gz

FCGID

http://ncu.dl.sourceforge.net/sourceforge/mod-fcgid/mod_fcgid.2.2.tgz

安装:

第一步:Linux系统安装,同时可以参照我原来的文档

http://www.sunboyu.cn/2008/06/13/centos5%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97%EF%BC%88%E7%AE%80%E5%8D%95%E7%AF%87%EF%BC%89.shtml

阅读全部 »

Python写的数据库备份程序

作者 : admin 于 2009年04月22日, 01:55:00
2009
04-22

下载地址:mysqlbak

  1. #!/var/opt/python-2.5/bin/python
  2. import os
  3. import time
  4. import MySQLdb
  5.  
  6.  
  7. CFG = {}
  8. CFG['root'] = {}
  9. CFG['root']['hostname'] = 'localhost'
  10. CFG['root']['username'] = 'root'
  11. CFG['root']['password'] = 'test'
  12.  
  13.  
  14. CFG['mysqldump'] = '/opt/mysql-5.0.22/bin/mysqldump'
  15.  
  16. CFG['time'] = time.strftime("%Y-%m-%d", time.localtime(time.time()) )
  17.  
  18. CFG['bakpath'] = '/tmp/' + CFG['time']
  19. CFG['mainbak'] = '/home/sunboyu/databak/' + CFG['time']
  20.  
  21.  
  22. if os.path.exists( CFG['bakpath'] ) == False:
  23.     os.mkdir( CFG['bakpath'] )
  24. if os.path.exists( CFG['mainbak'] ) == False:
  25.     os.mkdir( CFG['mainbak'] )
  26.  
  27. def mysql_database_bak( database ):
  28.     global CFG
  29.     DIR = CFG['bakpath'] + "/" + database
  30.     if os.path.exists( DIR )==False:
  31.         os.mkdir( DIR )
  32.     conn = MySQLdb.connect( host = CFG['root']['hostname'] , user = CFG['root']['username'] , passwd = CFG['root']['password'] , db = database )
  33.     db = conn.cursor()
  34.     sql = "show tables";
  35.     db.execute( sql )
  36.     result = {}
  37.     for recordline in db.fetchall():
  38.         os.system( CFG['mysqldump'] + " --opt  " + database + " " + recordline[0] + " -u" + CFG['root']['username'] + " -p" + CFG['root']['password'] + " > " + DIR + "/" + database + "_" + recordline[0] + ".sql" )
  39.     os.system( "tar cvf " + CFG['bakpath'] + "/" + database + ".tar.gz " +  CFG['bakpath'] + "/" + database )
  40.     os.system( "mv " + CFG['bakpath'] + "/" + database + ".tar.gz " + CFG['mainbak'] + '/' )
  41.  
  42.  
  43. conn = MySQLdb.connect( host = CFG['root']['hostname'] , user = CFG['root']['username'] , passwd = CFG['root']['password'] , db = 'test' )
  44. sql = "show databases";
  45. db = conn.cursor()
  46. db.execute( sql )
  47. result = {}
  48. bigcount = 0
  49. for recordline in db.fetchall():
  50. littlecount = 0
  51. result[bigcount] = {}
  52. for colnum in db.description:
  53.     result[bigcount][colnum[0]] = recordline[littlecount]
  54.     littlecount += 1
  55. bigcount += 1
  56.  
  57.  
  58. for tables in result:
  59.     mysql_database_bak( result[tables]['Database'] )
  60.  
  61. os.system( "rm -rf /tmp/" + CFG['time'] )  #警告 rm -rf 这个命令相当危险,使用一定要谨慎

mysql索引优化

作者 : admin 于 2009年02月15日, 14:01:09
2009
02-15

做复杂的数据报表经常要很多sql语句连续执行,不是超时就是把mysql跑挂。不过现在硬件廉价,这些软件完美得兼容了多核多线程,虽然一个mysql进程负载高,但只占用一个内核,其他的查询依然可以使用其他的内核进行运算,服务器不会整体挂掉。

mysql优化,主要是索引,大量消耗资源的查询一定要做相关索引优化,具体优化思想我是阅读的这本书-http://www.douban.com/subject/3039216/ 里边mysql优化部分讲得非常简洁明了。而对于cpu的优化,就是尽力把整体时间拉开,cpu会比较平稳。具体做法是用sleep把sql语句分隔,这样用时间换取了稳定。当然,有些报表数据一旦作出就不会再变,这时最好把这些数据文本缓存,以后查询只读取文本即可。

MYSQL5新特性,分区表

作者 : admin 于 2008年11月15日, 17:57:03
2008
11-15

CU上看了一个介绍mysql5分区表的帖子,很感兴趣,如果有了分区的应用,那么设计数据库结构可以更加紧凑,而在应用上更加灵活,减少了一些不必要的视图,而在速度上也很好的提升。
分区的好处是,在物理上根据规则对表进行分离。
水平分区其实是B树索引物理上又增加了一级,当然要提高检索速度了,因为又多了一个手工索引。
垂直分区,在一些应用上会更加方便,比如discuz程序,帖子标题跟正文都是分离的,目的是降低单表容量,而有了垂直分区,可以在物理上对字段进行分离,而访问的时候又是类似视图的访问,无比爽也!!
目前还没测试分区到底有多少性能潜力可开发,回头用大的数据查询测试一下。
相关资料:http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html

Mysql数据库抽象层操作类

作者 : admin 于 2008年09月08日, 14:26:23
2008
09-8

DB.InterFace.php

  1. < ?php
  2. /*  DB.InterFace.php
  3.  *  DB
  4.  *  @link        http://www.sunboyu.cn
  5.  *  @package     OA
  6.  *  @version     V1.0
  7.  *
  8.  *  2008 08 28  sunboyu@gmail.com
  9.  *  Demo
  10.  */
  11. interface DateBaseConnect
  12. {
  13.     #数据库连接
  14.     public function Connect( $host , $user , $pass , $datebase );
  15. #使用数据库
  16. public function selectDateBase( $datebase );
  17. #执行一个查询
  18. public function Query( $sql );
  19. #取得一行
  20. public function fetchRow( $sql );
  21. #取得所有
  22. public function fetchAll( $sql );
  23. #取得影响行数
  24. public function affectedRow();
  25. #取得结果行数
  26. public function recordCount();
  27. #取得上次插入ID
  28. public function insertID();
  29. #释放资源
  30. public function close();
  31. }
  32. ?>

阅读全部 »

Mysql视图应用

作者 : admin 于 2008年08月28日, 20:55:26
2008
08-28

mysql视图创建方法,以我的OpenOA为例,创建user表left jion user_info表的视图

CREATE VIEW v_user AS SELECT * FROM user LEFT JOIN user_info ON (user.id = user_info.user_id)

然后查看

mysql>use oa

mysql>show tables

结果显示,v_user是库oa中的一个表。因此我们使用的时候,可以直接使用语句 SELECT * FROM v_user

而这句也就等于 SELECT * FROM user LEFT JOIN user_info ON (user.id = user_info.user_id)

而实习在系统中,v_user 只有这么一个文件v_user.frm  也就是只有结构,没有数据和索引.打开后,可以看到详细的存储的内容

TYPE=VIEW
query=select `oa`.`user`.`id` AS `id`,`oa`.`user`.`username` AS `username`,`oa`.`user`.`nickname` AS `nickname`,`oa`.`user`.`password` AS `password`,`oa`.`user`.`lastlogintime` AS `lastlogintime`,`oa`.`user`.`lastloginip` AS `lastloginip`,`oa`.`user`.`loginrand` AS `loginrand`,`oa`.`user_info`.`user_id` AS `user_id`,`oa`.`user_info`.`user_realname` AS `user_realname`,`oa`.`user_info`.`user_sex` AS `user_sex`,`oa`.`user_info`.`user_age` AS `user_age`,`oa`.`user_info`.`user_birthplace` AS `user_birthplace`,`oa`.`user_info`.`user_homeaddress` AS `user_homeaddress`,`oa`.`user_info`.`user_idcard` AS `user_idcard`,`oa`.`user_info`.`user_graduateschool` AS `user_graduateschool`,`oa`.`user_info`.`user_educational` AS `user_educational`,`oa`.`user_info`.`user_graduatetime` AS `user_graduatetime`,`oa`.`user_info`.`user_homephone` AS `user_homephone`,`oa`.`user_info`.`user_cellphone` AS `user_cellphone`,`oa`.`user_info`.`user_workphone` AS `user_workphone`,`oa`.`user_info`.`user_fax` AS `user_fax`,`oa`.`user_info`.`user_email` AS `user_email`,`oa`.`user_info`.`user_oicq` AS `user_oicq`,`oa`.`user_info`.`user_msn` AS `user_msn` from (`oa`.`user` left join `oa`.`user_info` on((`oa`.`user`.`id` = `oa`.`user_info`.`user_id`)))
md5=19f7a28463ad7447c3b4cc5428888fa6
updatable=0
algorithm=0
definer_user=root
definer_host=localhost
suid=1
with_check_option=0
revision=1
timestamp=2008-08-28 11:58:17
create-version=1
source=SELECT * FROM user LEFT JOIN user_info ON ( user.id = user_info.user_id )

都是啥意思,没有深究,只是能根据字面猜出来,如果只是用,到此位置即可。

使用mysql保存session,并建立在线用户列表

作者 : admin 于 2008年08月15日, 23:02:21
2008
08-15

写OA,使用mysql存储session,这样,是为了获得在线用户的列表,为做一个web im做准备。

首先创建表,注,这里使用了adodb中数据字典的描述方法:

  1. $Session_Fields = "
  2. session_id VARCHAR(100) NOTNULL,
  3. session_value X DEFAULT '',
  4. session_expires I(10) DEFAULT NULL,
  5. userid I(5) DEFAULT NULL
  6. ";
  7. $Session_Tables = array('mysql' => "ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci COMMENT = 'session表'");
  8. $dict = NewDataDictionary(GetDB());
  9. $sqlarray = $dict->CreateTableSQL($_CFG['table']['session'], $Session_Fields, $Session_Tables);
  10. $dict->ExecuteSQLArray($sqlarray);

然后session类:

  1. <?php
  2. /*  Session.Class.php
  3.  *  Session Manager
  4.  *  @link        http://www.sunboyu.cn
  5.  *  @package     OA
  6.  *  @version     V1.0
  7.  *
  8.  *  2008 08 14  sunboyu@gmail.com
  9.  */
  10. class Session
  11. {
  12. var $lifetime;
  13. var $db = null;
  14. function __construct()
  15. {
  16. #return adodb lite connetction
  17. $this->db = GetDB();
  18. }
  19. #open
  20. function open( $savepath , $session_name )
  21. {
  22. $this->lifetime =  get_cfg_var("session.gc_maxlifetime");
  23. return true;
  24. }
  25. #close
  26. function close()
  27. {
  28. return true;
  29. }
  30. #read
  31. function read( $session_id )
  32. {
  33. global $_CFG;
  34. $sql = sprintf("SELECT * FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
  35. $rs = $this->db->Execute( $sql );
  36. if($rs->RecordCount()>0)
  37. {
  38. $result = $rs->fields;
  39. return $result['session_value'];
  40. }
  41. else
  42. {
  43. return null;
  44. }
  45. }
  46. #write
  47. function write( $session_id , $session_value )
  48. {
  49. global $_CFG;
  50. $sql = sprintf("SELECT session_id FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
  51. $rs = $this->db->Execute( $sql );
  52. if($rs->RecordCount()==0)
  53. {
  54. $newsql = sprintf("INSERT INTO %s SET session_id = %s , session_value = %s , session_expires = %d",
  55. $_CFG['table']['session'],
  56. GetSqlString( $session_id ),
  57. GetSqlString( $session_value ),
  58. GetSqlString( $this->lifetime+time() , "int" ));
  59. }
  60. else
  61. {
  62. $newsql = sprintf("UPDATE %s SET session_value = %s , session_expires = %d WHERE session_id = %s",
  63. $_CFG['table']['session'],
  64. GetSqlString( $session_value ),
  65. GetSqlString( $this->lifetime+time() , "int" ),
  66. GetSqlString( $session_id ));
  67. }
  68. return $this->db->Execute( $newsql );
  69. }
  70. #destroy
  71. function destroy( $session_id )
  72. {
  73. global $_CFG;
  74. $delsql = sprintf("DELETE FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
  75. return $this->db->Execute( $delsql );
  76. }
  77. #gc
  78. function gc()
  79. {
  80. global $_CFG;
  81. $gcsql = sprintf("DELETE FROM %s WHERE session_expires < %d",$_CFG['table']['session'],time());
  82. return $this->db->Execute( $gcsql );
  83. }
  84. }
  85. ?>

session机制,之前已经介绍,实现代码如下

  1. $session = new Session();
  2. session_set_save_handler(array(&$session,"open"),
  3. array(&$session,"close"),
  4. array(&$session,"read"),
  5. array(&$session,"write"),
  6. array(&$session,"destroy"),
  7. array(&$session,"gc"));
  8. session_start();

把session与用户id对应,使用以下语句即可

  1. sprintf("UPDATE %s SET userid = %d WHERE session_id = %s",$_CFG['table']['session'],GetSqlString($rs['id'],'int'),GetSqlString(session_id(),'text'))

 Page 2 of 4 « 1  2  3  4 »