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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

1回答

1174閲覧

クラス化した場合、PDOExceptionに例外処理がthrowされない

pegy

総合スコア243

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2021/08/07 14:26

編集2021/08/07 14:26

下記の通り、PDOをクラス化して利用したいと考えております。
ここで、クラス側でtry-catchをしており、MYSQLでシンタックスエラーが発生している場合には、return "error"; //hereによって、とりあえず内容に関わらずerrorの文字列を取得する様な仕組みを検討しております。
ここで
$sql ="SELECT * FROM sample_table";でわざとシンタックスエラーを起こして
$sql ="SELECTT * FROM sample_table";
の様にして$resultにerrorを返すことを期待したのですが、Internal Server Error 500がブラウザヘッダーに返ってくる結果となり、クラスを通して例外が正しくthrowされていないことがわかりました。

例えばこの様な記事も拝見し、PDOをクラス化して利用する場合でも、クラスの中でtry-catchして例外処理を取得すること自体は問題がないと考えたのですが、期待する結果が得られない原因と解決方法についてアドバイスをいただけますでしょうか?
よろしくお願い申し上げます。

php

1require_once("51_class.php"); 2 3$use_pdo_query = new pdo_query("sample_db"); 4$sql ="SELECT * FROM sample_table"; 5$result = $use_pdo_query -> select($sql_get_latest_content); 6var_dump($result);//正しく出力されることを確認

php

1//class.php 2class pdo_connect 3{ 4 protected $DB_NAME; 5 protected $HOST='localhost:8889'; 6 protected $UTF='utf8'; 7 protected $USER='root'; 8 protected $PASS='root'; 9 10 function __construct($x) { 11 $this->DB_NAME = $x; 12 } 13 14 public function pdo(){ 15 $dsn="mysql:dbname=".$this->DB_NAME.";host=".$this->HOST.";charset=".$this->UTF; 16 $user=$this->USER; 17 $pass=$this->PASS; 18 try{ 19 $pdo=new PDO($dsn,$user,$pass, 20 array( 21 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 22 PDO::ATTR_EMULATE_PREPARES => false, 23 ) 24 ); 25 }catch(PDOException $e){ 26 header('Content-Type: text/plain; charset=UTF-8', true, 500); 27 exit($e->getMessage()); 28 } 29 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 30 return $pdo; 31 } 32} 33 34class pdo_query extends pdo_connect 35{ 36 public function select(string $sql){ 37 $pdo_q=$this->pdo(); 38 $pdo_q->beginTransaction(); 39 try{ 40 $stmt=$pdo_q->query($sql); 41 $items=$stmt->fetchAll(PDO::FETCH_ASSOC); 42 $pdo_q->commit(); 43 return $items; 44 }catch (PDOException $e){ 45 // return $e->getMessage(); 46 return "error"; //here 47 } 48 } 49}

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

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

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

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

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

tanat

2021/08/07 16:13

まずはエラーログを確認して、正確なエラー内容を質問に追記してください
m.ts10806

2021/08/07 23:04

> Internal Server Error 500がブラウザヘッダーに返ってくる結果となり、クラスを通して例外が正しくthrowされていないことがわかりました。 正しく例外throwされてるから500になってるのでは。 自身で書かれてますよね。 header('Content-Type: text/plain; charset=UTF-8', true, 500);
pegy

2021/08/08 15:28

コメントありがとうございます、そちらのcatchではなく後半のcatchです。 catch (PDOException $e){ // return $e->getMessage(); return "error"; //here } ここでは header('Content-Type: text/plain; charset=UTF-8', true, 500);ではなくreturn "error";を要求しているのですが、当初それが返ってこないということをご質問させていただきました。
m.ts10806

2021/08/08 19:20

で、あればなぜ現状で解決なのでしょうか。エラーハンドリングの組み方が間違ってると思うのですけど。
guest

回答1

0

ベストアンサー

diff

1 try{ 2 $pdo=new PDO($dsn,$user,$pass, 3 array( 4 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 5 PDO::ATTR_EMULATE_PREPARES => false, 6 ) 7 ); 8 }catch(PDOException $e){ 9 header('Content-Type: text/plain; charset=UTF-8', true, 500); 10- exit($e->getMessage()); 11+ die($e->getMessage()); 12 } 13 $pdo->se

投稿2021/08/07 15:05

phper.k

総合スコア3923

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

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

pegy

2021/08/07 15:15

コメントありがとうございます。 exit()をdie()に変更しても、特に変化はなかったのですが、 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); を削除すると実行することができました。 該当箇所意図と異なる場合は申し訳ございません。
phper.k

2021/08/07 16:48 編集

そっちの try ~ catch のはなしかよ
pegy

2021/08/08 22:21

紛らわしい質問の内容で申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問