【PHP・MySQL】データベースに画像を保存・表示する方法 第3回「画像を保存する」
ここまでの記事はこちら
今回はデータベースに画像ファイルを保存していきます。
データベースを作成していない方はこちらから用意してください。
解説
functions.phpの作成
データベースへの接続は
- 画像を保存する時
- 画像を表示する時
- 画像を削除する時
に必要になります。
何度も同じコードを書くのは面倒なので functions.php というファイルを作成して、データベース接続する関数を用意しましょう。
データベースに接続
functions.php を作成したら、以下のようにコードを書きます。
4行目
$param = 'mysql:dbname=my_image;host=localhost';
dbname はデータベース名、host はホスト名を設定します。
ローカル環境でのホスト名は localhost にします。レンタルサーバーなどを利用している場合はお使いのサーバーに合わせて変更してください。
6行目
$pdo = new PDO($param, 'ユーザー名', 'パスワード');
ユーザー名とパスワードは、ご自身の MySQL の設定に合わせて変更してください。phpMyAdmin 管理画面へのログインに使うユーザ名とパスワードです。
XAMPP / MAMP を使っている場合
ユーザー名とパスワードの初期設定を変更していない場合は以下の設定します。
XAMPP | MAMP | |
---|---|---|
ユーザー名 | root | root |
パスワード | なし(空白) | root |
10行目
exit($e->getMessage());
データベースに接続できなかった場合は、エラーメッセージを表示させてプログラムを終了します。
画像を保存する
次に list.php を開いて、画像の保存してみましょう。
1~29行目を追加します。
データベースに接続する
2行目で先ほど作成した functions.php を読み込んで、4行目でデータベースに接続しています。
画像を保存する
6行目の if 文は
- form から画像を POST された場合は画像を保存
- POST でない場合は保存した画像を取得
という分岐になっています。
画像をフォームから POST すると、以下のデータを取得できます。
このデータを images テーブルに追加していきます。
保存が出来たら list.php にリダイレクトして完了です。(26・27行目)
データベースを確認する
ブラウザで list.php を開いて画像を保存してみましょう。
データベースに画像が保存されているか確認してください。
* 画像が保存できない場合
コードを正しく書いているのに画像が保存されない場合は、以下の記事を参考に 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 関数を呼び出すことが出来ています。
ありがとうございます。参考にいたします。
質問すいません、エラーが起こってしまい手詰まりになってしまいました。
functions.phpの6行目の名前とパスワードを自分のAdominにあうように変えそれ以外は全て上記の通りに打ち込んだのですが画像を選択し保存した際に
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘my_image.images’ doesn’t exist in C:\XAMPP\htdocs\2022C3B\list.php:24 Stack trace: #0 C:\XAMPP\htdocs\2022C3B\list.php(24): PDOStatement->execute() #1 {main} thrown in C:\XAMPP\htdocs\2022C3B\list.php on line 24
というようなエラーが発生しどこを直せばいいのかわからず詰まってしまいました、良ければ改善案を教えていただければ幸いです
当サイトを見つけていただきありがとうございます!
テーブル名(images)が間違っている可能性があるので、MySQLの管理画面からもう一度ご確認ください。
テーブル名を見直したところ無事画像を保存できました、ありがとうございます!
ご報告ありがとうございます。
無事に画像を保存できたとのこと良かったです!