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

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

ただいまの
回答率

89.96%

mysqlとphpを使い画像アップロードページを作りたいのですが・・・

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,510

hiroshi3324

score 12

php,mysqlについて初心者のです。
タイトルにもある通り現在phpとmysqlを使って画像アップロードページを作成しているのですがうまくいきません。
直接mysqlにバイナリデータを登録するのはよろしくないということだったのでサーバー上にフォルダーを作りそこに画像を保存してそのパスをデータとして格納するということにしました。
現段階でDBにはパスを登録できている段階なのですがそれを次は写真アルバムみたいに一覧表示したいと考えてプログラムを書いたのですが表示されません。![DBにデータは格納できています](e8aa6ba33c948b52c007377ea1dcacaf.png)

このサイトをみて参考にさせて頂きました。
[PHP]ファイルアップロードサンプル(PHP → DB → HTML)

何卒よろしくお願いします。

<?php

require 'common.php';


function file_upload()
{
    // POSTではないとき何もしない
    if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST') 
    {
        return;
    }

    // タイトル
    $title = filter_input(INPUT_POST, 'title');
    if ('' === $title) {
        throw new Exception('タイトルは入力必須です。');
    }

    // アップロードファイル
    $upfile = $_FILES['upfile'];


    if ($upfile['error'] > 0) {
        throw new Exception('ファイルアップロードに失敗しました。');
    }

    $tmp_name = $upfile['tmp_name'];

    // ファイルタイプチェック
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimetype = finfo_file($finfo, $tmp_name);

    // 許可するMIMETYPE
    $allowed_types = [
        'jpg' => 'image/jpeg'
        , 'png' => 'image/png'
        , 'gif' => 'image/gif'
    ];
    if (!in_array($mimetype, $allowed_types)) {
        throw new Exception('許可されていないファイルタイプです。');
    }

    // ファイル名(ハッシュ値でファイル名を決定するため、同一ファイルは同盟で上書きされる)
    $filename = sha1_file($tmp_name);

    // 拡張子
    $ext = array_search($mimetype, $allowed_types);

    // 保存作ファイルパス
    $destination = sprintf('%s/%s.%s'
        , 'upfiles'
        , $filename
        , $ext
    );

    echo $destination;

    // アップロードディレクトリに移動
    if (!move_uploaded_file($tmp_name, $destination)) 
    {
        throw new Exception('ファイルの保存に失敗しました。');
    }



    // データベースに登録
    $sql = 'INSERT INTO `images` (`id`, `title`, `img_path`) VALUES (NULL, :title, :img_path) ';
    $arr = [];
    $arr[':title'] = $title;
    $arr[':img_path'] = $destination;
    echo $title ;
    $lastInsertId = insert($sql, $arr);

    // 成功時にページを移動する
    header(sprintf('Location: image.php?id=%d', $lastInsertId));
}

try {
    // ファイルアップロード
    file_upload();
} catch (Exception $e) {
    $error = $e->getMessage();
}
?>
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .error {
                color: red;
            }
        </style>
    </head>
    <body>
        <div id="wrap">
            <?php if (isset($error)) : ?>
                <p class="error"><?= h($error); ?></p>
            <?php endif; ?>
            <form action="" method="post" enctype="multipart/form-data">
                <p>
                    <label for="title">タイトル</label>
                    <input type="text" name="title" id="title" />
                </p>
                <p>
                    <label for="upfile">画像ファイル</label>
                    <input type="file" name="upfile" id="upfile" />
                </p>
                <p>
                    <button type="submit">送信</button>
                </p>
            </form>
        </div>
    </body>
</html>
<?php

require 'common.php';

try 
{

    $id = filter_input(INPUT_GET, 'id');

    echo $id;
    // データベースからレコードを取得

    $sql = "SELECT id, title, img_path FROM images WHERE id = :id";
    $arr = [];
    $arr[':id'] = $id;
    $rows = select($sql, $arr);
    $row = reset($rows);

} catch (Exception $e) 
{
    $error = $e->getMessage();
}
?>
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .error {
                color: red;
            }
        </style>
    </head>
    <body>
        <div id="wrap">
            <?php if (isset($error)) : ?>
                <p class="error"><?= h($error); ?></p>
            <?php endif; ?>

            <p><?= h($row['title']); ?></p>
            <p>
                <img src="<?= h($row['img_path']); ?>" alt="<?= h($row['title']); ?>" />
            </p>
        </div>
    </body>
</html>
<?php




function connect_db()
{
    $dsn = 'mysql:localhost=xxxx;dbname=xxxx;charset=utf8';
    $username = 'xxxx';
    $password = 'xxxx';
    $options = 
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        , PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ];
    return new PDO($dsn, $username, $password, $options);
}


function insert($sql, $arr = [])
{
    $pdo = connect_db();
    $stmt = $pdo->prepare($sql);
    $stmt->execute($arr);
    return $pdo->lastInsertId();
}


function select($sql, $arr = [])
{
    $pdo = connect_db();
    $stmt = $pdo->prepare($sql);
    $stmt->execute($arr);
    return $stmt->fetchAll();
}


function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+1

ユーザーが参照できるパスにおいてあるなら
<img src="画像ファイル"> とやればいいでしょう。
画像ファイルはプログラムからの参照しかできないなら
何らかのローダをつくって
<img src="imgloader.php?id=1">
のように呼び出せばいいでしょう。

またdbにはファイルサイズや縦横の長さをいれておいて
imgのwidthやheightにしていしてやるとよりユーザーに優しくなります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/07 17:01

    あがとうございます。
    <img src="<?= h($row['img_path']); ?>" alt="<?= h($row['title']); ?>" />
    現在このようになっているのでこれでは実装されないっということですかね?

    キャンセル

  • 2018/02/07 17:06

    $rowが正しく取れているならそれで問題ないと思います
    あとは前述しているとおりユーザーが直接参照できるパスに
    おいてあるかどうかだけです

    キャンセル

  • 2018/02/07 18:22

    今見たら、$rowに値が入っておらず参照できてない感じです
    ちょっとわからないのですが、ユーザーが直接参照できるパスというのはどういうことでしょうか?

    キャンセル

  • 2018/02/07 18:26

    > ユーザーが直接参照できるパス

    たとえばaaaさんが公開パス「/aaa」を持っていたとして
    ファイルがアップロードされる箇所がその「/aaa」であるとは
    限りません。
    もし「/bbb」にファイルがおいてあれば
    <img src"/bbb/hoge.jpg">としてもbbb自体が公開されてなければ
    ユーザーは参照できない・・・ということです。

    キャンセル

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

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