2011-12-09 4 views
0

私は長いクエリheredocの代わりに、PHPコードの次の行から継続すると、C言語のスラッシュのようですか?

$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を使うべきですか?

次の行からどのように文字列を書き込むことができますか? Enterを押して次の行に進むことによってそれをしなければならないのですか?私はheredocを使うべきですか?特別な改行文字はありますか?

私は今、私は私の構文エラーが他の何かだと思うphpdocの

echo 'You can also have embedded newlines in 
strings this way as it is 
okay to do'; 

でこの例を見つけました。

答えて

2

暗闇の中でちょうど一発で、countdisagreeの後に最後のカンマではないと確信していますか? SELECTの最後の部分の後にコンマを入れておかないと、それをそこに置くことに気付かなかったかもしれませんが、長いSQLクエリを分割するとかなり自分自身でそれをやったことが分かります。別のステートメントが選択されることを期待しているので、そこにあれば構文エラーです。

SQLクエリは、複数行またはそれ以外の場合は、実際には1つのみの構文エラーを与える必要があります。したがって、構文エラーが発生した場合は、1つ持っていると賭けることができます。あなたはそれを壊すことができるので、各行に1つの単語しかないので、構文エラーは起こりません。

+0

はいphpdocは文字列を行で区切っても問題ないと言っています。私の構文エラーは、それ以外のものでなければなりません。今カンマを修正しました。 –

+0

それを修正しましたか? – Phoenix

+0

はい私は今問題ありません。私は私の質問の終わりに、reevant phpdocの引用を追加しました。 –

1

PHPに行継続文字はありません。あなたはヒアドキュメントを使用する必要があります。

$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"構文、呼んでいる - 対ダブル$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' 
); 

...かなり醜いですし、あなたが必要ですあなたのスペースを気にする。

関連する問題