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

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

Это делает это для 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";
...
?>
 afuzzyllama12 июн. 2012 г., 23:40
Я считаю, что это вопрос.
 Paul Dessert12 июн. 2012 г., 23:39
Вы хотите сказать, что вы хотите, чтобы программное обеспечение делало отступ в коде, как во втором примере?
 Sumit Singh20 июн. 2012 г., 12:55
потому что в php ваш sql-запрос имеет строковый формат, поэтому ни один ID не будет думать, что это sql-запрос или обычный запрос, поэтому это невозможно, потому что есть строка для этой IDE
 glglgl23 июн. 2012 г., 00:49
Кстати: вы должны срочно предотвратить внедрение SQL с помощью подготовленных операторов или с помощьюmysql_real_string_escape().
 JohnA12 июн. 2012 г., 23:41
Да, я хочу, чтобы программное обеспечение автоматически переформатировало код.

Ответы на вопрос(16)

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;

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

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

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

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

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

 21 июн. 2012 г., 22:37
Я разместил эту ссылку только потому, что вы сказали в своем ответе "Нет такой IDE". Я бы тоже хотел написать сценарий за эту цену. ;)
 21 июн. 2012 г., 21:57
Я сомневаюсь, что это украсит некоторые зашифрованные SQL. И это дорого. Для 100 & # x20AC; Я напишу этот сценарий, чтобы исправить весь проект.
 21 июн. 2012 г., 21:44
phpStorm не существует?

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

Короче:IDEs cant correct design errors. They just make them look nice and colored.

ад изменить инструмент для этой цели за небольшую плату. http://www.softfrontiers.com/Downloads/ReIndenter.shtml

Час или два моего времени спасут вас от многих часов разочарования.

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

Log, profile your SQL statements. Use an external service such as this one - SQLFormat API - in order to format your SQL statements You can also run it on your machine dowloading the Python sources.

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

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

Единственный вариант, который будет работать для любой IDE, - это обнаружить INSERT, UPDATE, DELETE в начале строки, а затем отформатировать оставшуюся часть строки. Конечно, он также попытается сделать то же самое со строкой, в которой говорится & quot; insert цитируйте здесь .. & quot ;, что опять-таки было бы плохо.

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

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

The answer is NO.

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

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

Если вам нужна дополнительная автоматизация, вы можете использовать поддержку регулярных выражений сетевых компонентов для форматирования с обратной косой чертой n = \ n для новой строки перед каждым & quot; вставить, обновить, удалить, выбрать, где и значения & quot; термины выполнение этого 6 раз заменит все & quot; вставить & Quot; & lt; - пробел плюс вставка, в ваших проектах с новыми строками. Вы можете написать регулярное выражение для поиска всех, «пустых плюс зарезервированных слов», комбинаций и заменить их новыми строками.

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

enter image description here

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

Correctly parse PHP strings, including strings with all sorts of embedded or escaped quotes. This should be bullet-proof, and should only care about PHP syntax. Check each PHP string with an algorithm that detects SQL commands. This can be made as smart as you need it to be (no need to blindly accept every string containing the word "insert", for example). Feed the identified strings through an SQL pretty-printer. Edit the input file, substituting the formatted string for the original one.

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

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

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

"""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)

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

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

EDIT

Попробуй это

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 или что-то еще, когда у меня будет время, чтобы запустить этот горячий беспорядок.

EDIT

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

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";
 26 июн. 2012 г., 05:45
это один шаг, близкий к тому, чтобы попросить OP написать свой собственный плагин Netbeans.
 26 июн. 2012 г., 18:48
Я согласен с Михаем, что это в значительной степени автономный инструмент, который может анализировать все, на что он указывает. * Системы nix в значительной степени имеют собственные IDE.
 26 июн. 2012 г., 11:34
Нет, если бы мы приняли метафору о том, что операционные системы UNIX / Linux - это одна огромная среда разработки, этоactually be плагин (только не плагин Netbeans).

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

$request1 = <<<SQL
   SELECT * 
           FROM tbl_admin 
              WHERE admin_id = {$_SESSION['admin_id']}
              AND active = 1
                  ORDER BY admin_id ASC
SQL;
 26 июн. 2012 г., 06:27
@ MihaiStancu: я не думаю, что это полностью верно. Например, механизм может оценить каждый строковый оператор, а затем попытаться проанализировать SQL; если строка содержит SQL, она может вернуться к базовым литералам и соответствующим образом отформатировать. Тем не менее, я очень сомневаюсь, что есть что-нибудь подобное?
 24 июн. 2012 г., 02:45
Если ваши запросы не соответствуютall придерживайтесь определенного синтаксиса, было бы невозможно узнать, является ли строка SQL или нет. Представьте себе случай, когда строка SQL разбивается на несколько строк с конкатенацией'SELECT'.' * '.'FROM', Везде, где нет строгих стандартов, гарантирующих, что параметры будут вставлены так же, как вы никуда не денетесь. Я знаю, что Хередок уродлив, но он выполняет свою работу.
 26 июн. 2012 г., 08:28
@eggyal На самом деле PhpStorm делает (что-то вроде) это. С одной стороны, он анализирует строки и сравнивает их с известными языками. Это (конечно) не очень хорошо работает для сконструированных строк, но хорошо работает, например, с заменой ("SELECT * FROM $table WHERE id = :id;"). С другой стороны, когда вы используете синтаксис heredoc, вы можете дать ему подсказку с идентификатором heredoc (см.<<<SQL выше). Это хорошо работает для непрерывных струн.
 26 июн. 2012 г., 11:12
@eggyal PhpStorm позволяет вам делать это при условии, что вы используете heredoc и фиксированный разделитель<<<SQL (как упоминалось @KingCrunch)but моя точка зрения заключалась в том, что ни один редактор не может сделать это независимо от синтаксиса. Если вы захватите последний запрос, который вы отправили в базу данных (во время выполнения), и отформатируете его, то ищите оригинальный генератор строк и найдите что-то вродеSELECT <? foreach($fields AS $field): echo $field; ?> у вас будет захватывающее время на его форматирование.
 JohnA12 июн. 2012 г., 23:44
Это означало бы, что я все еще должен изменить сотни запросов ... это очень большой проект, который я получил от другого разработчика, и я не могу вручную изменить каждый запрос. Постскриптум Я не хочу использовать синтаксис heredoc.

что это будет выполнять то, что вы ожидаете.

здесь ссылкаNuSphere

format-> gau;

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

Is there any program IDE or not that can format MySQL code inside PHP string

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

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

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

С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" """ ";"

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

$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, см.Разбор SQL-запроса PHP), но вам также нужно, чтобы этот синтаксический анализатор SQL знал о подстановке переменных PHP, например{$_SESSION['admin_id']} в твоем случае. Для вас это переменная, для парсера SQL это просто причудливый синтаксический суп, если не ошибка.

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

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

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

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

Ваш ответ на вопрос