dポイントプレゼントキャンペーン実施中!

現在htmlのフォームから、時間を入力して、その値に”時~”をつけて
9時~と言うような、感じでmysqlに登録したいのですが、

php5.0.4にて下記のように普通に値を代入すると、登録されるのですが、
これをfunction関数を使用すると、値が入力されません。
何が悪いのでしょうか?よろしくお願いいたします。

$mon0 = $_POST['mon0'];
if ($mon0 != ""){
$mon0 .="時~";
}

function work_time ($aaa,$bbb){
$aaa = $_POST[$bbb];
if ($aaa != ""){
$aaa .="時~";
}
}
work_time ($mon0,"mon0");

A 回答 (3件)

No.2へのお礼内の質問に対しての回答です。



$aaaへ"時~"を代入し、それを関数の外でも使おうとするため、参照渡しが必要になります。

値渡しの場合呼び出し元の変数から関数の引数へ値が代入されて渡されます。
関数を使わないとするとwork_time ($mon0,"mon0")の部分は

$aaa=$mon0;
$bbb="mon0";
$aaa = $_POST[$bbb];
if ($aaa != ""){
$aaa .="時~";
}

このような構文と等価になります。
これ以降で$mon0を使ったとしても、"時~"が追加されてるのは$aaaなので、値が変更されていないことになります。

一方参照を使った場合のwork_time ($mon0,"mon0")の部分は

$bbb="mon0"; //$bbbは参照を使わないとする
$mon0 = $_POST[$bbb];
if ($mon0 != ""){
$mon0 .="時~";
}

と等価の構文になります。関数内で名前が$aaaになっていますが、使われるのは$mon0の内容なので$mon0が変更され以降の行で$mon0を使った場合にも変更された値が使用できます。
また、上の文では$bbbは参照渡しにしていないので値が代入されていますが、関数内で$bbbの内容を変更していないので問題ありません。

参照渡しで呼び出し元の変数の値を変更できる利点は、関数で呼び出し元の変数の値を変更されてしまうという欠点もあるので、使用する場合には注意してください。
(今回の例であれば、関数呼び出し前に$mon0に入っていた内容は、関数内で上書きされて消えます)

例示の文にあんまり変更を加えずに回答しようとしてしまったため参照渡しで回答しましたが、実際私が自分で書く場合であれば、$aaaの値を戻り値で戻すように書きます。関数を

function work_time($bbb){
$aaa = $_POST[$bbb];
if ($aaa != "") {
$aaa .="時~";
}
return $aaa;
}

として、使うときは、
$mon0 = work_time("mon0");
とします。

戻り値を使ったほうがどこで$mon0を変更してるか分かりやすくなると思います。
    • good
    • 0
この回答へのお礼

kabinett 様

迅速な回答と丁寧な返答有難う御座いました。<(_ _)>
とても勉強になりました!
機会がありましたら、またよろしくお願いいたします。

お礼日時:2005/10/15 19:29

引数が値渡しになっているため、呼び出し元の変数(この場合は$mon0)の値は変更されません。


Function側で呼び出し元の変数の値を変更したい場合は、引数を参照渡しにしましょう。

function work_time (&$aaa,$bbb){ //$aaaの前に&を追加
$aaa = $_POST[$bbb];
if ($aaa != ""){
$aaa .="時~";
}
}
work_time ($mon0,"mon0"); //こっちは変わらない
    • good
    • 0
この回答へのお礼

kabinett 様

有難う御座いました。
今回は、$aaaに”時~”を代入しているから、
参照渡しにしないと駄目と言う事でしょうか?

お礼日時:2005/10/15 13:34

これでどうでしょう?



function work_time($bbb){
$aaa = $_POST[$bbb];
if ($aaa != "") {
$aaa .="時~";
}
}

work_time("mon0");

この回答への補足

この場合は、どこで$aaaに値を代入するのでしょうか?

補足日時:2005/10/15 13:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!