是否有任何程序IDE可以在PHP字符串中格式化MySQL代码,例如 我使用PHPStorm IDE,它无法做到。
它适用于PHP和MYSQL,但不适用于php字符串中的MYSQL。我准备使用新的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";
...
?>
答案 0 :(得分: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";
漂亮吗?不,完全没有,它是否有效.... Yeup。
我会尝试创建一个过滤器文件,也许还有一些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";
答案 1 :(得分:11)
我知道PhpStorm可以做到这一点,如果你使用heredoc语法
$request1 = <<<SQL
SELECT *
FROM tbl_admin
WHERE admin_id = {$_SESSION['admin_id']}
AND active = 1
ORDER BY admin_id ASC
SQL;
答案 2 :(得分:5)
作为替代解决方案,我建议将文本(* .php文件中的所有PHP代码)复制到Heidisql的查询编辑器中,单击重新格式化并复制回NetBeans并按Alt +按住Shift + F。这将格式化sql并格式化php代码,保留sql格式。所以不是插件,而是复制,格式化整个文件,复制并重新格式化。
如果您对使用此类网络工具感到满意,可以使用this tool, which is focused on formatting代替HeidiSQL。
如果你想要更多的自动化,你可以使用netbeans的正则表达式支持格式化反斜杠n = \ n为新行设置每个“insert,update delete,select,where和values”术语 运行这6次将在您的项目中用新行替换所有“insert”&lt; - blank plus insert。你可以编写一个正则表达式来搜索所有,“空白加保留字”,组合并用新行替换它们。
您也可以像搜索“插入”一样使用它,并使用“\ n \ t insert”重新编译,这会创建一个新行和一个标签
答案 3 :(得分:4)
答案 4 :(得分:4)
考虑到这个问题:是否有一个IDE会自动格式化sql查询,我必须同意ugurcode。答案很简单:没有。并且有充分的理由。
基本上,SQL查询只不过是任何IDE中的字符串。由于字符串可以包含有意的空格和制表符,如果IDE重新格式化字符串内容,那将非常糟糕。
唯一适用于任何IDE的选项是在字符串的开头检测INSERT,UPDATE,DELETE,然后格式化字符串的其余部分。当然,它也会尝试使用字符串说法“在这里插入引用......”,这再次是一件坏事。
由于我不想给你留下什么,我会给你一个好的IDE的建议,选择哪个确实做了正确的代码格式化,代码完成,良好的缩进,插件等..并且基本上是最好的用于php开发的IDE(至少是我在我多年的专业php开发中发现的最好的)。
Netbeans将是您的首选IDE。它比Eclipse / PHP更快,然后更稳定,即代码浏览器等。
答案 5 :(得分:4)
由于您的问题是格式化现有代码体,因此您不需要IDE。您需要一个脚本来批量处理所有文件一次,然后您就可以忘记它了。这是脚本需要做的事情:
理想情况下,第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)
答案 6 :(得分:3)
在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
答案 7 :(得分:2)
没有这样的IDE。
也许某些SQL被分解为多个字符串连接,或者可能使用某些迭代器生成一些SQL。或者它可能包含无效的SQL,例如{$_SESSION['admin_id']}
。
你唯一的机会是编写一个小脚本,调整以匹配编码风格和可能的无效SQL内容,这将修复所有应用程序源代码文件。它需要几个小时才能正确完成,但最终你不需要一个不存在的IDE,你将拥有一个漂亮的stonified SQL和更好的源代码。
(以上是一个解决方案,认为你在整个应用程序中有数百个SQL语句;如果没有,只需手动修复它们。)
编辑:确保在比较表中记录所有更改,以便您可以查看脚本格式化的所有更改。
答案 8 :(得分:2)
可能是nuSphere调试器以某种方式帮助您在此处执行链接nuSphere
答案 9 :(得分:2)
在MySQL Workbench中编写查询,然后编辑 - >格式 - &gt;美化查询
然后将查询粘贴到netbeans中,选择测试和选项卡。
答案 10 :(得分:2)
我总是使用SQLyog来格式化我的SQL语句并将它们粘贴回IDE,因为我也找不到IDE,它能够在php块中格式化sql。
答案 11 :(得分:1)
我为MS SQL Server和C#代码构建了一个工具。我很乐意为此目的改变工具,只需支付少量费用。 http://www.softfrontiers.com/Downloads/ReIndenter.shtml
我一两个小时的时间会为你节省很多时间。
答案 12 :(得分: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;
答案 13 :(得分:1)
你问:
是否有任何程序IDE可以在PHP字符串中格式化MySQL代码
特别是这个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
的命令行上不存在可用的settop。
使用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中有多个可能正确的表示,只有变量内容的作者将可以判断哪一个是正确的)已经存在,没有通用的解决方案。
您可能希望在您的代码库和blitzshit上启动一些正常的表达式,这些结果可以让您感到满意,而且ehime排列的工具确实值得考虑。
但是可能值得投入时间并首先从PHP令牌流中提取字符串,重新格式化字符串然后继续输出结果。这是perl和正则表达式无法给你的东西,因为它们没有PHP标记器。
答案 14 :(得分:0)
如果所有这些IDE中都没有支持,那么在大多数情况下都是有原因的。请考虑为您的工作准备好的语句或对象包装器。我知道这些事情在几分钟内无法在每个系统中实现,但您的代码将变得可维护。
简而言之: IDE无法纠正设计错误。它们只是让它们看起来很漂亮和有色。
答案 15 :(得分:0)
我使用过PHPDesigner。我认为这将满足你的期望。