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

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

ただいまの
回答率

91.01%

  • PHP

    17777questions

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

  • MySQL

    5101questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • phpMyAdmin

    567questions

    phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHPとMySQLで画像アップロードページを作りたいのですが出来ません

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 362

oyatsu8

score 60

PHP,mySQL初心者です。直接MySQLにバイナリデータを登録するのではなくて、サーバ上のフォルダにアップロードして、そのリンクをMySQLに格納したいと思っています。

参考にさせて頂いたのは下記のサイトです。
[PHP]ファイルアップロードサンプル(PHP → DB → HTML)
上記のサイトを見て、テーブル定義は下記のようにしました。
本当にテーブルの定義名を変えただけなのですが、index.phpの表示は出来て、アップロードしても何も起こらず、DBへの登録もされていません。
何が悪いのか、ご指摘を頂けないでしょうか、または、もっと単純なサンプルコード、書籍ながあれば教えて頂けないでしょうか、どうぞよろしくお願いします。

CREATE TABLE `image_up` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `image_title` varchar(32) DEFAULT NULL,
  `image_path` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<?php
/**common.php*/
/**connect_db @return \PDO*/
function connect_db()
{
    $dsn = 'mysql:host=----;dbname=----;charset=utf8';
    $user = '----';
    $pass = '----';
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ];
    return new PDO($dsn, $user, $pass, $options);
}

/**insert* @param string $sql* @param array $arr* @return int lastInsertId*/

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

/** * select* @param string $sql* @param array $arr* @return array $rows */
function select($sql, $arr = [])
{
    $pdo = connect_db();
    $stmt = $pdo->prepare($sql);
    $stmt->execute($arr);
    return $stmt->fetchAll();
}
/**
 * htmlspecialchars
 * @param string $string
 * @return $string
 */
function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}
<?php
/*** index.php*/
/*** 共通関数読み込み*/
require 'common.php';
/**
 * file_upload
 */
function file_upload()
{
    // POSTではないとき何もしない
    if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST') {
        return;
    }
    // タイトル
    $image_title = filter_input(INPUT_POST, 'image_title');
    if ('' === $image_title) {
        throw new Exception('タイトルは入力必須です。');
    }
    // アップロードファイル
    $upfile = $_FILES['upfile'];
    /*** @see http://php.net/manual/ja/features.file-upload.post-method.php*/
    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);
    // アップロードディレクトリに移動
    if (!move_uploaded_file($tmp_name, $destination)) {
        throw new Exception('ファイルの保存に失敗しました。');
    }
    // Exif 情報の削除
    $imagick = new Imagick($destination);
    $imagick->stripimage();
    $imagick->writeimage($destination);

    // データベースに登録
    $sql = 'INSERT INTO image_up ("id","image_title","image_path") VALUES (NULL, :image_title, :image_path) ';
    $arr = [];
    $arr[":image_title"] = $image_title;
    $arr[":image_path"] = $destination;
    $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="image_title">タイトル</label>
                    <input type="text" name="image_title" id="image_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
