+ -
当前位置:首页 → 问答吧 → 事情就怕认真,细节决定成败---读《Mysql Cookbook》有感

事情就怕认真,细节决定成败---读《Mysql Cookbook》有感

时间:2008-05-15

来源:互联网

事情就怕认真,细节决定成败

       这本书我想不用去谈什么好与坏,全球公认的经典手册(cookbook)书是不容否认的,我在此只分析它做了些什么,还有些什么没做的。O’reilly公司对开源界是相当支持的,就从经典开源书籍拥有量就可以知道了,针对MySql数据库 O’reilly 出过多本,主要包括Learning MySQL,MySQL Cookbook,High Performance MySQL,MySQL Stored Procedure Programming., 等,也不知道是学习的缘故还是Mysql本来就简单灵活,许多时候直接拿起MySQL就用再来点sql就可以操作了,也可能是PHP和MySQL 捆绑的太紧大多,讲PHP的书籍多半都会讲到MySQL,所以多半时候没有系统的或较深入的学习MySQL,结果造成一个严重问题只要是MySQL都直接拿来用,只要有问题就到处找解决办法,没有多少头绪更不知道怎么解决了。

       “世界是平的”说的真好,在如今这个网络世界上什么信息都大家共享(都在网上),我们可以分享别人创造的知识财富,更好的节省人宝贵的生命时间,这是多么伟大啊!在看到Amazon.com网上的专家评语上说(译文):
  “好的编程�D�D那是说,编程对于编程者来说就是收获包括有效的代码和有用的生命而不是重复的制造车轮。如果其他人已经解决了这个你正在面对的问题,你还用愚蠢的浪费时间指出你自己的方案吗。这本书展示大量的MySql database Server解决方案。读者很有可能找到已经解决的问题解决方案,包括查询数据库、验证和格式化数据,导入和导出值,高级特色如会话跟踪和事物处理。作者已经做了大量工作整合大量对于大多数数据库编程问题有效的解决方案和教会他的读者大量关于Mysql和它的处理API。”

  这段话让我思考良久,做编程最好的是什么,是简单的编码吗不是,还是应该继承与创新。既然已经有人做了很多努力积累了大量经验并整理成书,我们为何不将其常置案头,解决我们时不时就会发生的这样或那样的问题呢?生命多么宝贵,正是有了这么多宝贵生命的奉献才有了今天丰富多彩的世界。

       另外,虽然本书集专家经验之大乘,但必然有侧重或/和未精炼之处,如果还要深入些可以看这两本(我仅知道这两本),High Performance MySQL,MySQL Stored Procedure Programming,如果刚入门看这本Learning MySQL,都是O'reilly的好书,随着编程或数据库管理的深入肯定都能用的上。   

       对于第十章讲解的数据导入与导出我简单谈谈。前段时间做个数据库备份程序,开始时不知道怎么下手就翻手册,其实备份的方法很多的可以直接用命令如:
mysqldump �Cno-create-info --tab=/tmp cookbook states(这是书上的)
也有朋友直接就:exec("d:/usr/mysql6/bin/mysqldump.exe  -uroot  -p123456  test > d:/test.sql");当然这个没有错,这也是办法啊
我想如果exec不能用呢,后来参考了phpmyadmin,大家用它都知道它有个备份功能。经分析后发现可以将表名字段取出,挨个建立起每个表的创建语句和表名信息,这个用到SHOW CREATE DATABASE 'db_name',SHOW CREATE TABLE 'table_name', SHOW TABLES FROM 'db_name'等语句获得相应数据库定义、列字段定义还有表名等信息,再就把每个表里面的记录读出来转换成Insert into 语句,当然我只是简单实现了备份。书中谈到这个内容找了一下是在第九章里面是关于获取和使用元数据这块,讲到INFORMATION_SCHEMA, Show statements, mysqldump等方法主要从问题的角度来讲解决方案的。另外书中第十章还讲到导出主要讲到使用SELECT … INTO OUTFILE语句和 mysqldump 命令行程序,导入主要讲到使用LOAD DATA语句和 mysqlimport命令行程序.其实解决问题的方法还有很多书中多有总结,应当多看多用。

下面放上自己写的备份代码,仅作参考

