Sql.class.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace Util;
  3. /**
  4. * Sql语句处理执行类
  5. *
  6. */
  7. class Sql
  8. {
  9. /**
  10. * 解析数据库语句函数
  11. * @param string $sql 带默认前缀的sql语句
  12. * @param string $tablepre 当前系统前缀
  13. * @return multitype:string 返回最终需要的sql语句
  14. */
  15. public function sql_split($sql, $tablepre)
  16. {
  17. if ($tablepre != "ly_") {
  18. $sql = str_replace("EXISTS `ly_", 'EXISTS `' . $tablepre, $sql);
  19. $sql = str_replace("TABLE `ly_", 'TABLE `' . $tablepre, $sql);
  20. $sql = str_replace("LOCK TABLES `ly_", 'LOCK TABLES `' . $tablepre, $sql);
  21. $sql = str_replace("INSERT INTO `ly_", 'INSERT INTO `' . $tablepre, $sql);
  22. }
  23. $sql = preg_replace("/TYPE=(InnoDB|MyISAM|MEMORY)( DEFAULT CHARSET=[^; ]+)?/", "ENGINE=\\1 DEFAULT CHARSET=utf8", $sql);
  24. if ($r_tablepre != $s_tablepre) {
  25. $sql = str_replace($s_tablepre, $r_tablepre, $sql);
  26. }
  27. $sql = str_replace("\r", "\n", $sql);
  28. $ret = array();
  29. $num = 0;
  30. $queriesarray = explode(";\n", trim($sql));
  31. unset($sql);
  32. foreach ($queriesarray as $query) {
  33. $ret[$num] = '';
  34. $queries = explode("\n", trim($query));
  35. $queries = array_filter($queries);
  36. foreach ($queries as $query) {
  37. $str1 = substr($query, 0, 1);
  38. if ($str1 != '#' && $str1 != '-') {
  39. $ret[$num] .= $query;
  40. }
  41. }
  42. $num++;
  43. }
  44. return $ret;
  45. }
  46. /**
  47. * 执行文件中SQL语句函数
  48. * @param string $file sql语句文件路径
  49. * @param string $tablepre 自己的前缀
  50. * @return multitype:string 返回最终需要的sql语句
  51. */
  52. public function execute_sql_from_file($file)
  53. {
  54. $sql_data = file_get_contents($file);
  55. if (!$sql_data) {
  56. return true;
  57. }
  58. $sql_format = $this->sql_split($sql_data, C('DB_PREFIX'));
  59. $counts = count($sql_format);
  60. for ($i = 0; $i < $counts; $i++) {
  61. $sql = trim($sql_format[$i]);
  62. D()->execute($sql);
  63. }
  64. return true;
  65. }
  66. }