Home  >  Article  >  Backend Development  >  PHP reads SQL file and imports into database (example)

PHP reads SQL file and imports into database (example)

WBOY
WBOYOriginal
2016-07-25 08:55:001455browse
  1. /**

  2. * Read sql file and write to database
  3. * @version 1.01 demo.php
  4. * @author xingshaocheng
  5. * @edit: bbs.it-home.org
  6. */
  7. class DBManager
  8. {
  9. var $dbHost = '';
  10. var $dbUser = '';
  11. var $dbPassword = ' ';
  12. var $dbSchema = '';
  13. function __construct($host,$user,$password,$schema)
  14. {
  15. $this->dbHost = $host;
  16. $this->dbUser = $user ;
  17. $this->dbPassword = $password;
  18. $this->dbSchema = $schema;
  19. }
  20. function createFromFile($sqlPath,$delimiter = '(;n)|((;rn))|( ;r)',$prefix = '',$commenter = array('#','--'))
  21. {
  22. //Determine whether the file exists
  23. if(!file_exists($sqlPath))
  24. return false;
  25. $handle = fopen($sqlPath,'rb');
  26. $sqlStr = fread($handle,filesize($sqlPath));
  27. //Split through the statement delimiter of sql syntax
  28. $segment = explode( ";",trim($sqlStr));
  29. //var_dump($segment);
  30. //Remove comments and extra blank lines
  31. foreach($segment as & $statement)
  32. {
  33. $sentence = explode( "n",$statement);
  34. $newStatement = array();
  35. foreach($sentence as $subSentence)
  36. {
  37. if('' != trim($subSentence))
  38. {
  39. //Judge whether it will No is a comment
  40. $isComment = false;
  41. foreach($commenter as $comer)
  42. {
  43. if(eregi("^(".$comer.")",trim($subSentence)))
  44. {
  45. $isComment = true;
  46. break;
  47. }
  48. }
  49. //If it is not a comment, it is considered a sql statement
  50. if(!$isComment)
  51. $newStatement[] = $subSentence;
  52. }
  53. }
  54. $statement = $newStatement;
  55. }
  56. //Prefix the table name
  57. if('' != $prefix)
  58. {
  59. //Only valid when the table name appears in the first line. For example, CREATE TABLE talbeName
  60. $regxTable = "^[` '"]{0,1}[_a-zA-Z]+[_a-zA-Z0-9]*[`'"]{0,1}$";//Regular expression for processing table names
  61. $ regxLeftWall = "^[`'"]Developed";
  62. $sqlFlagTree = array(
  63. "CREATE" => array(
  64. "TABLE" => array(
  65. "$regxTable" => 0
  66. )
  67. ) ,
  68. "INSERT" => array(
  69. "INTO" => array(
  70. "$regxTable" => 0
  71. )
  72. )
  73. );
  74. foreach($segment as & $statement)
  75. {
  76. $tokens = split(" ",$statement[0]);
  77. $tableName = array();
  78. $this->findTableName($sqlFlagTree,$tokens,0,$tableName);
  79. if(empty( $tableName['leftWall']))
  80. {
  81. $newTableName = $prefix.$tableName['name'];
  82. }
  83. else{
  84. $newTableName = $tableName['leftWall'].$prefix.substr($tableName ['name'],1);
  85. }
  86. $statement[0] = str_replace($tableName['name'],$newTableName,$statement[0]);
  87. }
  88. }
  89. //Combined sql statement
  90. foreach($segment as & $statement)
  91. {
  92. $newStmt = '';
  93. foreach($statement as $sentence)
  94. {
  95. $newStmt = $newStmt.trim($sentence)."n";
  96. }
  97. $statement = $newStmt;
  98. }
  99. //For testing---------------------
  100. //var_dump($segment);
  101. //writeArrayToFile('data.txt',$segment);
  102. //----------------------------------
  103. self::saveByQuery($segment);
  104. return true;
  105. }
  106. private function saveByQuery($sqlArray)
  107. {
  108. $conn = mysql_connect($this->dbHost,$this->dbUser,$this->dbPassword);
  109. mysql_select_db($this->dbSchema);
  110. foreach($sqlArray as $sql)
  111. {
  112. mysql_query($sql);
  113. }
  114. mysql_close($conn);
  115. }
  116. private function findTableName($sqlFlagTree,$tokens,$tokensKey=0,& $tableName = array())
  117. {
  118. $regxLeftWall = "^[`'"]发达";
  119. if(count($tokens)<=$tokensKey)
  120. return false;
  121. if('' == trim($tokens[$tokensKey]))
  122. {
  123. return self::findTableName($sqlFlagTree,$tokens,$tokensKey+1,$tableName);
  124. }
  125. else
  126. {
  127. foreach($sqlFlagTree as $flag => $v)
  128. {
  129. if(eregi($flag,$tokens[$tokensKey]))
  130. {
  131. if(0==$v)
  132. {
  133. $tableName['name'] = $tokens[$tokensKey];
  134. if(eregi($regxLeftWall,$tableName['name']))
  135. {
  136. $tableName['leftWall'] = $tableName['name']{0};
  137. }
  138. return true;
  139. }
  140. else{
  141. return self::findTableName($v,$tokens,$tokensKey+1,& $tableName);
  142. }
  143. }
  144. }
  145. }
  146. return false;
  147. }
  148. }

  149. function writeArrayToFile($fileName,$dataArray,$delimiter="rn")

  150. {
  151. $handle=fopen($fileName, "wb");
  152. $text = '';
  153. foreach($dataArray as $data)
  154. {
  155. $text = $text.$data.$delimiter;
  156. }
  157. fwrite($handle,$text);
  158. }

  159. //测试

  160. $dbM = new DBManager('localhost','w01f','123456','test');
  161. $dbM->createFromFile('data.sql',null,'fff_');
  162. ?>

复制代码


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn