Форматировать код MySQL внутри строки PHP

Есть ли какая-либо программа IDE или нет, которая может форматировать MySQL-код внутри строки PHP, например, я использую среду PHPStorm, и она не может этого сделать.

Он делает это для PHP и MYSQL, но не для MYSQL внутри php-строки. Я готов использовать новую IDE, потому что теперь мне приходится вручную форматировать сотни запросов к базе данных, которые являются одной строкой и не читаются. Только критерии для моего выбора – это то, что ide может делать это автоматически.

<?php ... $request1 = "select * from tbl_admin where admin_id= {$_SESSION['admin_id']} and active= 1 order By admin_id Asc"; ... ?> 

должен стать

 <?php ... $request1 = "SELECT * FROM tbl_admin WHERE admin_id = {$_SESSION['admin_id']} AND active = 1 ORDER BY admin_id ASC"; ... ?> 

Лучший способ сделать это, на мой взгляд, – использовать регулярные выражения или SED / AWK для форматирования всего, это дает нам бонус замены карт на лету. Вероятность того, что у вас могут быть ошибки кода, хотя и высока, так что это довольно сложно.

позвольте мне немного поработать над этим, и я вижу, могу ли я придумать хорошее решение. Гарантировано ли, что вы инкапсулируете весь SQL в двойные кавычки?

РЕДАКТИРОВАТЬ

Попробуй это

 cd {{directory}} && find . -type f -print0 | xargs -0 perl -i.bak -pe 's/select/SELECT/g ; s/from/\n\tFROM/g ; s/where/\n\t\tWHERE/g ; s/and/\n\t\tAND/g ; s/order by/\n\t\tORDER BY/g ; s/asc/ASC/g ; s/desc/DESC/g ;' 

Вот пример

 $ printf '"select * from whatever where this = that and active = 1 order by something asc";\n' | > perl -pe 's/select/SELECT/g ; s/from/\n\tFROM/g ; s/where/\n\t\tWHERE/g ; s/and/\n\t\tAND/g ; s/order by/\n\t\tORDER BY/g ; s/asc/ASC/g ; s/desc/DESC/g ;' "SELECT * FROM whatever WHERE this = that AND active = 1 ORDER BY something ASC"; 

Это мило? нет, совсем нет, это работает ….

Я попробую создать файл фильтра и, возможно, небольшую программу bash или что-то еще, поскольку я получаю время, чтобы запустить этот горячий беспорядок.

РЕДАКТИРОВАТЬ

Вот несколько пересмотренный код, выглядит красивее (sorta)

 printf '$request1 = "select * from whatever where this = that and active = 1 order by something asc";\n' | perl -pe 's/select/SELECT/gi ; s/from/\n FROM/gi ; s/where/\n WHERE/gi ; s/and/\n AND/gi ; s/order by/\n ORDER BY/gi ; s/asc/ASC/gi ; s/desc/DESC/gi ;' | awk 'NR == 1 {pad = length($0)/2; print} NR > 1 {gsub(/\r/,""); printf "%*s%s\n", pad, " ", $0}' __OUTPUTS__ $request1 = "SELECT * FROM whatever WHERE this = that AND active = 1 ORDER BY something ASC"; 

Как я знаю, PhpStorm может это сделать, если вы используете синтаксис heredoc

 $request1 = <<<SQL SELECT * FROM tbl_admin WHERE admin_id = {$_SESSION['admin_id']} AND active = 1 ORDER BY admin_id ASC SQL; 

Ответ – нет.

В качестве альтернативного решения я могу предложить скопировать текст (ВСЕ КОД PHP в файл * .php) в редактор запросов Heidisql , щелкнуть « Переформатировать» и скопировать обратно в NetBeans и нажать Alt + Shift + F. Это будет форматировать sql и форматировать php-код после, сохраняя форматирование sql. SO вместо подключаемого модуля, вы копируете, форматируете весь файл, снова копируете и форматируете.

Вместо HeidiSQL вы можете использовать этот инструмент, который ориентирован на форматирование, если вам удобнее использовать такие веб-инструменты.

Если вы хотите больше автоматизации, вы можете использовать поддержку регулярных выражений для netbeans для форматирования с обратным слэшем n = \ n для новой строки befre для каждого слова «вставка, обновление, выбор, где и значения», выполняющая это 6 раз, заменит все «вставки», <- blank plus insert, в ваших проектах с новыми строками. вы можете написать регулярное выражение для поиска всех, «пустые плюс зарезервированное слово», комбинации и заменить их новыми строками.

Вы также можете использовать его, например, искать «вставить» и перепаковать с помощью «\ n \ t insert», что создало бы новую строку и вкладку

введите описание изображения здесь

Учитывая вопрос: существует ли IDE, которая будет автоматически форматировать SQL-запросы, я должен согласиться с ugurcode. Ответ прост: его нет. И не без оснований.

В основном SQL-запрос – это не что иное, как строка в любой среде IDE. Поскольку строки могут содержать преднамеренные пробелы и вкладки, было бы очень плохо, если бы среда IDE переформатировала содержимое строки.

Единственный вариант, который будет работать для любой IDE, – это обнаружить INSERT, UPDATE, DELETE в начале строки, а затем отформатировать остальную часть строки. Конечно, она также попытается сделать то же самое со строкой, в которой говорится: «Вставить цитату здесь .. », что еще раз было бы плохо.

Поскольку я не хочу оставлять вас ни с чем, я дам вам совет по хорошей IDE, чтобы выбрать, что на самом деле делает правильное форматирование кода, завершение кода, хорошее отступы, плагины и т. Д. И в основном это лучшая IDE для php (по крайней мере, это лучшее, что я нашел в годы профессионального развития php).

Netbeans будет вашей IDE выбора. Это быстрее, то есть Eclipse / PHP, более стабильный, то есть codelobster и т. Д.

  1. Запишите, прокомментируйте свои операторы SQL.
  2. Используйте внешнюю службу, такую ​​как этот, – API SQLFormat – для форматирования ваших операторов SQL
  3. Вы также можете запустить его на своем компьютере, загружая источники Python.

Поскольку ваша проблема заключается в форматировании существующего кода, вам не нужна среда IDE. Вам нужен сценарий для пакетного обработки всех ваших файлов один раз, а затем вы можете забыть об этом. Это то, что должен сделать сценарий:

  1. Правильно проанализируйте строки PHP , включая строки со всеми типами встроенных или экранированных кавычек. Это должно быть пуленепробиваемым и должно заботиться только о синтаксисе PHP.
  2. Проверьте каждую строку PHP алгоритмом, который обнаруживает команды SQL. Это можно сделать настолько умным, насколько вам это нужно (нет необходимости слепо принимать каждую строку, содержащую слово «insert», например).
  3. Загрузите идентифицированные строки через SQL-принтер.
  4. Отредактируйте входной файл, заменив форматированную строку на исходную.

В идеале, части 1 и 3 должны обрабатываться готовыми модулями. Остальное должно быть легко собрать вместе, не так ли?

Обновление: Объясняя это, это звучало так просто, я решил сделать это сам. Вот быстрое решение. Это в python, но если вы захотите переключить IDE, вы можете иметь дело с установкой python, не так ли?

Перетащите любое количество php-файлов в скрипт или вызовите его из командной строки, и он будет фильтровать биты SQL через API SQLFormat, который предложил @Parahat. Он редактирует файлы на месте , поэтому храните копию!

 """Format sql strings embedded in php code, editing source IN PLACE""" import sys, re, urllib, urllib2 def processfile(fname): with open(fname) as fp: text = fp.read() with open(fname, "w") as out: for token in chunk(text): if is_sql_string(token): token = token[0] + sqlformat(token[1:-1]) + token[0] out.write(token) def sqlformat(query): sqlapi = 'http://sqlformat.appspot.com/format/?keyword_case=upper&reindent=1&n_indents=4&' return urllib2.urlopen(sqlapi+urllib.urlencode({'data':query})).read() php_mode = False # global, so that is_sql_string() can examine it def chunk(src): """Chunk the php file into interesting units""" global php_mode while src: if not php_mode: # Read up to the next php group, if any m = re.match(r".*?<\?php", src, re.S) if m: tok, src = _usematch(m, src) yield tok php_mode = True else: # No more php groups: EOF yield src return else: # Reading php code # PHP ends without another string? m = re.match(r"[^'\"]*?\?>", src, re.S) if m: tok, src = _usematch(m, src) yield tok php_mode = False continue # at non-string material? m = re.match(r"[^'\"]+", src) if m: tok, src = _usematch(m, src) yield tok continue # Parse a string: Smallest quote-delimited sequence, # where closing quote is not preceded by backslash m = re.match(r'".*?(?<!\\)"|' + r"'.*?(?<!\\)'", src, re.S) if m: tok, src = _usematch(m, src) yield tok continue # Something I can't parse: advance one char and hope for the best tok, src = src[0], src[1:] yield tok def _usematch(m, inp): return m.group(), inp[m.end():] # Matched chunk & remaining input # To recognize an sql command, it MUST begin with one of these words sql_commands = set("select insert update delete create drop alter declare".split()) def is_sql_string(tok): if not php_mode or len(tok) < 3 or tok[0] not in set("\"'"): return False tokwords = tok[1:-1].split() return tokwords and tokwords[0].lower() in sql_commands for fname in sys.argv[1:]: processfile(fname) 

В PHPStorm вы можете указать диалект SQL для вашего проекта: http://www.jetbrains.com/phpstorm/webhelp/sql-dialects.html

Затем вы должны установить источник данных: http://www.jetbrains.com/phpstorm/webhelp/data-sources-2.html.

После этого ваша среда IDE будет поддерживать синтаксис SQL и автозаполнение для таблиц (полей).


Кроме того, есть страница, где вы можете указать код SQL-кода: http://www.jetbrains.com/phpstorm/webhelp/code-style-sql.html

Такой IDE нет. Возможно, какой-то SQL разбит на несколько конкатенаций строк, или, может быть, некоторый SQL генерируется с использованием некоторого итератора. Или, возможно, он содержит недопустимый SQL, такой как {$_SESSION['admin_id']} .

Ваш единственный шанс написать небольшой скрипт, настроенный на соответствие стилю кодирования и возможному недопустимому SQL-материалу, который восстановит все файлы исходного кода приложения. Для вас это займет несколько часов, но в конце вам не понадобится IDE, которой не существует, и у вас будет довольно обширный SQL-код и лучший исходный код.

(Вышеупомянутое решение, считая, что у вас сотни предложений SQL во всем приложении, а если нет, просто отредактируйте их вручную).

Изменить: убедитесь, что вы внесете в журнал все изменения в таблице сравнения, чтобы вы могли просмотреть все, что было отформатировано вашим скриптом.

может быть nuSphere отладчик как-то поможет вам сделать это вот ссылка nuSphere

Напишите свои запросы в MySQL Workebench, затем измените-> format-> beautify query

Затем вставьте запрос в netbeans, выберите тест и вкладку.

Я всегда использовал SQLyog для форматирования моих операторов SQL и вставки их обратно в среду IDE, потому что я тоже не нашел IDE, которая способна форматировать sql внутри php-блоков.

Я создал инструмент для этого для MS SQL Server и кода C #. Я был бы рад изменить инструмент для этой цели за небольшую плату. http://www.softfrontiers.com/Downloads/ReIndenter.shtml

Час или два моего времени сэкономит вам много часов разочарования.

Вы можете использовать расширение tokenizer для написания скрипта, который будет форматировать SQL.

Следующий сценарий можно вызвать из командной строки, он считывает со стандартного ввода и записывает на стандартный вывод. Он обрабатывает оба стиля цитирования (двойные или одинарные кавычки).

