Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phpstorm 在SQL查询生成中使用字符串插值时避免语法错误警告_Phpstorm - Fatal编程技术网

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

Phpstorm 在SQL查询生成中使用字符串插值时避免语法错误警告,phpstorm,Phpstorm,当使用字符串插值、sprintf或任何形式的动态创建SQL查询字符串时,PhpStorm通常会出错。例如: $placeholders=join(',',数组填充(0,count($id),'?); $stmt=$db->prepare(“从foo中选择*wherebar IN($placeholders)”); $stmt->execute($id); 或: $db->prepare(sprintf('INSERT..(%s)…',$foo)) 可以理解,这会在PhpStorm中触发某种S

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

$placeholders=join(',',数组填充(0,count($id),'?);
$stmt=$db->prepare(“从foo中选择*wherebar IN($placeholders)”);
$stmt->execute($id);
或:

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

可以理解,这会在PhpStorm中触发某种SQL语法错误警告。有什么方法可以在不完全禁用SQL语言解析的情况下抑制它们吗?

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

  • 将方言设置为
    Generic
    。在
    文件->设置中设置以下内容:
  • 然后,禁用
    SQL方言检测
    检查:
  • Ok
    确认即可


    当然,如果PHPStorm能够用变量替换来解析SQL字符串就太好了,但遗憾的是,事实并非如此。

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

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

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

    我在Jetbrains博客中找到了这个问题的最终答案:

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


    是否使用IDE版本?纯SQL+PHP语法(第一个示例)应该可以在v8中使用(目前处于EAP阶段)。第二个例子仍然很遥远(据我所知):我明白了,谢谢你的链接。我目前使用的是7.1。那么,我可能会关闭SQL语言注入,不是吗?不是,因为我想在整个项目中使用它。但在这种罕见的情况下,我们不能忽视。大多数PhpStorm警告/错误可以在上面带有php注释的一行中禁用,但这似乎不适用于SQL。我仍然不愿意为了误导IDE而修改实际代码。我可以接受注释注释,因为它至少明确了它的用途(不知道这是否真的不可能)。但是像这样的黑客会在半年后把所有人都解雇。。。说了这些,有趣的解决方法!我同意。再加上另一条评论,解释为什么这个额外的角色有点过火。当那个人一年后回来说“这很奇怪,一定是打字错误”,他们就把它删除了。他们要么会得到一个错误并发布它出现的原因,要么不会得到错误,因为IDE在这段时间内已经修复了这个问题。无论哪种方式都不会造成损害……对于较新的IntelliJ/PHPstorm版本,此答案现在已经过时。现在是最佳选项。请注意,它似乎在
    SELECT
    WHERE
    子句中起作用,但在
    WHERE
    之后的任何位置失败(例如
    ORDER BY
    )。