ここまでの記事はこちら
今回はデータベースに画像ファイルを保存していきます。
データベースを作成していない方はこちらから用意してください。
解説
データベースに接続
データベースへの接続は
- 画像を保存する時
- 画像を表示する時
- 画像を削除する時
に必要になります。
何度も同じコードを書くのは面倒なので、functions.php というファイルにデータベース接続する関数を用意します。
functions.php という名前でファイルを作成して、以下のようにコードを書きます。
4行目
dbname はデータベース名、host はホスト名を設定します。
ホスト名は ローカル環境の場合は localhost にします。
レンタルサーバーなどを利用している場合は、お使いのサーバーに合わせて変更してください。
6行目
ユーザー名とパスワードは、ご自身の MySQL の設定に合わせて変更してください。(phpMyAdmin 画面にログインする時のユーザ名とパスワードです。)
MAMP を使っていて、ユーザー名とパスワードの設定を行なっていない場合は root になっていると思います。
10行目
データベースに接続できなかった場合は、エラーメッセージを表示させてプログラムを終了します。
画像を保存する
次に list.php を開いて、画像の保存していきましょう。
1~29行目を追加します。
データベースに接続する
2行目で先ほど作成した functions.php を読み込んで、4行目でデータベースに接続しています。
画像を保存する
6行目の if 文は
- form から画像を POST された場合は画像を保存
- POST でない場合は保存した画像を取得
という分岐になっています。
画像をフォームから POST すると、以下のデータを取得できます。

このデータを images テーブルに追加していきます。
保存が出来たら list.php にリダイレクトして完了です。(26・27行目)
データベースを確認する
ブラウザで list.php を開いて画像を保存してみましょう。
MySQL の管理画面を開いて、画像が保存されているか確認してください。
* 画像が保存できていない場合
コードを正しく書いているのに画像が保存できない場合は、以下の記事を参考に php.ini の設定を確認してください。

次に行うこと
次回はデータベースに保存した画像を表示していきます。
表示を確認するために、2~3枚の画像を保存しておいてください

参考にさせて貰ってます。
ありがとう情報。感謝です。
wsdheadさん、コメントありがとうございます!
お役に立てれば嬉しいです
めちゃくちゃ分かりやすいです!
”気づけばプロ並みPHP”の教科書やったあとで、そういえば投稿した画像データを特定ファイルからではなく、DBから表示するのはどうするのだろう?と思い、こちらにたどり着きました。
KIさん、当サイトを見つけて頂いてありがとうございます。
私もPHPを始めたばかりの頃「気づけばプロ並みPHP」読みました!とても良い本だったと記憶しています。
この記事が少しでもお役に立てれば幸いです🙂
お世話になります。
PHPの初心者で,大変役に立ったページでありがたかったです。
zipファイルを展開,コードをアップロードして試運転してみたところ,
添付のような結果で,画像が表示されませんでした。。
DBには,データは正しくアップロードされており,DBの構造も解説どおりです。
どのような問題が考えられるか,ご教示いただければありがたく思います。
サイトは,value-server
当サイトを見つけて頂きありがとうございます
私のサーバーでも zip 展開→アップロードで試したところ、問題なく動作しました。
おそらく image.php へのパスに問題があると思いますので
<img src="image.php?id=<?= $images[$i]['image_id']; ?>" width="100" height="auto" class="mr-3">
のあたりをご確認頂ければと思います。
質問があるのですが、functions.phpをrequire_onceで読み込ませた場合ほかの記述があった場合どうなるのでしょうか?
自分もfunctions.phpにdb接続を書こうと思っているのですが、読み込ませず直に書く方法はないのか模索しています。
今回はfunctions.phpには1つの関数しか書きませんでしたが、もう少し大きいプロジェクトになると「データの取得・保存・更新・削除、ログイン、ログアウト」など複数の関数を書くこともあります。
functions.phpを読み込まないとfunctions.phpに書いた関数を使うことはできないので「functions.phpにdb接続を書いて、読み込ませず直に書く」という使い方ができるものではありません。
ですので一つのファイルで完結させたい場合は、list.phpにデータベース接続のコードを書けば良いかと思います。(関数にしてもしなくてもどちらでも良いです。)
参考になれば幸いです。
※先程のコメントは取り消して頂いて、こちらをよろしくお願いします。
ありがとうございます。勉強になりました。
もう1点だけお聞きしたいのですが、functions.phpは勝手に読み込まれるものではないのでしょうか?
下記のコードをfunctions.phpに書いて、page.php(固定ページ)で呼び出す過程で話しています。
※functions.phpに書くもの
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //エラーが発生した時に、例外を投げる
echo ‘データベースへの接続が出来ました’;
return $dbh; //※接続したオブジェクトを返す
} catch (PDOException $e) {
echo $e->getMessage(); // err時はメッセージを表示
exit;
}
}
※page.phpに書くもの
$dbh = connect_db();//接続オブジェクトを保持する
page.php(固定ページ)があるということは WordPress でしょうか?
WordPress の場合はコアファイルで functions.php の読み込み処理がされているので自分で書く必要はありません。
それ以外の場合は自分で functions.php を読み込む必要があります。
ファイルが勝手に読み込まれるということはないので、page.php で functions.php を読み込んでください。
WordPressと明記せず申し訳ありません。
データベースへの接続の部分を仮にfunction db_connect()で括ったとして、functions.phpにコードを書いた場合、呼び出す側の固定ページには$dbh = connect_db();//接続オブジェクトを保持する
との記載を加える必要があるのでしょうか?
Uncaught Error: Call to undefined function connect_db()とのエラーがでており困っております。
関数に対して add_action や add_filter などを使っていない場合、自分で関数を呼び出す必要があります。
Call to undefined… と出る場合は、functions.php 内の {} や<?php ?>の囲み方が間違っていることが多いです。
まずは以下のように簡単な関数で試してみるのがオススメです。
functions.php
function printHello() {
echo 'hello!';
}
pages.php
printHello();
固定ページを開いて「hello!」と出力されていれば printHello 関数を呼び出すことが出来ています。
ありがとうございます。参考にいたします。