質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

入れ子??

受付中

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 2,982

score 205

<?php require_once '../Encode.php'; ?>
<!-- Encode.phpをインポート -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>PHP入門教室</title>
</head>
<body>
<h3>ゲストブック(閲覧)</h3>
<?php
$file = @fopen('guest.dat', 'rb')
  or die('ファイルが開けませんでした。');
flock($file, LOCK_SH);
print('<dl>');
// ↓ファイルを行単位で読み込み
while ($row = fgetcsv($file, 1024, "/t")) {
?>
  <dt><?php print(e($row[1])); ?>
    (<?php print(e($row[0])); ?>) </dt>
  <dd>メッセージ:<?php print(e($row[2])); ?><hr /></dd>
<?php
}
print('</dl>');
flock($file, LOCK_UN);
fclose($file);
 ?>
</body>
</html>

上のコードなんですが、

22行目と23行目が逆になるか、
18行目が、21行目の後に来る方が自然じゃないですか?
参考書が上のようなコードになっているのですが、これが自然な書き方なのでしょうか。
何か意味があるのでしょうか。

質問の意味が分かりにくくてすみません。
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+3

PHPの分かり難い部分ですよね。
自分も最初は意味不明でした。

簡単な例を提示しますので参考にしてみてください。

1から10までを出力するだけのサンプルです。
いずれも同じように動作します。


<?php
    $i = 0;
    while($i <= 10){
?>

<div><?php echo $i++; ?></div>

<?php
    }
?>
<?php
    $i = 0;
    while($i <= 10):
?>

<div><?php echo $i++; ?></div>

<?php
    endwhile;
?>
<?php
    $i = 0;
    while($i <= 10){
        echo "<div>".$i++."</div>";
    }
?>


3つ目のサンプルが他の言語でもお馴染みの記法ですが、
PHPではコード内にHTMLを直接書けてしまうんですよね。

1番目の記法だとかなり混乱するので、
HTMLを埋め込む場合は2番目の方法の

命令文:
 処理
end命令文;

と明示したほうが分かりやすいコードになると思います。
ちなみにif文、for文でも同じことが可能です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

PHP において、PHP タグの外に書いているものは文字列リテラルを echo しているのと変わりありません。

なので、同じような意味で書き換えると次のようになります。
(適当に省略しているので全く同じではありません)

<?php require_once '../Encode.php';
echo "<!-- Encode.phpをインポート -->\n .. 中略 .. <h3>ゲストブック(閲覧)</h3>";
$file = @fopen('guest.dat', 'rb')
  or die('ファイルが開けませんでした。');
flock($file, LOCK_SH);
print('<dl>');
// ↓ファイルを行単位で読み込み
while ($row = fgetcsv($file, 1024, "/t")) {
    echo "<dt>";
    print(e($row[1]));
    echo "(";
    print(e($row[0]));
    echo ") </dt>\n<dd>メッセージ:";
    print(e($row[2]));
    echo "<hr /></dd>";
}
print('</dl>');
flock($file, LOCK_UN);
fclose($file);
echo "</body>\n</html>\n";

これを見れば、括弧の対応とかが正しいのがわかります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

22行目と23行目が逆にしたり、18行目が、21行目の後に来るとエラーになります。
このコードはPHPで書かれている部分とHTMLの部分が混ざっているためです。 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

18行目はphpの開始タグ
22行目はphpの中でwhileのブロックを閉じる処理なので問題無いです

ただ、可読性が悪いので
私ならhtmlと混ぜる場合こう書きます。
<?php require_once '../Encode.php'; ?>
<!-- Encode.phpをインポート -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>PHP入門教室</title>
</head>
<body>
<h3>ゲストブック(閲覧)</h3>
<?php
$file = @fopen('guest.dat', 'rb')
  or die('ファイルが開けませんでした。');
flock($file, LOCK_SH);
?>
<dl>
<?php while ($row = fgetcsv($file, 1024, "/t")): ?>
  <dt><?php print(e($row[1])); ?>
    (<?php print(e($row[0])); ?>) </dt>
  <dd>メッセージ:<?php print(e($row[2])); ?><hr /></dd>
<?php endwhile;?>
</dl>
<?php
flock($file, LOCK_UN);
fclose($file);
 ?>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

19: <dt><?php print(e($row[1])); ?>
↑htmlの<dt>開始タグに続いて<?phpでphpが始まり行内で?>によってphpが終わっている。

20: (<?php print(e($row[0])); ?>) </dt>
↑htmlで”(”を出力してから、<?phpでphpが始まり?>でphpが終わった後に”)</dt>”と閉じ括弧と終了タグを書き出している。

ですので、書き順は間違っていないですよ。

自然かどうかと言われると<dl></dl>がprint()で出力されていたりするので違和感ありますが、エラーになるような書き方ではないです。
逆に18行目が、21行目の後に来るとエラーになります。

ただ、<dd></dd>に<hr />が入ってるのがちょっと許せない。。。w

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る