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

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

ただいまの
回答率

90.47%

  • PHP

    20839questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • HTML

    9281questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • teratail

    416questions

    teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

どこが間違っていますか?-サーバーの情報をダウンロード-

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 873

b1ackc0ffee

score 197

下記のコードだと、
リンクをクリックすると下記のようなエラーメッセージが表示されます。
Parse error: syntax error, unexpected '{' in C:\xampp\htdocs\php10\lesson28\download.php on line 6

自分では間違いが見つけられなかったのですが、どこが間違っていますでしょうか。
2個目のphpファイルがdownload.php です。

<?php require_once '../Encode.php'; ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>PHP入門教室</title>
</head>
<body>
<h3>ファイルリスト</h3>
<table border="1">
<tr>
  <th>ファイル</th><th>サイズ</th><th>最終アクセス日</th><th>最終更新日</th>
</tr>
<?php
const DOC_ROOT = '../doc/';
clearstatcache();
$o_dir = @opendir(DOC_ROOT)
  or die('フォルダが開けませんでした。');
while ($file = readdir($o_dir)) {
  if (is_file(DOC_ROOT.$file)) {
    $path = DOC_ROOT.$file;
    $file = mb_convert_encoding($file, 'UTF-8', 'SJIS-WIN');
?>
    <tr>
      <!--/* ここからダウンロードリンクの準備 */  -->
      <td><a href="download.php?path=<?php print(urlencode($file)); ?>">
        <?php print(e($file)); ?></a></td>
      <!--  /* ここまでダウンロードリンクの準備 */-->
      <td><?php print(round(filesize($path) / 1024)); ?>KB</td>
      <td><?php print(date('Y/m/d H:i:s', fileatime($path))); ?></td>
      <td><?php print(date('Y/m/d H:i:s', filemtime($path))); ?></td>
    </tr>
<?php
  }
}
closedir($o_dir);
?>
</table>
</body>
</html>


<?php
const DOC_ROOT = '../doc/';
$flag = FALSE;
$o_dir = opendir(DOC_ROOT);
/* ここから--クエリ情報pathのチェック-- */
while ($file = readdir($o_dir)) {
  if (is_file(DOC_ROOT.$file)) {
    $filename = $file;
    $path = DOC_ROOT.$file;
    $file = mb_convert_encoding($file, 'UTF-8', 'SJIS-WIN');
    if ($_GET['path'] === $file) {
      $flag = TRUE;
      break;
    }
  }
}
closedir($o_dir);
/* ここまで--クエリ情報pathのチェック-- */
if (!$flag) { die('不正なパスが指定されました。'); }
/* ↑エラー時は強制終了 */
/* ここから--ダウンロード処理-- */
header('Content-Type: application/contet-stream');
header('Content-Disposition: attachment;filename='.$filename);
print(file_get_contents($path));
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+3

ブラウザから、意図的にありえないファイルパスを指定し、「不正なパスが指定されました。」と表示されるでしょうか?

download.php?path=1111111

もし、Parse error: syntax error, が出るようであれば、ソースに必ず文法エラーがあります。
「不正なパスが表示されました」と表示されるようであれば、../doc/フォルダの中のリストを見せていただきたいです。


Parse error: syntax error, unexpected '{'
↑のエラーは、
①のケース
if (条件)
    処理
}
のような記述をしたときに出るエラーです。

②のケース
if (条件)
{
    処理

上記のようなケースだと
Parse error: syntax error, unexpected '}
かっこの向きが逆(}) のエラーになります。

従って、①のケースが発生していると思われます。

またエラーメッセージから、download.phpファイルの6行目付近に "{" が無いというエラーです。

しかしながら、質問文のソースをコピーペーストし、
※「Encode.php」の内容が不明の為、コメント化し、print(e()); の[e]という名前の関数がエラーとなったためprint(); に変更

docフォルダに適当な画像ファイルを入れてテストしてみたところ、正常に動作しました。
また、意図的に6行目付近の"{"が無いというエラーを出させてみようと、"{"又は"}" を外してみたり、足してみたりしましたが、6行目付近でのエラーを発生させることはできませんでした。

このことから、../doc/フォルダの中に入っているファイルの名称に何かしら原因があるのではないかと推測しています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/02 16:08

    わっ
    ご親切に有難うございます。

    実は、サーバーのバージョンがphp4だったため、constが使えなかったのが原因でした。
    あと、全角スペースも入っていましたので、エディタを全角スペースは□となるようにガジェット追加しました。
    有難うございました★★

    キャンセル

+3

不具合を本当に見つけにいくなら、、、ですが
このぐらい小さいモジュールなら、まずは機能を絞って実行してみますね。

Directoryが開けるか?
引数がわたってるか?

<?php
const DOC_ROOT = '../doc/';
$flag = FALSE;
$o_dir = opendir(DOC_ROOT);
closedir($o_dir);
print($path);

なおモジュールを修正するときは、
バックアップ取ってから実施しないと消えちゃうので注意が必要ですよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/02 16:10

    少しずつコードをコメントアウトして、原因を解明するのですね^^
    まだそこまでできるレベルではありませんが、できるように心がけます。
    アイディア有難うございました★

    キャンセル

+2

constキーワードはPHP5.3以降対応なので、それ以前のバージョンを使っているとか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/30 17:32


    回答ありがとうございます!
    であれば、エラーメッセージが合っているとは限らなんですねぇ。。
    前回の質問も同じことが原因かもしれません。
    https://teratail.com/questions/12021
    どうすれば、解決するのかわかりません。
    宜しくお願い致します。

    キャンセル

  • 2015/06/30 17:58

    constの代わりに
    define('DOC_ROOT', '../doc/');
    を使えば直るかも知れません。

    キャンセル

  • 2015/07/01 11:30

    有難うございます。
    リストは表示されたのですが、リンクをクリックすると、
    Parse error: parse error, unexpected '{' in /home/sample/htdocs/asada/php10/lesson28/download.php on line 6
    と表示されてしまいました。

    キャンセル

-2

見た感じ大丈夫そうな気がするんですが・・・

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/30 17:32


    回答ありがとうございます!
    であれば、エラーメッセージが合っているとは限らなんですねぇ。。
    前回の質問も同じことが原因かもしれません。
    https://teratail.com/questions/12021
    どうすれば、解決するのかわかりません。
    宜しくお願い致します。

    キャンセル

関連した質問

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

  • PHP

    20839questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • HTML

    9281questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • teratail

    416questions

    teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。