复制PHP内容到剪贴板
PHP代码:
function backup($file)
{
  $sql = "SHOW CREATE DATABASE {$this->dbname}";
  $result = $this->sql_query($sql);
  $row = $this->sql_fetchrow($result);
  $text = '';
  $crlf = "\r\n";
  $text .= $row['Create Database'] . $crlf;
  
  if(($tables = $this->getTables())!= false)
  {
   $text .= $this->getTableInfo($tables) . $crlf;
  }
  foreach ($tables as $table)
  {
   $text .= $this->getInsertData($table);
  }
   header("Content-disposition: filename=$file.sql");//���淇�瀛�������浠跺��
   header("Content-type: application/octetstream");
   header("Pragma: no-cache");
   header("Expires: 0");
   echo $text;     
}

function getTableInfo($tables)
{
  if(is_array($tables))
  {
   $text = '';
   $crlf = "\r\n";
   foreach($tables as $table)
   {
    $sql = "SHOW CREATE TABLE $table";
    $result = $this->sql_query($sql);
    $row = $this->sql_fetchrow($result);
    if($row != false)
    {
     $text .= $row['Create Table'] . $crlf;;
    }
    
   }
  }else 
  {
   $table = $tables;
   $sql = "SHOW CREATE TABLE $table";
   $row = $this->getOne($sql);
   $text .= $row['Create Table'] . $crlf;;
  }
  return $text;   
}

function getTables()
{
  $sql = "SHOW TABLES FROM {$this->dbname}";
  $result = $this->sql_query($sql);
  if($result != false)
  {   
   while($row = $this->sql_fetchrow($result,MYSQL_NUM))
   {
     $tables[] = $row[0];
   }
   $this->free_result($result);
   return $tables;
  }else 
  {
   return false;
  }
}

function getInsertData($table)
{
  $schema_insert = '';
  $crlf = "\r\n";
  $sql = "SELECT * FROM $table";
  $result = $this->sql_query($sql);
  $fieldsnum = mysql_num_fields($result); 
  for ($i=0;$i<$fieldsnum;$i++)
  {
   $fieldstype[] = mysql_field_type($result,$i);
  }
  $cnt = 0;
  while($row = $this->sql_fetchrow($result,MYSQL_NUM))
  {   
   if($cnt === 0)
   {
    $schema_insert .= "INSERT INTO $table VALUES(";
   }else 
   {
    $schema_insert .= $schema_insert . ",(";
   }
   for($j=0;$j<$fieldsnum;$j++)
   {
    if($fieldstype[$j] == 'string' 
    || $fieldstype[$j] == 'text' 
    || $fieldstype[$j] == 'blob')
    {
     $schema_insert .="'" . $this->sql_escape($row[$j]). "',";
    }else
    {
     $schema_insert .= $row[$j] . ",";
    }
    if($j == $fieldsnum-1)
    {
     $pos = strrpos($schema_insert, ',');
     $schema_insert = substr_replace($schema_insert, '', $pos,1) . ")" .$crlf;
    }
   }
   $cnt++;
  }
  $this->free_result($result);
  return  $schema_insert;
}



[ 本帖最后由 jfcat 于 2008-5-16 09:23 编辑 ]

作者: jfcat   发布时间: 2008-05-14

毛主席说过,凡事就怕认真二字.
中国人一认真就成为世界上第三个把人送到太空的国家,中国人一不认真却连一个螺丝都做不好.

作者: PHPChina   发布时间: 2008-05-15

写点东西不容易,看书、思考、总结,希望能够得到大家的认同

[ 本帖最后由 jfcat 于 2008-5-15 17:51 编辑 ]

作者: jfcat   发布时间: 2008-05-15

今天停电一天,没能上PHPChina感觉真不好受啊!

作者: jfcat   发布时间: 2008-05-15

mysql cookbook 的竞争好激烈啊
如果每次的奖品能多些就好了,那样会有更多的人领到书
如果谁得到奖品,回去一定要慢慢琢磨,要细心看啊,要不打屁屁哦
花了这么多时间要产生高回报,不是为了得到书去做
要为了更好的使用Mysql,为大家做出更多努力与贡献

[ 本帖最后由 jfcat 于 2008-5-16 16:48 编辑 ]

作者: jfcat   发布时间: 2008-05-16

说的很有道理

作者: PHPChina   发布时间: 2008-05-17

热门下载

更多