Upgrade.Class.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. /**
  3. * 系统升级脚本
  4. * Created by PhpStorm.
  5. * User: phperstar
  6. * Date: 2021/4/28
  7. * Time: 3:54 PM
  8. */
  9. namespace Jindouyun\Controller\Common;
  10. use Mall\Framework\Factory;
  11. use JinDouYun\Cache\AllTableNameCache;
  12. use Jindouyun\Dao\Customer\DCustomer;
  13. class Upgrade
  14. {
  15. private $serviceDB = 'default';
  16. /**
  17. * 升级sql执行
  18. */
  19. public function updateSql()
  20. {
  21. $sql = "
  22. ALTER TABLE `www.qianniao.vip`.`qianniao_goods_1` ADD COLUMN `showMinUnitPrice` tinyint(3) NOT NULL DEFAULT 4 COMMENT '属性最小单位价格是否展示  默认 4 不展示' AFTER `realSalesNum`;
  23. ";
  24. // 提取库名和表名
  25. preg_match("/(`[\S]+`)/ius", $sql, $matches);
  26. if(empty($matches)){
  27. echo 'sql错误,未匹配到库名与表名'.PHP_EOL;
  28. exit();
  29. }
  30. $matches = explode('`.`',$matches[0]);
  31. if(empty($matches)){
  32. echo 'sql错误,库名或表名错误'.PHP_EOL;
  33. exit();
  34. }
  35. foreach ($matches as $k => $v){
  36. $matches[$k] = str_replace('`','',$v);
  37. }
  38. $databaseName = $matches[0];
  39. $tableName = $matches[1];
  40. // 表名做处理
  41. $tmptableName = explode('_', $tableName);
  42. $tablePrefix = '';
  43. $sqlTableNumPoint = 1; // 出现数字的点位
  44. foreach ($tmptableName as $k => $v){
  45. if(!is_numeric($v)){
  46. $tablePrefix .= $v.'_';
  47. $sqlTableNumPoint +=1;
  48. }
  49. }
  50. $allTableName = AllTableNameCache::getAllTableNameByDatabaseName($databaseName);
  51. // 开始执行sql
  52. $objDCustomer = new DCustomer($this->serviceDB);
  53. foreach ($allTableName as $key => $value){
  54. if(strpos($value, $tablePrefix) !== false){
  55. $execTableName = explode('_', $value);
  56. $execTableNumPoint = 1; // 出现数字的点位
  57. foreach ($execTableName as $k => $v){
  58. if(!is_numeric($v)){
  59. $execTableNumPoint +=1;
  60. }
  61. }
  62. if($execTableNumPoint != $sqlTableNumPoint){
  63. continue;
  64. }
  65. $newsql = str_replace("`{$databaseName}`.`{$tableName}`","`{$databaseName}`.`{$value}`", $sql);
  66. $dbResult = $objDCustomer->query($newsql);
  67. if($dbResult == false){
  68. echo $objDCustomer->error().PHP_EOL;
  69. //exit();
  70. continue;
  71. }
  72. }
  73. }
  74. echo "当前sql执行执行完成了".PHP_EOL;
  75. }
  76. }