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

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

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

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

Q&A

解決済

4回答

16965閲覧

Fatal error: Uncaught Error: Using $this when not in object context in ~のエラーを回避したい

chibi144

総合スコア64

PHP

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

0グッド

0クリップ

投稿2017/11/07 02:50

編集2017/11/07 04:00

###前提・実現したいこと
MVCとクラスについて勉強中です。
とりあえずModel部分を作ろうとしています。
DB接続とデータ加工までをModelでやって、controllerで呼び出せるようにしたいです。

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

Fatal error: Uncaught Error: Using $this when not in object context in Model.php:53 Stack trace: #0 controller.php(11): DBconnect::getList() #1 {main} thrown in Model.php on line 53

###該当のソースコード

php

1 2if(isset($_POST['item_id'])){ 3 $input_item_id = $_POST['item_id']; 4} else{ 5 $input_item_id = null; 6 //★エラーを表示させる? 7} 8if(isset($_POST['type'])){ 9 $input_item_type = $_POST['type']; 10} else{ 11 $input_item_type = null; 12 //★エラーを表示させる? 13} 14if(isset($_POST['maker'])){ 15 $input_item_maker_id = $_POST['maker']; 16} else{ 17 $input_item_maker_id = null; 18 //★エラーを表示させる? 19} 20 21class DBconnect 22{ 23 public $db; 24 private $host = 'xxx'; 25 private $dbname = 'xxx'; 26 private $dbuser = 'xxx'; 27 private $password = 'xxx'; 28 29 public function __construct() 30 { 31 $dsn = sprintf( 32 'mysql:host=%s;dbname=%s;charset=utf8', 33 $this->host, $this->dbname 34 ); 35 try{ 36 $this->db = new PDO($dsn, $this->dbuser, $this->password); 37 } catch (PDOException $e) { 38 header('Content-Type: text/plain; charset=UTF-8', true, 500); 39 exit($e->getMessage()); 40 } 41 } 42 43 // 商品リスト取得 44 public function getList() 45 { 46 $sql = 'SELECT * FROM data where data.id = ?'; 47 $stmt = $this->db->prepare($sql); //ここでエラーが出ます 48 $stmt->execute(['sample']); 49 $rows = $stmt->fetchAll(); 50 return $rows; 51 } 52}

php

1include(dirname(__FILE__) . "/model.php"); 2new DBconnect; 3DBconnect::getList();

###試したこと
$stmt = $this->db->query($sql)
⇒ $stmt = self::$db->query($sql)
と書き換えてみましたが、Access to undeclared static propertyと怒られました。

###補足情報(言語/FW/ツール等のバージョンなど)
PHP7.1.8

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

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

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

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

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

guest

回答4

0

DBconnect::getListstaticでないメソッドなので、オブジェクトから呼ぶ必要があります。

php

1$conn = new DBconnect; 2$conn->getList();

投稿2017/11/07 02:58

maisumakun

総合スコア145121

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

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

chibi144

2017/11/07 03:04

ありがとうございます。 ご提示頂いたとおりにcontroller側を書き換えたら無事動きました。
guest

0

ベストアンサー

勉強中ということなので、こちらを紹介します。
PHP7 で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計 / PHP Conference 2016

「責務の再配置」あたりを参考にしてください。
もちろん、その他の部分も重要です。

ちなみに、質問には直接関係ないです^^;

投稿2017/11/07 04:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chibi144

2017/11/07 04:48

ありがとうございます。 さっそくhost以下を外に出しました。
退会済みユーザー

退会済みユーザー

2017/11/07 05:00

「戻り値の弱点」以降もサクッと読んでください。 このスクリプトには setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); がないので、意図した動作を行っていないです。
退会済みユーザー

退会済みユーザー

2017/11/07 05:04

と思ったけど、 getList() で、try catch してないからちゃんと動くかも^^; でも、getList() もちゃんと try catch で記述してあげましょう!
chibi144

2017/11/07 05:31

ひとまず外部に出した部分は下のとおりです。 $conf = array( 'host' => 'xxx, 'dbname' => 'xxx, 'dbuser' => 'xxx', 'password' => 'xxx', ); $dboption = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ); $dsn = sprintf( 'mysql:host=%s;dbname=%s;charset=utf8', $conf['host'], $conf['dbname'] ); $pdo = new PDO($dsn, $conf['dbuser'], $conf['password'],$dboption); $repo = new dataExport($pdo) >>getList() もちゃんと try catch で記述してあげましょう! コンストラクタでtry catchしている分が getList()まで生きていると思っていたのですが、 具体的にはどんな風に書けばいいのかアドバイス頂けないでしょうか。
退会済みユーザー

退会済みユーザー

2017/11/07 05:47

「findALLメソッドの契約」に参考になる記述があります。 多分、まだ全体を読んでいない状態で質問していると思うので、調べながら読み込むとイイですよ。 私は最初にこの資料を見た時に衝撃を受けましたw ちなみに、 setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); の記述がない場合、 catch (PDOException $e) で拾える範囲は、かなり限定されます。 http://php.net/manual/ja/pdo.error-handling.php ちょっと長いですけど、この辺も参考にすると良いです。 http://php.net/manual/ja/pdo.error-handling.php
guest

0

staticで呼び出したいのかオブジェクトから呼びたいのかがはっきりしていないと思います。
DBconnectの$thisを活きとしたいなら下記のように書くべきですね。

php

1$d = new DBconnect; 2$d->getList();

ただ、これだけでは「Fatal error」が残りますが、それはまた別問題ということで。

追記:
Model.php 53行目とのことですが、提示されたDBconnectのソースは33行程度しかないですよね。
Model.php ソース全体も提示されたほうが良いかと思います。

投稿2017/11/07 03:00

編集2017/11/07 03:04
m.ts10806

総合スコア80765

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

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

chibi144

2017/11/07 04:01

追記しました。 まるっと関係ないので割愛しておりましたが、確かに紛らわしかったですね。
m.ts10806

2017/11/07 07:54

私の回答のみではまだちゃんと解決に至れていないようなので一度ベストアンサーを外されては?
chibi144

2017/11/07 08:44

ご指摘ありがとうございます。 そのようにさせて頂きます。
guest

0

Model.php:53行目が問題の箇所だと思いますが、DBConnect=Model.phpでしょうか?

Model.php の 53行目を確認してみましょう。

投稿2017/11/07 02:55

ykws

総合スコア1236

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問