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

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

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

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

PHP

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

解決済

beginTransactionのエラー:特定のファイルにだけ発生する原因

TakahashiManabu
TakahashiManabu

総合スコア0

MySQL

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

PHP

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

2回答

0評価

0クリップ

46閲覧

投稿2018/03/06 06:06

編集2022/01/12 10:58

お世話になります。

あるシステムの開発をPHPベースでしておりまして、特定のクラスファイル(Aとします)において、あるメソッドを実行すると「Fatal error: Call to a member function beginTransaction() on null in・・・」というエラーが出ました。

そこで実行されているSQL文を別のクラスファイル(Bとします)に移し、そのオブジェクトのメソッドとして実行すると正常に処理されます。

そうすると、Aのクラスファイル原因がありそうですが、Aのクラスには別のメソッドも明記されており、それらは正常に機能します。

特定のクラスファイルにおいてのみ、特定のメソッドがエラーとなり、それは別のクラスファイルにおいてなら実行可能であるというような状況だとすると、どのような原因でそうなるのかが分からず苦労しております。ちなみに、Aのクラスファイルも、Bのクラスファイルも、ベースとなるファイルを継承し、pdo接続を可能としております。

ソースを提示したいのですが、とてつもなく膨大でどこまで記載すればよいかわからず、ここまでの状況を取り急ぎ報告いたします。もし、上記のエラーコードが発生する原因にお心当たりがあれば、ご教示いただけますと幸いです。

追記いたしました

下記に簡単ながらコードを記述いたします。
はじめにコントローラーとなるクラスファイルです。

PHP

//コントローラーA <?php class controllerA extends BaseController{ public function __construct(){ $this->fileModel = new fileModel(); $this->transact = new transactModel(); $this->mailer = new mailerModel(); $this->systemModel = new systemModel(); } function methodCA(){ if(isset($_FILES['file']['name'])){ $file = $_FILES['file']['name']; //ステータスコードがあればファイルチェックメソッドに移行 if(isset($_GET['statusCode']) && $_GET['statusCode']!=''){ //ファイルチェック list($inspectedResult,$message) = $this->fileModel->fileInspection($file,$_GET['statusCode']); //ファイルチェックを通過 if($inspectedResult == TRUE){ $filename = substr($file,0,9); //格納ディレクトリを指定 $dir = _UPLOAD_DIR.'manuscripts/'.$filename.'/'; //ファイル名を変更 - ハッシュ値へ $filehash = hash_file("sha1",$_FILES["file"]["tmp_name"]); //ファイルを格納 $this->fileModel->storeFile($filename,$dir,$filehash); echo '<p>'.$message.'</p>'; //ファイルアップロード情報の記録:**このメソッドがうまく機能しないのです** $this->fileModel->registerFileHistory($filename,$filehash,$_FILES['file']['name'],$_GET['statusCode'],CURRENT); //ステータスコードを変更する手続きへ $this->transact->proceedStatusCode($_GET['statusCode'],$filename); }else{ //ファイルチェックの結果、不適切だと認められた場合 echo '<p>'.$message.'</p>'; } } }else{ echo "ファイルがない・・・"; } } }

次にモデルを司るクラスファイルです。

PHP

class fileModel extends BaseModel{ //このメソッドを実行するとエラーになります。 public function registerFileHistory($articleID,$vName,$aName,$statusCode,$date){ $this->pdo->beginTransaction(); try{ $sql="INSERT INTO cl_file_inventry(articleID,virtualFileName,actualFileName,statusCode,dateUpdated) VALUES (:ID,:vName,:aName,:statusCode,:date)"; $stmh=$this->pdo->prepare($sql); $stmh->bindValue(':ID',$articleID,PDO::PARAM_STR); $stmh->bindValue(':vName',$vName,PDO::PARAM_STR); $stmh->bindValue(':aName',$aName,PDO::PARAM_STR); $stmh->bindValue(':statusCode',$statusCode,PDO::PARAM_STR); $stmh->bindValue(':date',$date,PDO::PARAM_STR); $stmh->execute(); $stmh->closeCursor(); $this->pdo->commit(); }catch(PDOException $Exception){ $this->pdo->rollBack(); print "エラー:".$Exception->getMessage(); } } } //・・・・以下、いくつかのメソッド

最後に、ベースとなるモデルファイルです。

PHP

<?php class BaseModel{ protected $pdo; public function __construct(){ $this->db_connect(); } //---------------------------------------------------- // データベース接続 //---------------------------------------------------- private function db_connect(){ try { $this->pdo = new PDO(_DSN, _DB_USER, _DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`") ); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); }catch(PDOException $Exception){ die('エラー :' . $Exception->getMessage()); } } } ?>

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

MySQL

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

PHP

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