24

PHP文字列内のMySQLコードをフォーマットできるプログラムIDEはありますか?たとえば、私はPHPStorm IDEを使用していますが、それはできません。

PHP と MYSQL ではそれを行いますが、php 文字列内の MYSQL では行いません。新しい IDE を使用する準備ができました。1 行で読み取り不能な数百のデータベース要求を手動でフォーマットする必要があるからです。私が選択した唯一の基準は、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";
...
?>
4

17 に答える 17

17

私の意見では、これを行うための最良の方法は、正規表現または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";
于 2012-06-20T16:33:51.080 に答える
13

私が知る限り、ヒアドキュメント構文を使用すると、PhpStorm で実行できます。

$request1 = <<<SQL
   SELECT * 
           FROM tbl_admin 
              WHERE admin_id = {$_SESSION['admin_id']}
              AND active = 1
                  ORDER BY admin_id ASC
SQL;
于 2012-06-12T21:42:50.343 に答える
5

答えはいいえだ。

別の解決策として、テキスト(*.phpファイルのすべてのPHPコード)をHeidisqlのクエリエディタにコピーし、[再フォーマット]をクリックしてNetBeansにコピーし直し、Alt + Shift+Fを押すことをお勧めします。これにより、SQLがフォーマットされ、その後phpコードがフォーマットされ、SQLフォーマットが保持されます。つまり、プラグインの代わりに、ファイル全体をコピーしてフォーマットし、コピーして元に戻し、再度フォーマットすることになります。

HeidiSQLの代わりに、このようなWebツールに慣れている場合は、フォーマットに重点を置いたこのツールを使用できます。

さらに自動化する必要がある場合は、netbeansの正規表現サポートを使用して、この6回実行される各「挿入、更新、削除、選択、場所、および値」の用語がすべての「挿入」に置き換わる前に、バックスラッシュn =\nでフォーマットできます。 <-空白と挿入、新しい行のあるプロジェクト。すべての「空白と予約語」の組み合わせを検索するための正規表現を記述し、それらを新しい行に置き換えることができます。

「挿入」を検索して「\n\ t挿入」で置き換えるように使用することもできます。これにより、タブに新しい行が作成されます。

ここに画像の説明を入力してください

于 2012-06-20T10:28:47.873 に答える
4
  1. ログに記録し、SQL ステートメントをプロファイリングします。
  2. SQL ステートメントをフォーマットするには、このような外部サービス ( SQLFormat API ) を使用します。
  3. Python ソースをダウンロードして、マシン上で実行することもできます。
于 2012-06-21T21:12:15.990 に答える
4

質問を考慮すると、SQL クエリを自動的にフォーマットする IDE はありますか? ugurcode に同意する必要があります。答えは簡単です。そして正当な理由があります。

基本的に、SQL クエリは、どの IDE においても文字列にすぎません。文字列には意図的な空白やタブが含まれている可能性があるため、IDE が文字列の内容を再フォーマットするのは非常に悪いことです。

どのIDEでも機能する唯一のオプションは、文字列の先頭でINSERT、UPDATE、DELETEを検出し、残りの文字列をフォーマットすることです..もちろん、「引用符を挿入」という文字列でも同じことを試みますここ..」、これもまた悪いことです。

私はあなたに何も残したくないので、適切なコードフォーマット、コード補完、適切なインデント、プラグインなどを実際に実行する優れたIDEを選択するためのアドバイスを提供します..そして基本的にphpに最適なIDEです.開発 (少なくとも、長年のプロの php 開発で見つけた最高のものです)。

Netbeans は、IDE として最適です。Eclipse/PHP よりも高速で、codelobster よりも安定しています。

于 2012-06-22T10:06:21.963 に答える
4

問題は既存のコード本体をフォーマットすることなので、IDE は必要ありません。すべてのファイルを一度にバッチ処理するためのスクリプトが必要です。その後は忘れて構いません。これは、スクリプトが行う必要があることです。

  1. あらゆる種類の埋め込みまたはエスケープされた引用符を含む文字列を含むPHP文字列を正しく解析します。これは防弾であるべきで、PHP 構文のみを考慮すべきです。
  2. SQL コマンドを検出するアルゴリズムを使用して、各 PHP 文字列をチェックします。これは、必要なだけ賢くすることができます (たとえば、「挿入」という単語を含むすべての文字列をやみくもに受け入れる必要はありません)。
  3. 識別された文字列を SQL プリティ プリンターを介してフィードします。
  4. 入力ファイルを編集して、元の文字列を書式設定された文字列に置き換えます。

理想的には、パート 1 と 3 は既製のモジュールで処理する必要があります。残りは自分で簡単に組み立てられるはずですよね?

更新:これを説明するととても簡単に思えたので、自分でやることにしました。これが簡単な解決策です。これは Python ですが、もし IDE を切り替えるつもりなら、Python のインストールに対処できますよね?

任意の数のphpファイルをスクリプトにドラッグアンドドロップするか、コマンドラインから呼び出すと、@Parahatが提案したSQLFormat APIを介してSQLビットがフィルタリングされます. ファイルをその場で編集するので、コピーを保管してください。

