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

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

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

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

Q&A

解決済

3回答

7953閲覧

PHP try catch エラーが表示されない

s.kono

総合スコア37

PHP

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

0グッド

0クリップ

投稿2016/10/14 04:41

編集2016/10/14 04:52

PHP5.3.3
エラーがCatchに入って来ません。
データベース名に間違ったデータベース名を入れて呼び出します。
TestServerをTetServerといれる。

結果は
こんにちは1こんにちは2
になります。

データベース名を正しく入れますと
こんにちは1こんにちは2こんにちは3
まで出力されます

次にinsertのsql文を実行するfunctionにわざと間違ったカラム名を使います。ageをagといれる。

結果は
こんにちは1こんにちは2こんにちは3
となります。

もちろん正しく入れれば正常に動作するコードです。
エラーがcatchされることなく処理がそこで終わってしまいます。
「データベース名が見当たりません」や「カラム名が見つかりません」のようなエラー表示を期待していたのですか・・
どんなエラーだとcatchされるのでしょうか?

呼び出し側

echo 'こんにちは1'; require_once __DIR__ . "/../../autoload.php"; echo 'こんにちは2'; use YCom\dbclass\SqlCommon; $GDb = new SqlCommon('TetServer'); echo 'こんにちは3'; $sql = "insert into M_TEST (name,address,ag,date) values (:name,:address,:ag,:date);"; $data['name']='五郎丸'; $data['age']=30; $data['address']='ニュージランド'; $dd = new DateTime(); $data['date']=$dd->format('Y-m-d H:i:s'); $GDb->insQuery($sql,$data); echo 'こんにちは4';

呼ばれる側

<?php namespace YCom\dbclass; use PDO; Class SqlCommon { private $cn; public function __construct($DbName) { $dsn="mysql:dbname={$DbName}; host=localhost"; $usr='usr'; $passwd='usrpasswd'; $options = array( PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf', PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ); try{ $this->cn=new PDO($dsn,$usr,$passwd,$options); } catch (PDOException $e) { header('Content-Type: text/plain; charset=UTF-8', true, 500); exit($e->getMessage()); } } public function insQuery($sql,$data) { $stmt = $this->cn-> prepare($sql); foreach ($data as $key => $val) { $stmt->bindValue(':' . $key, $val); } try{ $stmt -> execute(); echo("追加実施しました"); }catch (Exception $e) { echo("追加実施できません"); exit("Can't insert ERROR!".$e -> getMessage()); } } }

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

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

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

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

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

guest

回答3

0

ここのページが参考になるかも。
http://piyopiyocs.blog115.fc2.com/blog-entry-657.html

投稿2016/10/14 05:07

ttyp03

総合スコア16998

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

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

s.kono

2016/10/14 05:32

参考サイトのご紹介ありがとうございます。ここでの内容を検証してみます。 PDOの引数の渡し方がPHPのバージョンで違ったりするのかもしれないと思ったり・・
guest

0

自己解決

接続時にエラー出力の設定をインスタンスにしたので、その後同じクラス内のfunctionの中でエラー出力の設定が必要だと思いませんでした。ですが、prepareの前にsetAttributeが必要でした。
また、use PDOをクラスの先頭に書いたので「\」は不要化と思っていましたが\PDOExceptionと前に必要でした。
丁寧になんども応対して下さり知らないことをいろいろ教えてくださった回答者の皆様ありがとうございました。

public function insQuery($sql,$data) { try{ $this->cn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $stmt = $this->cn-> prepare($sql); foreach ($data as $key => $val) { $stmt->bindValue(':' . $key, $val); } $stmt -> execute(); echo("追加実施しました"); }catch (\PDOException $e) { echo("追加実施できません"); exit("Can't insert ERROR!".$e -> getMessage()); } }

投稿2016/10/14 07:51

編集2016/10/14 07:53
s.kono

総合スコア37

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

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

0

他の部分でPHPエラーとかでてないですか?
PHPエラーを非表示にしているなら、以下を最初に実行するようにして、表示して確認してください。

php

1error_reporting(E_ALL);

自分の環境で動かすと、PDO::MYSQL_ATTR_READ_DEFAULT_FILEというパラメータが不正といわれましたけど

投稿2016/10/14 05:12

popobot

総合スコア6586

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

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

s.kono

2016/10/14 05:28

回答ありがうございます。 PHPのバージョンによって文字コードの設定するためのコードでclientに対するutf8設定であり、my.cnfが効かないため ver5.3.5以前にのみ対応と参考サイトにありました。私の環境ですと下のいずれかの設定をするほか無いようなのです。 PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf', PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', また、error_reporting(E_ALL); を呼び出し側に追加して実行しましたが特に何もエラーは出ませんでした。
popobot

2016/10/14 05:50

PHP5.3.3だったんですね...失礼しました。 PHP7では、PDO::MYSQL_ATTR_READ_DEFAULT_FILEを外したら例外がキャッチできたので、PDOの設定がPHP5.3.3だと違うのかもしれませんね
popobot

2016/10/14 05:54

ちなみに、接続以外の部分でエラーが起きた場合はExceptionが発生するのでしょうか?
s.kono

2016/10/14 06:36

アドバイスありがとうございます。PHP5.3.3だと引数の渡し方が違うのかと思い、 $this->cn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); などと手法を変えてみましたが同じ結果にしかなりませんでした。 queryのエラーもPDOExceptionは発生しません。PHPレベルのエラーについて検証してみます
s.kono

2016/10/14 06:50

次のコードでもエラーが出力されず、しかも止まらず、「こんにちは2」と出力されてしまいました。もちろん存在しないファイルです try{ $file = fopen('tt.txt','ab'); }catch(Exception $e){ $e->getMessage(); } こんにちは2
popobot

2016/10/14 06:55

PHPの基本的な関数はエラーが起きてもExceptionは発生しません。代わりにPHPエラーがでます。このエラーは致命的(FATAL)なものを除いて発生しても処理止まることはありません。なお、PHPエラーはphp.iniなど設定によって、出力するかどうか制御できます。 またはerror_reporting(E_ALL);とかを実行すると動的に出力できるように変更できます。 http://php.net/manual/ja/function.error-reporting.php
s.kono

2016/10/14 07:27

いろいろ教えてくださりありがとうございます。 catch (\PDOException $e)と\を入れたら接続時には SQLSTATE[42000] [1049] Unknown database 'TetServer' とエラーが表示されるようになりました。 クラスの中にuse PDOと追加したので\は不要かと思っていました。 また、一度つけてやった時はなぜか他のミスでなのかエラー表示されなかったので違う点ばかりチェックしていました。 ただ、カラム名違いの方はcatchされませんでしたのでもう少し考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問