123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- <?php
- // +----------------------------------------------------------------------
- // | Yzncms [ 御宅男工作室 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2018 http://yzncms.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: 御宅男 <530765310@qq.com>
- // +----------------------------------------------------------------------
-
- // +----------------------------------------------------------------------
- // | SQL
- // +----------------------------------------------------------------------
- namespace util;
-
- /**
- * 读取Sql文件并返回可执行的sql语句
- */
- class Sql
- {
- /**
- * 从sql文件获取纯sql语句
- *
- * @param string $sql_file sql文件路径
- * @param bool $string 如果为真,则只返回一条sql语句,默认以数组形式返回
- * @param array $replace 替换前缀,如:['my_' => 'me_'],表示将表前缀"my_"替换成"me_"
- * 这种前缀替换方法不一定准确,比如正常内容内有跟前缀相同的字符,也会被替换
- *
- * @return array|false|string
- */
- public static function getSqlFromFile($sql_file = '', $string = false, $replace = [])
- {
- if (!file_exists($sql_file)) {
- return false;
- }
-
- // 读取sql文件内容
- $handle = self::read_file($sql_file);
-
- // 分割语句
- $handle = self::parseSql($handle, $string, $replace);
-
- return $handle;
- }
-
- /**
- * 分割sql语句
- * @param string $content sql内容
- * @param bool $string 如果为真,则只返回一条sql语句,默认以数组形式返回
- * @param array $replace 替换前缀,如:['my_' => 'me_'],表示将表前缀my_替换成me_
- * @return array|string 除去注释之后的sql语句数组或一条语句
- */
- public static function parseSql($content = '', $string = false, $replace = [])
- {
- // 被替换的前缀
- $from = '';
- // 要替换的前缀
- $to = '';
-
- // 替换表前缀
- if (!empty($replace)) {
- $to = current($replace);
- $from = current(array_flip($replace));
- }
-
- if ($content != '') {
- // 纯sql内容
- $pure_sql = [];
-
- // 多行注释标记
- $comment = false;
-
- // 按行分割,兼容多个平台
- $content = str_replace(["\r\n", "\r"], "\n", $content);
- $content = explode("\n", trim($content));
-
- // 循环处理每一行
- foreach ($content as $key => $line) {
- // 跳过空行
- if ($line == '') {
- continue;
- }
-
- // 跳过以#或者--开头的单行注释
- if (preg_match("/^(#|--)/", $line)) {
- continue;
- }
-
- // 跳过以/**/包裹起来的单行注释
- if (preg_match("/^\/\*(.*?)\*\//", $line)) {
- continue;
- }
-
- // 多行注释开始
- if (substr($line, 0, 2) == '/*') {
- $comment = true;
- continue;
- }
-
- // 多行注释结束
- if (substr($line, -2) == '*/') {
- $comment = false;
- continue;
- }
-
- // 多行注释没有结束,继续跳过
- if ($comment) {
- continue;
- }
-
- // 替换表前缀
- if ($from != '') {
- $line = str_replace('`' . $from, '`' . $to, $line);
- }
-
- // sql语句
- array_push($pure_sql, $line);
- }
-
- // 只返回一条语句
- if ($string) {
- return implode("", $pure_sql);
- }
-
- // 以数组形式返回sql语句
- $pure_sql = implode("\n", $pure_sql);
- $pure_sql = explode(";\n", $pure_sql);
- return $pure_sql;
- } else {
- return $string == true ? '' : [];
- }
- }
-
- /**
- * 读取文件内容
- * @param $filename 文件名
- * @return string 文件内容
- */
- public static function read_file($filename)
- {
- $content = '';
- if (function_exists('file_get_contents')) {
- @$content = file_get_contents($filename);
- } else {
- if (@$fp = fopen($filename, 'r')) {
- @$content = fread($fp, filesize($filename));
- @fclose($fp);
- }
- }
- return $content;
- }
- }
|