"""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)
于 2012-06-22T23:01:22.787 に答える
4

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

于 2012-06-26T20:38:24.437 に答える
2

MySQL Workbench でクエリを作成し、編集 -> フォーマット -> クエリを美しくする

次に、クエリを netbeans に貼り付け、テストとタブを選択します。

于 2012-06-21T16:32:21.480 に答える
2

そのような IDE はありません。一部の SQL が複数の文字列連結に分割されているか、一部の SQL がイテレータを使用して生成されている可能性があります。または、 などの無効な SQL が含まれている可能性があります{$_SESSION['admin_id']}

唯一のチャンスは、コーディング スタイルと無効な SQL 要素に一致するように調整された小さなスクリプトを作成することです。これにより、すべてのアプリケーション ソース コード ファイルが修復されます。それを正しく理解するには何時間もかかりますが、最終的には存在しない IDE は必要なくなり、きれいな悪魔化された SQL とより優れたソース コードが得られます。

(上記は、アプリ全体に何百もの SQL ステートメントがあると考えた場合の解決策です。そうでない場合は、手動で修正してください)。

編集: すべての変更を比較表に記録して、スクリプトによってフォーマットされたすべてを確認できるようにしてください。

于 2012-06-19T23:28:44.803 に答える
2

nuSphere デバッガーである可能性があります。何らかの方法でこれを行うのに役立ちます。リンクはnuSphere です。

于 2012-06-20T10:51:16.143 に答える
2

PHPブロック内でSQLをフォーマットできるIDEも見つからなかったため、常にSQLyogを使用してSQLステートメントをフォーマットし、それらをIDEに貼り付けました。

于 2012-06-25T09:05:37.657 に答える
1

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;
于 2012-06-25T08:10:27.463 に答える
1

MS SQL Server と C# コードでこれを行うためのツールを作成しました。この目的のために、わずかな料金でツールを変更できれば幸いです。 http://www.softfrontiers.com/Downloads/ReIndenter.shtml

私の時間の 1 時間か 2 時間で、何時間ものフラストレーションが解消されます。

于 2012-06-24T08:26:40.517 に答える
1

あなたは尋ねました:

PHP文字列内のMySQLコードをフォーマットできるプログラムIDEはありますか?

具体的には、次の PHP 文字列定義を使用します。

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

答えはノーです。IDE の PHP パーサーまたは 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 に存在します。Parsing sql query PHPを参照してください) を見つける必要があるだけでなく、その SQL パーサーに、あなたの場合のように PHP 変数置換を認識させる必要もあり{$_SESSION['admin_id']}ます。あなたにとっては変数であり、SQLパーサーにとっては、エラーではないにしても、これは奇妙な構文スープです。

あなたの小さなコード例は良い例です。置換される文字列の性質に関する情報がないことをすでに示しています。この情報は隠されているため、SQL パーサーはこの文字列を整形式のものとして処理することはできません。

したがって、私の答えを「いいえ」より深遠なものにするために、より高い言語レベルで複数の結果を処理する方法に関する一般的なツールがないため (PHP 文字列には、SQL でおそらく正しい表現が複数あるため、変数コンテンツの作成者だけがどれを知ることができますか? 1 つが正しい) が既に存在するため、利用できる一般的な解決策はありません。

コードベースでいくつかの正規表現を起動し、満足できる結果を一緒にぶつけたいと思うかもしれません。実際、ehimeのラインナップは検討する価値があります。

しかし、時間をかけて最初に PHP トークン ストリームから文字列を抽出し、文字列を再フォーマットしてから、結果の出力を続行することはおそらく価値があります。これは、PHP トークナイザーがないため、perl と正規表現では提供できないものです。

于 2012-06-26T10:47:47.890 に答える
0

私はPHPDesignerを使用しました。これはあなたが期待するものを満たすと思います。

于 2012-10-09T09:36:13.220 に答える
0

多くの IDE のすべてでそのようなことがサポートされていない場合、ほとんどの場合、理由があります。あなたの仕事のために準備されたステートメントまたはオブジェクトラッパーを検討してください。すべてのシステムに数分で両方を実装できないことはわかっていますが、コードは保守可能になります。

つまり、IDE は設計エラーを修正できません。見栄えを良くして色を付けるだけです。

于 2012-06-26T21:16:33.563 に答える
0

パーティーに遅れましたが...

function formatSQL($txt){
    $txt = str_replace('SELECT ', "\nSELECT", $txt);
    $txt = str_replace(' MATCH', "\nMATCH", $txt);
    $txt = str_replace(' AGAINST', "\nAGAINST", $txt);
    $txt = str_replace(' OR ', "\nOR", $txt);
    $txt = str_replace(' AND ', "\n\tAND ", $txt);
    $txt = str_replace(' FROM ', "\nFROM", $txt);
    $txt = str_replace(' WHERE ', "\nWHERE", $txt);
    $txt = str_replace(' ORDER ', "\nORDER", $txt);
    return $txt;
}
于 2021-11-01T09:12:12.587 に答える