SQL-парсер для разбора дампов Это код простого SQL-парсера, у которого только одна задача -
извлекать запросы из SQL-дампов (файлов). Почему парсер простой? Потому
что сложный используется в подсветке кода :)
Код вполне может содержать ошибки, не судите строго. Если ошибки есть, присылайте их мне, обязательно исправлю!
Код - Простой парсер SQL-дампов |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| <?php /** * Простой парсер SQL-дампов для извлечения запросов * * Использование: * SQLParser::getQueriesFromFile('Имя файла') - Извлечение запросов из файла * SQLParser::getQueries('SQL-дамп') - Извлечение запросов из строки * * Обе функции возвращают массив из запросов. Пустые запросы опускаются. * * Лицензия: * Это свободный код, используйте его на свой страх и риск. * Автор не несёт никакой ответственности! :) * * @author Прибора Антон Николаевич (http://anton-pribora.ru) * @copyright © Прибора Антон Николаевич, 2008-11-07 */
/** * Парсер SQL-запросов * */ class SQLParser { /** * Выборка SQL-запросов из файла * * @param string $file * @return array */ static public function getQueriesFromFile( $file ) { return self::getQueries( file_get_contents($file) ); } /** * Разбор SQL-строки на запросы * * @param string $sql * @return array */ static public function getQueries( $sql ) { $queries = array(); $strlen = strlen($sql); $position = 0; $query = ''; for ( ; $position < $strlen; ++$position ) { $char = $sql{ $position }; switch ( $char ) { case '-': if ( substr($sql, $position, 3) !== '-- ' ) { $query .= $char; break; } case '#': while ( $char !== "r" && $char !== "n" && $position < $strlen - 1 ) $char = $sql{ ++$position }; break; case '`': case ''': case '"': $quote = $char; $query .= $quote; while ( $position < $strlen - 1 ) { $char = $sql{ ++$position }; if ( $char === '' ) { $query .= $char; if ( $position < $strlen - 1 ) { $char = $sql{ ++$position }; $query .= $char; if ( $position < $strlen - 1 ) $char = $sql{ ++$position }; } else { break; } } if ( $char === $quote ) break; $query .= $char; } $query .= $quote; break; case ';': $query = trim($query); if ( $query ) $queries[] = $query; $query = ''; break; default: $query .= $char; break; } } $query = trim( $query ); if ( $query ) $queries[] = $query; return $queries; } }
?> |
Пример использования.
Код - Пример использования |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <?php
require('SQLParser.class.php');
header('Content-Type: text/plain; charset=windows-1251');
$SQL = <<<SQL -- phpMyAdmin SQL Dump -- version 2.6.1 -- http://www.phpmyadmin.net -- -- Хост: localhost -- Время создания: Ноя 07 2008 г., 20:48 -- Версия сервера: 4.1.16 -- Версия PHP: 5.2.3 -- -- БД: `my_db` --
-- -- Дамп данных таблицы `table` --
INSERT INTO `table` VALUES ('`; ';'); -- Comment INSERT INTO `table` VALUES ("";asdasd;asd asd; asd""); # Comment SQL;
print_r( SQLParser::getQueries($SQL) );
?> |
Код - Результат |
1 2 3 4 5
| Array ( [0] => INSERT INTO `table` VALUES ('`; ';') [1] => INSERT INTO `table` VALUES ("";asdasd;asd asd; asd"") ) |
Источник: anton-pribora.ru |
текущее:
НОВОСТИ |