/*** image.php*/
require 'common.php';
try {
    $id = filter_input(INPUT_GET, 'id');

    // データベースからレコードを取得
    $sql = 'SELECT 'id', 'image_title', 'image_path' FROM 'image_up' 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['image_title']); ?></p>
            <p>
                <img src="<?= h($row['image_path']); ?>" alt="<?= h($row['image_title']); ?>" />
            </p>
        </div>
    </body>
</html>

追記:
色々やってみたのですが、まだ解決しません。
さくらのレンタルサーバーではエラーが出力されませんが、アップロードも出来ておらず、php.iniに書き込みもしましたが、やはりエラーがでません。
php.ini

また、ローカル環境にMAMPで同じ環境を作ったのですが、こちらは下記のようなエラーが出力されています。

Fatal error: Uncaught Error: Class 'Imagick' not found in /Applications/MAMP/htdocs/photo_up/index.php:61 Stack trace: #0 /Applications/MAMP/htdocs/photo_up/index.php(82): file_upload() #1 {main} thrown in /Applications/MAMP/htdocs/photo_up/index.php on line 61

index.phpコードの下記の部分がおかしいようなのですが、MAMP3.5.1のImageMagickは入っていたので、MAMP自体はおかしくないと思われます(ImageMagickについては自分自身は画像を処理してくれるとしか、よくわかっていません)。

$imagick = new Imagick($destination);
    $imagick->stripimage();
    $imagick->writeimage($destination);

追記02:
ローカル環境ではファイルをアップ出来るようになりましたがエラーが出ています。
サーバーはやはりファイルがアップされません

追記03:
サーバーにもファイルがアップされました!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

アップロードに失敗した場合何かしらのエラーが出るはずです。
エラーをすべて表示してください
https://qiita.com/mpyw/items/2f9955db1c02eeef43ea#%E5%85%A8%E3%81%A6%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E8%A1%A8%E7%A4%BA

php.iniが設定できない環境ならcommon.phpの先頭に
error_reporting(-1);
ini_set('display_errors',1);
を追加

また、提示されたimage.phpのコードにsyntax errorがあります

$sql = 'SELECT 'id', 'image_title', 'image_path' FROM 'image_up' WHERE 'id' = :id';


ではなく

 $sql = 'SELECT `id`, `image_title`, `image_path` FROM image_up WHERE id = :id';

追記1:
さくらインターネットレンタルサーバでは以下のコード部分が正しく動きません
PHPがCGI版で動作していることが原因です。
参照:https://qiita.com/sebon77@github/items/163ce7ac8be5ccf96348
エラー表示を有効にしてもエラーが出ていないというのはそもそもPOST判定されておらず処理されていなかったのが原因。

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


ですので、以下のように書き換えます

    // POSTではないとき何もしない
    if($_SERVER["REQUEST_METHOD"] !== 'POST'){
        return;
    }


ただし、ビジネスプロ以上のプランはモジュール版への変更が可能です。
【さくらのレンタルサーバ】基本仕様
https://help.sakura.ad.jp/hc/ja/articles/206053142--%E3%81%95%E3%81%8F%E3%82%89%E3%81%AE%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90-%E5%9F%BA%E6%9C%AC%E4%BB%95%E6%A7%98

index.phpのSQL文も以下のようにしてください

    // データベースに登録
    $sql = 'INSERT INTO `image_up` (`image_title`,`image_path`) VALUES (:image_title, :image_path) ';


これで問題なく動作するはずです。
ディレクトリupfilesが存在していることが前提です

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/04 16:59

    ありがとうございます。よく見直してみます。

    キャンセル

  • 2017/11/06 00:39

    教えて頂いた分を修正し、1日がんばってみましたが、解決しておりません。
    php.iniも、phpコード上にもエラー用の処理を書いてみたのですが、
    さくらインターネットのレンタルサーバー上では何も表示されませんでした。ローカルでは、Imagickがおかしいらしいエラーが表示されました。もし何かアドバイス頂けたら助かります!

    キャンセル

  • 2017/11/06 03:06

    ありがとうございます!ファイルがアップされました!
    しかし、意味がわかっていないのと、Warning(Warning: Cannot modify header information - headers already sent by--)が出ているので、調べてみようと思います。深夜に大変ありがとうございました。これで眠れそうです。

    キャンセル

+2

このレベルのスクリプトを書く人に言うことでは無い気がしますが、まずエラーを確認してみてはいかがでしょうか?
エラーがないとしても、変数の変移を見れば、問題箇所はすぐにわかると思います。

というか、スクリプトのレベルと回答がものすごくチグハグなんで、的外れかもしれないですが、質問にそのあたりのことが記述されていないので、一応言ってみました!ぐらいの回答です^^;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/04 16:25

    回答ありがとうございます。自分はPHPはほとんど勉強したことがなく、リンクのページのコードの変数名を書き換えただけなので、、エラーの出し方から調べてみます、、このような状態で質問してしまい申し訳ありません。

    キャンセル

  • 2017/11/04 18:09

    あぁ、リンク先を見てませんでした。
    ShibuyaKosuke さんのスクリプトなんですね。

    まずエラー等の確認をすることをオススメします。
    あと、そもそも変更前のスクリプトで正常動作は確認したんでしょうか?

    ファイルアップロードは、セキュリティ的に気にしなければならない箇所が多いので、スクリプト全体をちゃんと理解できないと、手をいれるのは危険です。ちゃんと理解できるまで読み込むと良いですよ。

    キャンセル

  • 2017/11/06 01:02

    ありがとうございます。未だ解決しておりませんが、昨日よりは理解出来てきました、、が見本にしたコードは未だわかっておらず、、追記をさせて頂きましたので、もしアドバイス頂けたら幸いです。

    キャンセル

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

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

関連した質問

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

  • PHP

    17777questions

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

  • MySQL

    5101questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • phpMyAdmin

    567questions

    phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。