Подтвердить что ты не робот

Форматировать код 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";
...
?>
4b9b3361

Ответ 1

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

Это довольно? нет, совсем нет, это сработает... Yeep.

Я попробую создать файл фильтра и, возможно, небольшую программу 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";

Ответ 2

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

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

Ответ 3

Ответ НЕТ.

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

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

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

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

enter image description here

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

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

Перетащите любое количество php файлов на script или вызовите его из командной строки, и он будет фильтровать биты SQL через SQLFormat API, который предложил @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)

Ответ 7

В 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

Ответ 8

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

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

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

Изменить: обязательно зарегистрируйте все изменения в таблице сравнения, чтобы просмотреть все, что было отформатировано с помощью script.

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

Все строки сканируются для возможной грамматики 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;

Ответ 14

Вы спросили:

Есть ли какая-либо программа 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 или в командной строке, которая работает 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" """ ";"

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

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

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

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

Ответ 15

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

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

Ответ 16

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