可替代heredoc,用于从php代码的下一行延续,就像c语言中的斜杠一样


Alternative to heredoc, for continuation from the next line for php code, like it is slash in c language?

我有一个很长的查询

 $s = $dbh->prepare("SELECT name,type,
            (select count(opinionid) from fe_opinion where actor=name) as countopinion,
            (select count(commentid) from fe_comment where actor=name) as countcomment,
            (select count(commentid) from fe_reply where actor=name and replyto<>null) as countreply, 
            (select count(voteid) from fe_vote where actor=name and replyto<>null) as countvote,
            (select count(voteid) from fe_vote where actor=name and replyto<>null and vote=1) as countagree,
            (select count(voteid) from fe_vote where actor=name and replyto<>null and vote=0) as countdisagree
            from fs_actor where name=:name");
当我像这样在多行中写它时,它给了我一个语法错误。我不确定编译器,因为我没有执行它。它应该以这种格式工作还是我应该使用heredoc?

如何从下一行继续写字符串?你应该按回车键继续下一行吗?我应该使用heredoc还是有一个特殊的新行字符?

我在phpdoc 中找到了这个例子
echo 'You can also have embedded newlines in 
strings this way as it is
okay to do';

现在我想我的语法错误是在别的地方

只是瞎猜一下,你确定不是countdisagree后面的最后一个逗号导致了语法错误吗?不要在SELECT的最后一部分后面加逗号,你可能没有意识到你把它放在那里了,我知道我自己在分解一个长SQL查询时做过很多次,如果它在那里,它会给出一个语法错误,因为它期望从另一个语句中进行选择。

SQL查询,多行或其他,应该只给出一个语法错误,如果确实有一个,所以如果你得到一个语法错误,你可以打赌你有一个。你可以把它分开,这样每行只有一个单词,这样就不会出现语法错误。

PHP中没有行连续符。你应该使用Heredoc:

$s = $dbh->prepare(<<<'EOQ'
  SELECT name, type,
    (SELECT COUNT(opinionid) FROM fe_opinion WHERE actor = name) AS countopinion,
    (SELECT COUNT(commentid) FROM fe_comment WHERE actor = name) AS countcomment,
    # ...
    FROM fs_actor WHERE name = :name"
EOQ
);

这里EOQ周围的单引号是PHP莫名其妙地称为"Nowdoc"语法,它与Heredoc相同,但不被解析——相当于使用$s = 'Hello $world';与双引号$s = "Hello $world";——这可能会为您节省几毫秒(但是,顺便说一句,似乎摆脱了SO的语法高亮显示)。

在PHP中,除了将查询存储在其他地方之外,唯一的(合理的)选择是使用字符串连接,这会变得非常难看:

$s = $dbh->prepare(
  'SELECT name, type, ' .
  ' (SELECT COUNT(opinionid) FROM fe_opinion WHERE actor = name) AS countopinion, ' .
  ' (SELECT COUNT(commentid) FROM fe_comment WHERE actor = name) AS countcomment, ' .
  // ...
  ' FROM fs_actor WHERE name = :name'
);

…这是非常丑陋的,需要你注意空格