Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Подсветка синтаксиса MySQL-запросов

07.04.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
При выводе диагностики в своих рабочих проектах я использую вот такую функцию для подсветки синтаксиса MySQL-запросов. Она преобразует текст запроса, делая все служебные слова языка заглавными буквами и подсвечивает их цветом, а также выделяет различными цветами числовые значения и скобки. Такая подсветка позволяет сразу же увидеть синтаксические ошибки, да и вообще повышает наглядность сообщений при отладке скриптов.
  1. //-------------------------------------------------------------------
  2. // Функция подсветки синтаксиса MySQL-запроса
  3. // (C) ManHunter / PCL
  4. // http://www.manhunter.ru
  5. //-------------------------------------------------------------------
  6. function mysql_debug($query) {
  7.     $tmp=htmlspecialchars($query);
  8.     $tmp=str_replace("\r",'',$tmp);
  9.     $tmp=trim(str_replace("\n","\r\n",$tmp))."\r\n";
  10.  
  11.     $quote_list_text=array();
  12.     $quote_list_symbols=array();
  13.  
  14.     $k=0;
  15.     $quotes=Array();
  16.     // Обработать экранированные кавычки
  17.     preg_match_all("/\\\'|\\\"/is"$tmp$quotes);
  18.     array_unique($quotes);
  19.     if (count($quotes)) {
  20.         foreach($quotes[0] as $i) {
  21.             $k++;
  22.             $quote_list_symbols[$k]=$i;
  23.             $tmp=str_replace($i'<symbol'.$k.'>'$tmp);
  24.         }
  25.     }
  26.  
  27.     $matches=Array(
  28.         "/(&quot;|'|`)(.*?)(\\1)/is"// текст в кавычках
  29.         "/\/\*.*?\*\//s",             // текст комментария
  30.         "/ \-\-.*\x0D\x0A/",          // текст ' --' комментария
  31.         "/ #.*\x0D\x0A/",             // текст ' #' комментария
  32.     );
  33.  
  34.     // Обработать текст
  35.     foreach($matches as $match) {
  36.         // Обработать текст
  37.         $found=array();
  38.         preg_match_all($match$tmp$found);
  39.         $quotes=(array)$found[0];
  40.         array_unique($quotes);
  41.         if (count($quotes)) {
  42.             foreach($quotes as $i) {
  43.                 $k++;
  44.                 $quote_list_text[$k]=$i;
  45.                 $tmp=str_replace($i'<text'.$k.'>'$tmp);
  46.             }
  47.         }
  48.     }    
  49.  
  50.     // Служебные слова MySQL
  51.     $keywords=Array(
  52.         "avg""as""auto_increment""and""analyze""alter",
  53.         "asc""all""after""add""action""against",
  54.         "aes_encrypt""aes_decrypt""ascii""abs""acos",
  55.         "asin""atan""authors""between""btree""backup",
  56.         "by""binary""before""binlog""benchmark""blob",
  57.         "bigint""bit_count""bit_or""bit_and""bin",
  58.         "bit_length""both""create""count""comment",
  59.         "check""char""concat""cipher""changed""column",
  60.         "columns""change""constraint""cascade""checksum",
  61.         "cross""close""concurrent""commit""curdate",
  62.         "current_date""curtime""current_time",
  63.         "current_timestamp""cast""convert""connection_id",
  64.         "coalesce""case""conv""concat_ws""char_length",
  65.         "character_length""ceiling""cos""cot""crc32",
  66.         "compress""delete""drop""default""distinct",
  67.         "decimal""date""describe""data""desc",
  68.         "dayofmonth""date_add""database""databases",
  69.         "double""duplicate""disable""datetime""dumpfile",
  70.         "distinctrow""delayed""dayofweek""dayofyear",
  71.         "dayname""day_minute""date_format""date_sub"
  72.         "decode""des_encrypt""des_decrypt""degrees",
  73.         "decompress""dec""engine""explain""enum",
  74.         "escaped""execute""extended""errors""exists",
  75.         "enable""enclosed""extract""encrypt""encode",
  76.         "elt""export_set""escape""exp""end""from",
  77.         "float""flush""fields""file""for""fast""full",
  78.         "fulltext""first""foreign""force""from_days"
  79.         "from_unixtime""format""found_rows""floor""field",
  80.         "find_in_set""group""grant""grants""global"
  81.         "get_lock""greatest""having""high_priority"
  82.         "handler""hour""hex""insert""into""inner"
  83.         "int""ifnull""if""isnull""in""infile""is"
  84.         "interval""ignore""identified""index""issuer"
  85.         "integer""is_free_lock""inet_ntoa""inet_aton"
  86.         "instr""join""kill""key""keys""left""load"
  87.         "local""limit""like""lock""lpad""last_insert_id"
  88.         "logs""length""longblob""longtext""last""lines"
  89.         "low_priority""locate""ltrim""leading""lcase"
  90.         "lower""load_file""ln""log""least""month""mod"
  91.         "max""min""mediumint""medium""master""modify"
  92.         "mediumblob""mediumtext""match""mode""monthname"
  93.         "mid""minute""master_pos_wait""make_set""null"
  94.         "not""now""none""new""numeric""no""natural"
  95.         "next""nullif""national""nchar""on""or"
  96.         "optimize""order""optionally""option""outfile"
  97.         "open""offset""outer""old_password""ord""oct"
  98.         "octet_length""primary""password""privileges"
  99.         "process""processlist""purge""partial""procedure",
  100.         "prev""period_add""period_diff""position""pow"
  101.         "power""pi""quick""quarter""quote""right"
  102.         "repair""restore""reset""regexp""references"
  103.         "replace""revoke""reload""require""replication"
  104.         "read""rand""rename""real""restrict"
  105.         "release_lock""rpad""rtrim""repeat""reverse"
  106.         "rlike""round""radians""rollup""select""sum"
  107.         "set""show""substring""smallint""super""subject"
  108.         "status""slave""session""start""share"
  109.         "straight_join""sql_small_result""sql_big_result"
  110.         "sql_buffer_result""sql_cache""sql_no_cache"
  111.         "sql_calc_found_rows""second""sysdate""sec_to_time"
  112.         "system_user""session_user""substring_index""std"
  113.         "stddev""soundex""space""strcmp""sign""sqrt"
  114.         "sin""straight""sleep""text""truncate""table"
  115.         "tinyint""tables""to_days""temporary""terminated"
  116.         "to""types""time""timestamp""tinytext"
  117.         "tinyblob""transaction""time_format""time_to_sec"
  118.         "trim""trailing""tan""then""update""union"
  119.         "using""unsigned""unlock""usage""use_frm"
  120.         "unix_timestamp""unique""use""user""ucase"
  121.         "upper""uuid""values""varchar""variables"
  122.         "version""variance""varying""where""with"
  123.         "warnings""write""weekday""week""when""xor"
  124.         "year""yearweek""year_month""zerofill");
  125.     $replace=Array();
  126.     foreach($keywords as $keyword) {
  127.         $replace[]='/\b'.$keyword.'\b/ie';
  128.     }
  129.  
  130.     // Выделить служебные слова в тексте запроса
  131.     $tmp=preg_replace($replace,
  132.         '"<b style=\"color:#0000FF\">".strtoupper("$0")."</b>"',$tmp);
  133.  
  134.     // Выделить числовые значения в тексте запроса
  135.     $tmp=preg_replace('/\b([\.0-9]+)\b/',
  136.         '<b style="color:#008000">\1</b>',$tmp);
  137.  
  138.     // Выделить скобки в тексте запроса
  139.     $tmp=preg_replace('/([\(\)])/',
  140.         '<b style="color:#FF0000">\1</b>',$tmp);
  141.  
  142.     // Вернуть обратно строки в кавычках
  143.     if (count($quote_list_text)) {
  144.         $quote_list_text=array_reverse($quote_list_texttrue);
  145.         foreach($quote_list_text as $k=>$i) {
  146.             $tmp=str_replace('<text'.$k.'>',
  147.                 '<span style="color:#777;">'.$i.'</span>'$tmp);
  148.         }
  149.     }
  150.     // Вернуть обратно экранированные символы
  151.     if (count($quote_list_symbols)) {
  152.         $quote_list_symbols=array_reverse($quote_list_symbolstrue);
  153.         foreach($quote_list_symbols as $k=>$i) {
  154.             $tmp=str_replace('<symbol'.$k.'>'$i$tmp);
  155.         }
  156.     }
  157.  
  158.     // Вернуть подсвеченный текст запроса
  159.     // Если не надо расставлять переносы, то уберите nl2br
  160.     return nl2br(trim($tmp));
  161. }
