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

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

新規登録して質問してみよう
ただいま回答率
85.35%
phpMyAdmin

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

PHP

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

Q&A

解決済

2回答

738閲覧

PHP 画像データをデータベースに保存する時のエラー

emi_ono

総合スコア84

phpMyAdmin

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

PHP

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

0グッド

1クリップ

投稿2022/09/03 13:16

編集2022/09/03 14:29

前提

PHPで画像をアップロードして表示するページを作っています。
画像データをDBに保存したいのですが、エラーが出て解決ができません。
アドバイスを頂きたいです。よろしくお願いします。

発生している問題・エラーメッセージ

Fatal error: Uncaught Error: Call to a member function prepare() on null in /home/●/●/public_html/detail/owner/3.0.1/dbc.php:34 Stack trace: #0 /home/●/●/public_html/detail/owner/3.0.1/file_upload.php(55): fileSave('staff1.png', '/home/●...', '\xE3\x83\x86\xE3\x82\xB9\xE3\x83\x88', '1') #1 {main} thrown in /home/●/●/public_html/detail/owner/3.0.1/dbc.php on line 34

エラーのdbc.php on line 34に該当する部分は
$stmt = dbc()->prepare($sql);
の部分です。

該当のソースコード

dbc.php

PHP

1<?php 2 function dbc() 3 { 4 try{ 5 require_once( '../../../core/config.php' ); 6 $dbh = new PDO( DSN, DB_USER, DB_PASS, 7 [ 8 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 9 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 10 ]); 11 return $pdo; 12 } catch ( PDOException $e ){ 13 exit($e->getMessage()); 14 } 15 } 16 17 /** 18 * ファイルデータを保存 19 * @param string $filename ファイル名 20 * @param string $save_path 保存先のパス 21 * @param string $staffname スタッフ名 22 * @param int $shop_id 店舗ID 23 * @return bool $result 24 */ 25 26 function fileSave($filename, $save_path, $staffname, $shop_id) 27 { 28 $result = False; 29 30 31 $sql = "INSERT INTO staff(file_name, file_path, staff_name, shop_id) VALUE (?,?,?,?)"; 32 33 try{ 34 $stmt = dbc()->prepare($sql); 35 $stmt->bindValue(1,$filename); 36 $stmt->bindValue(2,$save_path); 37 $stmt->bindValue(3,$staffname); 38 $stmt->bindValue(4,$shop_id); 39 $result = $stmt->execute(); 40 return $result; 41 }catch(Exception $e){ 42 echo '捕捉した例外: ', $e->getMessage(), "\n"; 43 return $result; 44 } 45 46 47 } 48

file_upload.php(一部抜粋しました)

PHP

1require_once "./dbc.php"; 2if(count($err_msgs) === 0){ 3 //ファイルはあるかどうか? 4 if ( is_uploaded_file( $tmp_path ) ) { 5 if(move_uploaded_file($tmp_path, $save_path )){ 6 echo $filename.'を'.$upload_dir.'にアップしました。'; 7 //DBに保存(ファイル名、ファイルパス、スタッフ名、店舗ID) 8 $result = fileSave($filename, $save_path, $staffname, $shop_id); 9 10 if($result){ 11 echo 'データベースに保存しました。'; 12 }else{ 13 echo 'データベースへの保存が失敗しました。'; 14 } 15 }else{ 16 echo 'ファイルが保存できませんでした。'; 17 echo '<br>'; 18 } 19 echo '<br>'; 20 }else{ 21 echo 'ファイルが選択されていません。'; 22 echo '<br>'; 23 } 24}else{ 25 foreach($err_msgs as $msg){ 26 echo $msg; 27 echo '<br>'; 28 } 29}

データベース

CREATE TABLE IF NOT EXISTS `staff` ( `image_id` int(11) NOT NULL COMMENT 'データのID', `file_name` varchar(255) NOT NULL COMMENT '画像の名前', `file_path` varchar(255) NOT NULL, `staff_name` varchar(140) NOT NULL COMMENT 'スタッフ名', `shop_id` int(11) NOT NULL COMMENT '店舗ID', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日時' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

file_upload.phpでdbc.phpを読み込み、エラーがなかった場合、fileSave関数を使いDBに保存という流れで実行しようと思いました。

試した事

  • DBの接続は確認できました。
  • Xサーバーの指定したフォルダ内に画像は保存されています。

補足情報(FW/ツールのバージョンなど)

phpMMyAdmin
Xサーバー

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

PHP

1 function dbc() 2 { 3 try{ 4 require_once( '../../../core/config.php' ); 5 $dbh = new PDO( DSN, DB_USER, DB_PASS, 6 [ 7 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 8 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 9 ]); 10 return $pdo; 11 } catch ( PDOException $e ){ 12 exit($e->getMessage()); 13 } 14 } 15

PHP

1 return $pdo;

PHP

1 return $dbh;

に変更するとエラーが消えました。ありがとうございました。

投稿2022/09/03 16:02

emi_ono

総合スコア84

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

関数dbc()の戻り値がNULLだから。(書き写し間違いでなければ)

PHP

1return $pdo;

投稿2022/09/03 13:54

編集2022/09/03 13:55
javahack

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

emi_ono

2022/09/03 14:24

javahackさん、ありがとうございます。 $result = $stmt->execute(); return $result; を $result = $stmt->execute(); return $pdo; に変更してみたのですが、同じエラーが出てしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問