Альтернатива heredoc, для продолжения со следующей строки для php-кода, как это слеш на языке c? - PullRequest
0 голосов
/ 10 декабря 2011

У меня длинный запрос

 $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';

так что теперь я думаю, что моя синтаксическая ошибка - это нечто другое.

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Просто выстрел в темноте, вы уверены, что не последняя запятая после countdisagree вызывает синтаксическую ошибку? Вы не ставите запятую после последней части SELECT, и, возможно, вы не поняли, что ставите ее там, я знаю, что сам сделал это совсем немного, разбив длинный SQL-запрос, и это даст синтаксическая ошибка, если она существует, поскольку она ожидает выбора другого оператора.

SQL-запросы, многострочные или иные, должны давать синтаксическую ошибку только в том случае, если она действительно существует, поэтому, если вы получили синтаксическую ошибку, вы можете поспорить, что она есть. Вы можете разбить это, чтобы у вас было только одно слово в каждой строке, и это не даст синтаксической ошибки.

1 голос
/ 10 декабря 2011

В 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'
);

... что довольно уродливо и требует от вас вниманияваши пробелы.

...