スレッド表示 | フラット表示〕 全トピック 920 件中 222 番目 次≫ ≪前

ユーザー定義関数

created: 2006-07-10 19:05 | modified: 2006-07-11 09:04 | reply: 4

[3151] ユーザー定義関数

user: volks | created: 2006-07-10 19:05
度々ですがよろしくお願い致します。

今、ユーザー定義の関数でメインのプログラムを簡素化していこうとしているのですが(関数は別ファイルではなく同じファイルの下へ書いています)、関数が全く理解できずに困っています。

入力フォームの入力チェックの処理を関数で書きたいのですが、

---[以下入力チェック]-------------------------------

if (strlen($subject)== 0) {
$errorMessage.= '[件名]';
$errorFlag1 = 1;
}
elseif(strlen($subject) >= 30){
$errorMessage2.= '[件名]';
$errorFlag2 = 1;
}
if (strlen($message)== 0) {
$errorMessage.= '[本文]';
$errorFlag1 = 1;
}
elseif(strlen($message) >= 100){
$errorMessage2.= '[本文]';
$errorFlag2 = 1;
}

//ここで表示メッセージ文を作成

if($errorFlag==1){
$errorMessage.= 'が入力されていません';
}

if($errorFlag2==1){
$errorMessage2.= 'を正しく入力してください';
}

//ここからメッセージの表示処理をします

if ((strlen($errorMessage)>= 1)&&(strlen($errorMessage2)== 0)){
$errm = $errorMessage;
error_m($errm);
}

if (strlen($errorMessage)>= 1){
$errm = $errorMessage.'<br>'.$errorMessage2;
error_m($errm);
}
if (strlen($errorMessage2)>= 1){
$errm = $errorMessage2;
error_m($errm);
--------------------------------------------------
以上の所なのですが、
まずどこで区切れば良いのか?
そしてどういう処理(引数やデータのやり取り)をすれば良いのか分かりません。
私の考える範囲では、最初の「件名」と「本文」の入力チェックを関数化し、$errorMessage・$errorMessage2・$errorFlag1・$errorFlag2 の4つの値を受取る方法が出来るのかな?という想像ぐらいです。

長くなりましたが、ここで考えられる良い方法がありましたら、
ご教授頂ければと思います。
いつもあつかましい質問ばかりですいません。
どうか是非よろしくお願い致します
reply: 3154 返信 編集 削除

[3154] 私ならですが

user: ach | created: 2006-07-10 22:24
checkInput.fnc.php
define('CHECK_OK',0);
define('CHECK_EMPTY',1);
define('CHECK_OVER',2);

function checkInput($subject, $message)
{
$errorMessage[checkInputLen($subject, 30)][] = '[件名]';
$errorMessage[checkInputLen($message, 100)][] = '[本文]';

$errorAppendMessage = array(
CHECK_EMPTY => 'が入力されていません',
CHECK_OVER => 'を正しく入力してください',
);

unset($errorMessage[CHECK_OK]);
foreach ($errorMessage as $enum => $array)
$errorMessage[$enum] = implode('', $array).@$errorAppendMessage[$enum];

if (count($errorMessage) == 0) return TRUE;
error_m(implode('<br>', $errorMessage));
return FALSE:
}

function checkInputLen($str, $maxLen)
{
$length = strlen($str);
if ($length == 0) return CHECK_EMPTY;
if ($length >= $maxLen) return CHECK_OVER;
return CHECK_OK;
}

かな?
関数化するメリットがあるのは文字列長のチェックだけだと思います.(実際そこしか関数化していません)

じゃあ何でこんなにコードがごろっと変わっているのかというと,volksさんのコードに関数化に向かない部分があるからです.

具体的には$errorFlagと$errorMessageが二つある点です.
function checkInput($str, $max, $type, &$errorMessage, &$errorMessage2, &$errorFlag1, &$errorFlag2)
とかすれば何とかなりますが……ちょっと面倒

それに,メッセージ表示処理をifで分岐していますが,あれもいただけません.
チェック項目が一つ増えたら分岐は2倍になりますから,書き直す手間をかんがえると……

というわけで全部書き直したわけです.(怒らないでくださいね)

今回の関数化の指針は
・変数が変わっているだけで繰り返している部分を関数にする
・チェック関数はエラーコードのみを返す(defineを使うのも含めて常套手段)
・関数にはあまり多くのことを詰め込まない


それでは,簡略化がんばってください
Parent: 3151  reply: 3155 返信 編集 削除

[3155] 有難うございます

user: volks | created: 2006-07-10 23:12
ach様 有難うございます。

本当に勉強になります。まず、関数化の指針ですが、今回関数を作るにあたって、何の値を取ってどうするのか、というか何をしたいのかさえ分からず、混乱しました。
この指針を今後の参考にさせて頂きます。

>具体的には$errorFlagと$errorMessageが二つある点です

私も今回この4つの値をまとめて処理する事に意味があると、それに捕らわれて混乱してました。もっと簡単な処理から関数を学んで行くべきでしたかね。

正直、ach様の書いてくださったコードは私には高度すぎて、知らない関数もあり、すぐには解読できそうにないです。涙

明日から一つ一つ調べて勉強させて頂きます。
また同じ様な質問をさせて頂くかもしれませんが、その時は是非よろしくお願い致します。有難うございます!!
Parent: 3154  reply: 3156 返信 編集 削除

[3156] すみません(汗

user: ach | created: 2006-07-10 23:40
気に入らないところとか編集しているといつのまにか返信がorz

>高度すぎて、知らない関数もあり、すぐには解読できそうにないです。涙
確かにこのコードは読みにくいかもしれません.(高度ではないですが)
見た目重視で書きましたし(w 

このコードで重要(便利)な関数はunset, implodeですね.
それと配列の使い方にも目を通すといいかも.
それでこのコードは大体わかります.
Parent: 3155  reply: 3157 返信 編集 削除

[3157] ご丁寧に有難うございます。

user: volks | created: 2006-07-11 09:04
>このコードで重要(便利)な関数はunset, implodeですね

了解しました。まずここから調べていきます。
って知らない関数でした。。。笑

>それと配列の使い方にも目を通すといいかも。

おっしゃる通りで、まだ配列の考え方というか理解がぜんぜんできてません。配列の例は非常に参考になります。
有難うございます。いろんな書き方が考えられるんだなーって思いました。まずは解読する所からですが、勉強させていただきます。
本当に有難うございます。
Parent: 3156  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 222 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