🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

3回答

1256閲覧

PHPで関数が正常終了したかステータスを取るプログラム

tomoyuki500219

総合スコア21

PHP

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

0グッド

0クリップ

投稿2021/02/19 00:52

編集2021/02/19 01:25

PHPで関数が正常終了したかステータスを取ることが必要か迷っています
下記マニュアル記載のeixt()で何かできそうな感じもします。
https://www.php.net/manual/ja/function.exit.php

正しい方法(コーディング)、そもそもの考え方をご教示いただけると幸いです。

追記:ステータスコードが必要か迷うコードの一例を記載します。DBからデータを取得してます。

PHP

1public function GetMachineToolData($MysqlToolDataTableName){ 2 3 $MachineToolData; 4 5 try{ 6 $pdo = new PDO(self::DSN,self::USER,self::PASSWORD); 7 }catch(PDOException $e){ 8 echo "MySQL接続エラー: " .$e->getMessage(); 9 } 10 11 $stmt = $pdo->query('select '.$MysqlToolDataTableName . '.id,pkno,tno,gno,tool_name.name,nom,tool_suf.suf_name,sufatr, 12 lengthA,diameter,lifetime,usetime,lifenumber,usenumber,tool_itf.itf,taprfeed,taptype,thrust,horsepower 13 from '.$MysqlToolDataTableName .',tool_name,tool_suf,tool_itf 14 where ' .$MysqlToolDataTableName .'.name=tool_name.t_id 15 and ' .$MysqlToolDataTableName .'.suf=tool_suf.suf_id 16 and '.$MysqlToolDataTableName . '.itf=tool_itf.itf_id 17 order by id desc'); 18 19 $Cnt=0; 20 while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { 21 22 $MachineToolData[$Cnt]=array( $result['id'],$result['pkno'],$result['tno'],$result['gno'],$result['name'],$result['nom'],$result['suf_name'], 23 $result['sufatr'],$result['lengthA'],$result['diameter'],$result['lifetime'],$result['usetime'], 24 $result['lifenumber'],$result['usenumber'],$result['itf'],$result['taprfeed'],$result['taptype'], 25 $result['thrust'],$result['horsepower']); 26 27 $Cnt++; 28 } 29 30 return $MachineToolData; 31 32 }

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

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

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

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

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

m.ts10806

2021/02/19 01:01

eixt? そもそも、どこからどのように実行される前提で、どこで結果を受け取るときの話ですか? それなしに語れるものはないです。 というか結局「決め」の問題になるのでは。 それも要件次第なのでやはり現時点では何も。
m.ts10806

2021/02/19 01:08 編集

ちなみにexitでは関数どころPHPプログラムが終了します。
tanat

2021/02/19 01:13

質問だけだとよくわからないので、中途半端でも良いので想定しているコードを書くと回答が得やすいかと思いますよ。
tomoyuki500219

2021/02/19 01:27

ご回答ありがとうございます 場合による決め、要件の問題で、必要な時に使うもので必須ではないという感じを受けました。 質問本文に関数を1つ載せてみました。
guest

回答3

0

PHPで関数が正常終了したかステータスを取ることが必要か迷っています

まず、exit()は通常のwebアプリケーションで使うことは殆ど無いので、コマンドラインから使用するアプリケーションを作る場合以外は忘れて良いです。

正しい方法(コーディング)、そもそもの考え方をご教示いただけると幸いです。
追記:ステータスコードが必要か迷うコードの一例を記載します。DBからデータを取得してます。

関数の通常仕様としてあり得る場合は関数の呼び出し元で結果から判断します。
通常の仕様としてあり得ない、リカバリーが不可能である場合は例外を使うのが楽です。
PHP エラーハンドリングとかPHP 例外とかで基本的な考えを調べてみると良いです。

例えば質問中のメソッドの場合、ざっと考えて

  1. データが取得できる
  2. 該当するデータが一つもないので取得できない
  3. DBに接続出来ないのでデータが取得できない、SQLが間違っていてデータが取得できない

というケースが考えられます。
1と2については通常あり得るケースなので、呼び出し元側の処理として正しいかどうかは呼び出し元が結果を判断するのが良いでしょう。(=結果を判断しやすいような戻り値を返すと楽です。例えば結果が一つもない場合はnullやfalseを返すとか)

3については、DB接続情報が間違っていたり、DBが死んでいたり、コーディングミスがあったりという呼び出し元としてはどうにもならないものなので処理全体を停止してエラー画面を出すしかありません。
そういう場合には例外をthrowして、呼び出し元でキャッチする様にすると楽です。

  • 例示の場合はechoして握りつぶしているので呼び出し元では問題を検知できません。

