避免在 SQL 查询生成中使用字符串插值时出现语法错误警告

Avoid syntax error warnings when using string interpolation in SQL query generation

提问人:deceze 提问时间:8/27/2014 更新时间:10/10/2015 访问量:3160

问:

当使用字符串插值或通常任何形式的动态创建 SQL 查询字符串时,PhpStorm 通常会跳闸。例如:sprintf

$placeholders = join(', ', array_fill(0, count($ids), '?'));
$stmt = $db->prepare("SELECT * FROM foo WHERE bar IN ($placeholders)");
$stmt->execute($ids);

艺术

$db->prepare(sprintf('INSERT .. (%s) ..', $foo))

可以理解的是,这些会在 PhpStorm 中触发某种 SQL 语法错误警告。有没有办法在不完全禁用 SQL 语言解析的情况下抑制这些内容?

php风暴

评论

1赞 LazyOne 8/27/2014
使用的IDE版本?纯 SQL+PHP 语法(第一个示例)应该在 v8(当前处于 EAP 阶段)中工作。第二个例子还很遥远(据我所知):youtrack.jetbrains.com/issue/WI-2324youtrack.jetbrains.com/issue/WI-3672
0赞 deceze 8/27/2014
我明白了,谢谢你的链接。我目前在 7.1 上。

答:

7赞 nem75 12/19/2014 #1

您可以按照以下两个步骤进行基本的 SQL 解析和语法检查:

  1. 将方言设置为 。在设置以下内容:GenericFile -> Settings

PHPStorm settings, "Generic" SQL dialect 缩放

  1. 然后,禁用检查:SQL dialect detection

enter image description here 缩放

确认,你就完成了。Ok

当然,如果 PHPStorm 可以通过变量替换来解析 SQL 字符串,那就太好了,但遗憾的是,情况并非如此。

评论

1赞 tdtm 5/30/2016
对于较新的 IntelliJ/PHPstorm 版本,此答案现已过时。Emerge 的答案现在是最好的选择。
1赞 Elliot Chance 1/14/2015 #2

我想出的唯一解决方案是在 SQL 之前添加一个换行符,例如:

$sql = "\nINSERT INTO ...";

PhpStorm 现在认为它是一个普通的旧字符串,不会尝试将其解析为 SQL。

评论

1赞 deceze 1/14/2015
还不如关闭SQL语言注入,不是吗?
1赞 Elliot Chance 1/14/2015
不,因为我希望它用于我的整个项目。但在这种罕见的情况下可以忽略。大多数 PhpStorm 警告/错误都可以为上面带有 php 注释的单行禁用,但这似乎不适用于 SQL。
2赞 deceze 1/14/2015
我仍然不愿意为了误导我的IDE而改变我的实际代码。我可以忍受注释注释,因为它至少是明确的(不知道这是否真的不可能)。但是像这样的黑客攻击会在半年后让每个人都失望......话虽如此,有趣的解决方法!
0赞 Elliot Chance 1/14/2015
我同意。另外,添加另一条评论解释了为什么那里的额外字符有点矫枉过正。当那个人一年后回来并说“这很奇怪,一定是错别字”时,他们将其删除。他们要么收到错误并发布错误的原因,要么不会收到错误,因为 IDE 已同时修复该问题。无论哪种方式都没有造成损害......
8赞 Emerge 10/10/2015 #3

我从 Jetbrains 博客中找到了这个问题的明确答案:

http://blog.jetbrains.com/phpstorm/2014/11/database-language-injection-configuration/

您需要添加 .在“工具>数据库”部分中。\%\w+

PhpStorm configuration screenshot

评论

2赞 tdtm 5/30/2016
请注意,它似乎在 and 子句中起作用,但在 a 之后的任何位置都失败(例如 an )。SELECTWHEREWHEREORDER BY