Все строки проверяются на возможную грамматику SQL, основываясь на стартовом слове, и разрывы строк вставляются перед каждым ключевым словом; как начальное слово, так и ключевые слова являются расширяемыми, так что дичь 🙂

 <?php $tokens = token_get_all(file_get_contents('php://stdin')); function token_value($token) { return is_array($token) ? $token[1] : $token; } function sql_format($s) { if (preg_match("/^(?:select|insert|update|delete)/i", $s)) { // prefix newline and tab before every keyword return preg_replace('/\b(from|where|and|order|group by)/i', "\n\t\\0", $s); } return $s; } $target = ''; $i = 0; $n = count($tokens); while ($i < $n) { $token = $tokens[$i]; if ($token === '"') { $s = ''; ++$i; while ($i < $n && $tokens[$i] !== '"') { $s .= token_value($tokens[$i]); ++$i; } if ($i < $n) { ++$i; } $target .= '"' . sql_format($s) . '"'; } elseif (is_array($token) && $token[0] === T_CONSTANT_ENCAPSED_STRING) { $quote_style = $token[1][0]; $target .= $quote_style . sql_format(trim($token[1], "'\"")) . $quote_style; ++$i; } else { $target .= token_value($token); ++$i; } } echo $target; 

Ты спрашивал:

Есть ли какая-либо программа IDE или нет, которая может форматировать код MySQL внутри строки PHP

с конкретным определением строки PHP:

 $request1 = "select * from tbl_admin where admin_id= {$_SESSION['admin_id']} and active= 1 order By admin_id Asc"; 

И ответ нет. Не существует хорошо подходящего решения для парсера PHP в IDE или в командной строке, которая работает с token_get_all PHP.

С token_get_all вы сможете в первую очередь извлечь эту часть, которая имеет смысл в вашем случае для редактирования. Здесь с контекстом:

<309:T_VARIABLE> "$request1" <371:T_WHITESPACE> " " "=" <371:T_WHITESPACE> " " """ <314:T_ENCAPSED_AND_WHITESPACE> "select * from tbl_admin where admin_id= " <375:T_CURLY_OPEN> "{" <309:T_VARIABLE> "$_SESSION" "[" <315:T_CONSTANT_ENCAPSED_STRING> "'admin_id'" "]" "}" <314:T_ENCAPSED_AND_WHITESPACE> " and active= 1 order By admin_id Asc" """ ";"

Как показывают эти токены, есть много дополнительной работы, которая поможет извлечь из этого то, что вы называете строкой:

$request1 = "select * from tbl_admin where admin_id= {$_SESSION['admin_id']} and active= 1 order By admin_id Asc"

Это необходимо контролировать и идентифицировать в токенах:

<314:T_ENCAPSED_AND_WHITESPACE> "select * from tbl_admin where admin_id= " <375:T_CURLY_OPEN> "{" <309:T_VARIABLE> "$_SESSION" "[" <315:T_CONSTANT_ENCAPSED_STRING> "'admin_id'" "]" "}" <314:T_ENCAPSED_AND_WHITESPACE> " and active= 1 order By admin_id Asc"

Как показано в этом примере, это не верно SQL. Таким образом, вам не только нужно найти парсер SQL (который существует в PHP, см. Parsing sql query PHP ), но вам также нужно сделать этот анализатор SQL осведомленным о подстановке PHP-переменных, например {$_SESSION['admin_id']} в вашем случае , Для вас это переменная, для парсера SQL это просто причудливый синтаксический суп, если не ошибка.

Ваш небольшой пример кода хорош: он уже показывает, что нет никакой информации о характере строки, которая будет заменена. Поскольку эта информация скрыта, синтаксический анализатор SQL никогда не сможет справиться с этой строкой как что-то хорошо сформированное.

Поэтому, чтобы сделать мой ответ «Нет» более глубоким: поскольку нет общих инструментов о том, как справляться с несколькими результатами на уровне более высоких языков (строка PHP содержит несколько, вероятно, правильных представлений в SQL, только автор содержимого переменной может определить, какие один правильный), который уже существует, общего решения нет.

Возможно, вам захочется просто запустить некоторые регулярные выражения на вашей кодовой базе и свести итог вместе с результатами, с которыми вы можете быть счастливы, и, действительно, стоит рассмотреть один из вариантов ehime .

Но, вероятно, стоит потратить время и сначала извлечь строки из потока токенов PHP, переформатировать строку и затем продолжить вывод результата. Это то, что perl и regexes не могут дать вам, потому что они не имеют токенизатора PHP.

Если во многих IDE нет поддержки для такой вещи, в большинстве случаев есть причина. Пожалуйста, рассмотрите подготовленные заявления или обертки объектов для вашей работы. Я знаю, что обе вещи не могут быть реализованы в каждой системе в течение нескольких минут, но ваш код станет ремонтопригодным.

Короче: IDE не могут исправить ошибки проектирования. Они просто заставляют их выглядеть красивыми и цветными.

Я использовал PHPDesigner. Я думаю, что это выполнит то, что вы ожидаете.