Единственный параметр функции $query - текст исходного запроса. На выходе подсвеченная строка запроса в формате HTML. Цвета подсветки захардкодены в исходнике, если надо, то поменяйте их на свои или вообще замените на определения стилей CSS.

Читать статью целиком »
Просмотров: 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
Во всех языках высокого уровня среди функций работы со строками присутствуют функции замены заданной подстроки в строке. В Ассемблере такой функции нет, как нет ее и среди функций стандартных библиотек. Замена подстроки на строку такой же длины обычно сложностей не составляет, так как ее можно выполнить прямо в исходной строке без выделения дополнительной памяти. Замена на строку произвольной длины, в том числе и пустую, будет посложнее. Для этого я написал следующую функцию.
  1. ;-----------------------------------------------------
  2. ; Функция замены подстроки в строке
  3. ;-----------------------------------------------------
  4. ; lpSrc - указатель на исходную строку
  5. ; lpDst - указатель на буфер для полученной строки
  6. ; lpPattern - указатель на заменяемую подстроку
  7. ; lpReplace - указатель на строку для замены
  8. ; dNum - количество замен (0 - заменить все)
  9. ;-----------------------------------------------------
  10. proc    _replace lpSrc:DWORD, lpPattern:DWORD, lpReplace:DWORD,\
  11.                  lpDst:DWORD, dNum:DWORD
  12.  
  13.         pusha
  14.  
  15.         ; Указатель на буфер-приемник
  16.         mov     edx,[lpDst]
  17.  
  18.         ; Счетчик замен
  19.         xor     ebx,ebx
  20.  
  21.         ; Исходная строка не пустая?
  22.         mov     ecx,[lpSrc]
  23.         cmp     byte [ecx],0
  24.         jz      .loc_ret
  25.  
  26.         ; Заменяемая строка не пустая?
  27.         mov     eax,[lpPattern]
  28.         cmp     byte [eax],0
  29.         jz      .loc_copy_all
  30.  
  31. .loc_scan:
  32.         mov     esi,ecx
  33.         mov     edi,[lpPattern]
  34.  
  35.         ; Исходная строка закончилась?
  36.         cmp     byte [esi],0
  37.         je      .loc_end_replace
  38. @@:
  39.         ; Строки совпали с паттерном?
  40.         cmp     byte [edi],0
  41.         je      .loc_move_replace
  42.  
  43.         ; Символ совпадает с
  44.         lodsb
  45.  
  46.         ; Заменять все вхождения?
  47.         cmp     [dNum],0
  48.         je      .loc_skip_counter
  49.  
  50.         ; Уже заменили нужное количество?
  51.         cmp     ebx,[dNum]
  52.         je      .loc_move_one_char
  53. .loc_skip_counter:
  54.         cmp     al,byte [edi]
  55.         jne     .loc_move_one_char
  56.  
  57.         inc     edi
  58.         jmp     @b
  59.  
  60. .loc_move_replace:
  61.         ; Увеличить счетчик замен
  62.         inc     ebx
  63.  
  64.         mov     ecx,esi
  65.  
  66.         ; Записать заменяющую строку
  67.         mov     esi,[lpReplace]
  68.         mov     edi,edx
  69. @@:
  70.         lodsb
  71.         or      al,al
  72.         jz      .loc_scan
  73.         stosb
  74.         inc     edx
  75.         jmp     @b
  76.  
  77. .loc_move_one_char:
  78.         ; Скопировать один символ
  79.         mov     al,byte [ecx]
  80.         mov     byte [edx],al
  81.         inc     edx
  82.         inc     ecx
  83.         jmp     .loc_scan
  84.  
  85. .loc_end_replace:
  86.         ; Записать финальный 0 в строку
  87.         mov     byte [edx],0
  88.  
  89.         jmp     .loc_ret
  90. .loc_copy_all:
  91.         ; Просто скопировать исходную строку
  92.         mov     esi,[lpSrc]
  93.         mov     edi,[lpDst]
  94. @@:
  95.         lodsb
  96.         stosb
  97.         or      al,al
  98.         jnz     @b
  99. .loc_ret:
  100.         popa
  101.         ret
  102. endp
Функция самодостаточная, не использует никаких внешних функций и не требует для своей работы дополнительных переменных в памяти. Параметры: lpSrc - указатель на исходную строку в формате ASCIIZ, lpPattern - указатель на искомую подстроку в формате ASCIIZ, lpReplace - указатель на строку для замены в формате ASCIIZ, может быть пустая строка, lpDst - указатель на буфер-приемник полученной после замены строки, его размер должен быть зарезервирован с учетом замененных строк, dNum - количество замен, которое надо выполнить (0 - заменять все вхождения). Я постарался оптимизировать функцию замены по скорости, но, наверное, можно ее ускорить как-нибудь еще.

Читать статью целиком »
Просмотров: 11460 | Комментариев: 8

01 ... 296 297 298 299 300 301 302 ... 400
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.13 сек. / MySQL: 2 (0.0438 сек.) / Память: 4.5 Mb
Наверх