例えばこういう関数があったとしたら(try-catchで例外を握りつぶさない)

PHP

1function GetMachineToolData($MysqlToolDataTableName){ 2 3 $MachineToolData; 4 5 $pdo = new PDO(self::DSN,self::USER,self::PASSWORD); 6 7 8 $stmt = $pdo->query('select '.$MysqlToolDataTableName . '.id,pkno,tno,gno,tool_name.name,nom,tool_suf.suf_name,sufatr, 9 lengthA,diameter,lifetime,usetime,lifenumber,usenumber,tool_itf.itf,taprfeed,taptype,thrust,horsepower 10 from '.$MysqlToolDataTableName .',tool_name,tool_suf,tool_itf 11 where ' .$MysqlToolDataTableName .'.name=tool_name.t_id 12 and ' .$MysqlToolDataTableName .'.suf=tool_suf.suf_id 13 and '.$MysqlToolDataTableName . '.itf=tool_itf.itf_id 14 order by id desc'); 15 16 $Cnt=0; 17 while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { 18 19 $MachineToolData[$Cnt]=array( $result['id'],$result['pkno'],$result['tno'],$result['gno'],$result['name'],$result['nom'],$result['suf_name'], 20 $result['sufatr'],$result['lengthA'],$result['diameter'],$result['lifetime'],$result['usetime'], 21 $result['lifenumber'],$result['usenumber'],$result['itf'],$result['taprfeed'],$result['taptype'], 22 $result['thrust'],$result['horsepower']); 23 24 $Cnt++; 25 } 26 27 return $MachineToolData; 28 }

こんな感じで処理をすると、どうにもならない時はとりあえずエラー画面を出しつつ、
正常なケースについてはそれに沿った処理を行えます。

  • ここではPDOExceptionを含む全ての例外をそのままcatchしていますが、例外の種類でエラー画面の表示を変えたい場合などはcatchブロックを複数設定するなりすると良いです。

PHPマニュアル Exceptionをじっくり読んでみて下さい。

PHP

1 2//呼び出し元 3try{ 4 $MachineToolData = GetMachineToolData('テーブル名'); 5 if(count($MachineToolData) > 0){ 6 //データが存在する時の処理を記述 7 }else{ 8 //データが存在しない時の処理を記述 9 //もし一連の処理の流れで必ずデータが存在しないとおかしいようなb 10 } 11 12 13}catch(Exception $e){ 14 //例外をログに吐き出しつつエラー画面を表示 15 16 17} 18

投稿2021/02/19 02:19

tanat

総合スコア18727

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

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

tomoyuki500219

2021/02/19 05:51

丁寧にご回答いただき誠にありがとうございます 今後、必ず意識してコーディングするようにします。
guest

0

ベストアンサー

GetMachineToolData
というメソッド名から、何かしらのデータが取得される機能なので、その成果物を以て、成否を判断されると良いです。
あとはアプリケーションとしての決め事です。
取れなかったときにnullにするのか0にするのかfalseにするのか。
「ベスト」というものはなく、「関数の役割」と「決め事」によって適宜決めるべきものです。それはPHPの標準関数も同じです。

つまり「仕様を決める」こと。
関数を使う方は仕様に則り使うことになるわけですし、関数自体はいつどこから呼び出されるのか知りません。
所定の処理をするだけ。呼び出し元に結果を返すだけ。これもリクエストとレスポンス。

返却値の型宣言をしておくと、より厳格な実装を目指せます。

投稿2021/02/19 01:31

m.ts10806

総合スコア80875

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

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

tomoyuki500219

2021/02/19 01:49

我流だった考えを、正しくプログラムの設計、コーディングをしたくて迷っています。 大変参考になっている感がしています。 実際に戻す方法は戻り値にすればよいものでしょうか? return $MachineToolData,status;のように…。 返却値の型宣言も参考にしてみます。
m.ts10806

2021/02/19 01:52

回答読まれましたか? 「何をもって成否を判断するかは決めてください」が回答の主旨です。 「ベストはない」=「正しいはない」 決めたとおりに動けばそれが正しいです。決めた内容が正しいのかどうかは要件次第です。 関数名と処理で判断できるものではありません。なぜなら関数名も処理も決めた結果の実装だからです。
tomoyuki500219

2021/02/19 01:58

回答読ませていただきましたが、再度、コメントいただき、再認識できた気がします。ありがとうございます
guest

0

不正終了したときに例外処理にとばせば、
実行直後のチェックは正常終了ということでは?

投稿2021/02/19 01:28

yambejp

総合スコア116694

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

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

tomoyuki500219

2021/02/19 01:51

ご回答ありがとうございます アドバイスいただいた通りだとは思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問