Быстрый поиск
Введите фрагмент названия статьи для поиска
Подсветка синтаксиса MySQL-запросов
07.04.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
При выводе диагностики в своих рабочих проектах я использую вот такую функцию для подсветки синтаксиса MySQL-запросов. Она преобразует текст запроса, делая все служебные слова языка заглавными буквами и подсвечивает их цветом, а также выделяет различными цветами числовые значения и скобки. Такая подсветка позволяет сразу же увидеть синтаксические ошибки, да и вообще повышает наглядность сообщений при отладке скриптов.Code (PHP) : Убрать нумерацию
- //-------------------------------------------------------------------
- // Функция подсветки синтаксиса MySQL-запроса
- // (C) ManHunter / PCL
- // http://www.manhunter.ru
- //-------------------------------------------------------------------
- function mysql_debug($query) {
- $tmp=htmlspecialchars($query);
- $tmp=str_replace("\r",'',$tmp);
- $tmp=trim(str_replace("\n","\r\n",$tmp))."\r\n";
- $quote_list_text=array();
- $quote_list_symbols=array();
- $k=0;
- $quotes=Array();
- // Обработать экранированные кавычки
- preg_match_all("/\\\'|\\\"/is", $tmp, $quotes);
- array_unique($quotes);
- if (count($quotes)) {
- foreach($quotes[0] as $i) {
- $k++;
- $quote_list_symbols[$k]=$i;
- $tmp=str_replace($i, '<symbol'.$k.'>', $tmp);
- }
- }
- $matches=Array(
- "/("|'|`)(.*?)(\\1)/is", // текст в кавычках
- "/\/\*.*?\*\//s", // текст комментария
- "/ \-\-.*\x0D\x0A/", // текст ' --' комментария
- "/ #.*\x0D\x0A/", // текст ' #' комментария
- );
- // Обработать текст
- foreach($matches as $match) {
- // Обработать текст
- $found=array();
- preg_match_all($match, $tmp, $found);
- $quotes=(array)$found[0];
- array_unique($quotes);
- if (count($quotes)) {
- foreach($quotes as $i) {
- $k++;
- $quote_list_text[$k]=$i;
- $tmp=str_replace($i, '<text'.$k.'>', $tmp);
- }
- }
- }
- // Служебные слова MySQL
- $keywords=Array(
- "avg", "as", "auto_increment", "and", "analyze", "alter",
- "asc", "all", "after", "add", "action", "against",
- "aes_encrypt", "aes_decrypt", "ascii", "abs", "acos",
- "asin", "atan", "authors", "between", "btree", "backup",
- "by", "binary", "before", "binlog", "benchmark", "blob",
- "bigint", "bit_count", "bit_or", "bit_and", "bin",
- "bit_length", "both", "create", "count", "comment",
- "check", "char", "concat", "cipher", "changed", "column",
- "columns", "change", "constraint", "cascade", "checksum",
- "cross", "close", "concurrent", "commit", "curdate",
- "current_date", "curtime", "current_time",
- "current_timestamp", "cast", "convert", "connection_id",
- "coalesce", "case", "conv", "concat_ws", "char_length",
- "character_length", "ceiling", "cos", "cot", "crc32",
- "compress", "delete", "drop", "default", "distinct",
- "decimal", "date", "describe", "data", "desc",
- "dayofmonth", "date_add", "database", "databases",
- "double", "duplicate", "disable", "datetime", "dumpfile",
- "distinctrow", "delayed", "dayofweek", "dayofyear",
- "dayname", "day_minute", "date_format", "date_sub",
- "decode", "des_encrypt", "des_decrypt", "degrees",
- "decompress", "dec", "engine", "explain", "enum",
- "escaped", "execute", "extended", "errors", "exists",
- "enable", "enclosed", "extract", "encrypt", "encode",
- "elt", "export_set", "escape", "exp", "end", "from",
- "float", "flush", "fields", "file", "for", "fast", "full",
- "fulltext", "first", "foreign", "force", "from_days",
- "from_unixtime", "format", "found_rows", "floor", "field",
- "find_in_set", "group", "grant", "grants", "global",
- "get_lock", "greatest", "having", "high_priority",
- "handler", "hour", "hex", "insert", "into", "inner",
- "int", "ifnull", "if", "isnull", "in", "infile", "is",
- "interval", "ignore", "identified", "index", "issuer",
- "integer", "is_free_lock", "inet_ntoa", "inet_aton",
- "instr", "join", "kill", "key", "keys", "left", "load",
- "local", "limit", "like", "lock", "lpad", "last_insert_id",
- "logs", "length", "longblob", "longtext", "last", "lines",
- "low_priority", "locate", "ltrim", "leading", "lcase",
- "lower", "load_file", "ln", "log", "least", "month", "mod",
- "max", "min", "mediumint", "medium", "master", "modify",
- "mediumblob", "mediumtext", "match", "mode", "monthname",
- "mid", "minute", "master_pos_wait", "make_set", "null",
- "not", "now", "none", "new", "numeric", "no", "natural",
- "next", "nullif", "national", "nchar", "on", "or",
- "optimize", "order", "optionally", "option", "outfile",
- "open", "offset", "outer", "old_password", "ord", "oct",
- "octet_length", "primary", "password", "privileges",
- "process", "processlist", "purge", "partial", "procedure",
- "prev", "period_add", "period_diff", "position", "pow",
- "power", "pi", "quick", "quarter", "quote", "right",
- "repair", "restore", "reset", "regexp", "references",
- "replace", "revoke", "reload", "require", "replication",
- "read", "rand", "rename", "real", "restrict",
- "release_lock", "rpad", "rtrim", "repeat", "reverse",
- "rlike", "round", "radians", "rollup", "select", "sum",
- "set", "show", "substring", "smallint", "super", "subject",
- "status", "slave", "session", "start", "share",
- "straight_join", "sql_small_result", "sql_big_result",
- "sql_buffer_result", "sql_cache", "sql_no_cache",
- "sql_calc_found_rows", "second", "sysdate", "sec_to_time",
- "system_user", "session_user", "substring_index", "std",
- "stddev", "soundex", "space", "strcmp", "sign", "sqrt",
- "sin", "straight", "sleep", "text", "truncate", "table",
- "tinyint", "tables", "to_days", "temporary", "terminated",
- "to", "types", "time", "timestamp", "tinytext",
- "tinyblob", "transaction", "time_format", "time_to_sec",
- "trim", "trailing", "tan", "then", "update", "union",
- "using", "unsigned", "unlock", "usage", "use_frm",
- "unix_timestamp", "unique", "use", "user", "ucase",
- "upper", "uuid", "values", "varchar", "variables",
- "version", "variance", "varying", "where", "with",
- "warnings", "write", "weekday", "week", "when", "xor",
- "year", "yearweek", "year_month", "zerofill");
- $replace=Array();
- foreach($keywords as $keyword) {
- $replace[]='/\b'.$keyword.'\b/ie';
- }
- // Выделить служебные слова в тексте запроса
- $tmp=preg_replace($replace,
- '"<b style=\"color:#0000FF\">".strtoupper("$0")."</b>"',$tmp);
- // Выделить числовые значения в тексте запроса
- $tmp=preg_replace('/\b([\.0-9]+)\b/',
- '<b style="color:#008000">\1</b>',$tmp);
- // Выделить скобки в тексте запроса
- $tmp=preg_replace('/([\(\)])/',
- '<b style="color:#FF0000">\1</b>',$tmp);
- // Вернуть обратно строки в кавычках
- if (count($quote_list_text)) {
- $quote_list_text=array_reverse($quote_list_text, true);
- foreach($quote_list_text as $k=>$i) {
- $tmp=str_replace('<text'.$k.'>',
- '<span style="color:#777;">'.$i.'</span>', $tmp);
- }
- }
- // Вернуть обратно экранированные символы
- if (count($quote_list_symbols)) {
- $quote_list_symbols=array_reverse($quote_list_symbols, true);
- foreach($quote_list_symbols as $k=>$i) {
- $tmp=str_replace('<symbol'.$k.'>', $i, $tmp);
- }
- }
- // Вернуть подсвеченный текст запроса
- // Если не надо расставлять переносы, то уберите nl2br
- return nl2br(trim($tmp));
- }
Читать статью целиком »
Просмотров: 4701 | Комментариев: 7
Fake YB for Firefox 1.0
04.04.2012 | Категория: Мои программы | Автор: ManHunter
Скриншот программы Fake YB for Firefox
Эта небольшая программа предназначена для изменения строки UserAgent браузера Firefox таким образом, чтобы можно было качать с файлообменника Яндекс.Народ без ввода контрольных цифр. Обычно это достигается только установкой Яндекс.Бара, который лично я считаю вредоносной троянской программой. В версиях Firefox до 3.x включительно, подменить UserAgent можно было через обычные настройки браузера, но, начиная с 4-й версии Firefox, разработчики убрали эту возможность. Всю теорию по этому вопросу вы можете почитать здесь. Поместите программу Fake YB for Firefox в папку с установленным браузером или же выберите вручную файл application.ini из папки Firefox. При необходимости измените версию Яндекс.Бара на нужную вам, затем нажмите кнопку "Patch". Для восстановления исходного состояния нажмите кнопку "Restore". Возможность восстановления сделана специально, если изменение UserAgent конфликтует с обновлением браузера, плагинов или дополнений. После применения патча или восстановления обязательно перезапустите браузер, чтобы изменения вступили в силу.
Читать статью целиком »
Просмотров: 5194 | Комментариев: 14
Готовим тефтели
03.04.2012 | Категория: А еще я туда ем! | Автор: ManHunter
Готовим тефтели
Ежики с рисом уже были, теперь будем готовить самые настоящие тефтели, все как полагается. Тефтели обязательно входили в меню любой советской столовой, ну а в наше время они тоже легко могут стать центральным блюдом вашего стола. Особых кулинарных навыков вам не потребуется, впрочем, как и для всех остальных рецептов на этом сайте.
Читать статью целиком »
Просмотров: 8138 | Комментариев: 3
Концерт группы "Sirenia" в клубе "Plan B"
29.03.2012 | Категория: Жизнь в оффлайне | Автор: ManHunter
Концерт группы "Sirenia" в клубе "Plan B"
Морозы все никак не уходят, пора пускать в дело тяжелую артиллерию. Группа "Sirenia" снова в нашем городе! Обожаю этот коллектив, особенно с новой вокалисткой Айлин, ведь теперь в их творчестве сочетается брутальность норвежцев и страсть испанской Барселоны.
Читать статью целиком »
Просмотров: 4377 | Комментариев: 4
Замена подстроки в строке на Ассемблере
28.03.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
Во всех языках высокого уровня среди функций работы со строками присутствуют функции замены заданной подстроки в строке. В Ассемблере такой функции нет, как нет ее и среди функций стандартных библиотек. Замена подстроки на строку такой же длины обычно сложностей не составляет, так как ее можно выполнить прямо в исходной строке без выделения дополнительной памяти. Замена на строку произвольной длины, в том числе и пустую, будет посложнее. Для этого я написал следующую функцию.Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------
- ; Функция замены подстроки в строке
- ;-----------------------------------------------------
- ; lpSrc - указатель на исходную строку
- ; lpDst - указатель на буфер для полученной строки
- ; lpPattern - указатель на заменяемую подстроку
- ; lpReplace - указатель на строку для замены
- ; dNum - количество замен (0 - заменить все)
- ;-----------------------------------------------------
- proc _replace lpSrc:DWORD, lpPattern:DWORD, lpReplace:DWORD,\
- lpDst:DWORD, dNum:DWORD
- pusha
- ; Указатель на буфер-приемник
- mov edx,[lpDst]
- ; Счетчик замен
- xor ebx,ebx
- ; Исходная строка не пустая?
- mov ecx,[lpSrc]
- cmp byte [ecx],0
- jz .loc_ret
- ; Заменяемая строка не пустая?
- mov eax,[lpPattern]
- cmp byte [eax],0
- jz .loc_copy_all
- .loc_scan:
- mov esi,ecx
- mov edi,[lpPattern]
- ; Исходная строка закончилась?
- cmp byte [esi],0
- je .loc_end_replace
- @@:
- ; Строки совпали с паттерном?
- cmp byte [edi],0
- je .loc_move_replace
- ; Символ совпадает с
- lodsb
- ; Заменять все вхождения?
- cmp [dNum],0
- je .loc_skip_counter
- ; Уже заменили нужное количество?
- cmp ebx,[dNum]
- je .loc_move_one_char
- .loc_skip_counter:
- cmp al,byte [edi]
- jne .loc_move_one_char
- inc edi
- jmp @b
- .loc_move_replace:
- ; Увеличить счетчик замен
- inc ebx
- mov ecx,esi
- ; Записать заменяющую строку
- mov esi,[lpReplace]
- mov edi,edx
- @@:
- lodsb
- or al,al
- jz .loc_scan
- stosb
- inc edx
- jmp @b
- .loc_move_one_char:
- ; Скопировать один символ
- mov al,byte [ecx]
- mov byte [edx],al
- inc edx
- inc ecx
- jmp .loc_scan
- .loc_end_replace:
- ; Записать финальный 0 в строку
- mov byte [edx],0
- jmp .loc_ret
- .loc_copy_all:
- ; Просто скопировать исходную строку
- mov esi,[lpSrc]
- mov edi,[lpDst]
- @@:
- lodsb
- stosb
- or al,al
- jnz @b
- .loc_ret:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 11460 | Комментариев: 8