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

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

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

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

Q&A

解決済

3回答

1052閲覧

PHPにおける関数での処理の流れを理解したいです。

takub

総合スコア15

PHP

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

0グッド

1クリップ

投稿2018/08/22 03:05

前提・実現したいこと

書籍でPHPを勉強しており、
関数の分野でわからない点があり質問させていただきました。

下記の書籍で勉強中です。
「気づけば プロ並み PHP」
http://www.ric.co.jp/book/contents/book_926.html

発生している問題・エラーメッセージ

エラーは出ていないのですが、理解を深めたいと思います。

エラーメッセージ

### 該当のソースコード ```php ※関数部分 function sanitize(**$before**) { foreach($before as $key=>$value) { $after[$key]=htmlspecialchars($value,ENT_QUOTES,'UTF-8'); } return **$after**; } ※実行部分 $post=sanitize($_POST);

試したこと

$_POSTで受け取ったデータ→関数の実行(エスケープ)→返り値を$postに。
上記のようなざっくりと処理の流れは理解できるのですが、
「$before」 「$after」 の部分が理解できません。

・sanitizeの引数がなぜ「$before」という変数に設定されているか。
($_POSTで受け取ったデータ)

・返り値をなぜ「$after」という変数に入れているか。

・両方とも実行部分では「$before」 「$after」という変数は出てきていないのになぜ動くのか。

補足情報(FW/ツールのバージョンなど)

初歩的な質問になり恐縮ですが、ご教授いただければ大変助かります。

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

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

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

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

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

guest

回答3

0

・sanitizeの引数がなぜ「$before」という変数に設定されているか。
・両方とも実行部分では「$before」 「$after」という変数は出てきていないのになぜ動くのか。

数学で、F(x)=x+3 という関数があり、その関数を F(2) とか F(a) とか使うときには、xという文字が出てこないのに計算できるのは何故?というのと同じ質問です。

・返り値をなぜ「$after」という変数に入れているか。

ループで何回か回る処理で、処理結果の累積をするために何か名前の付いた保存場所が必要という理由で、変数を使っています。名前はたまたまです。

ところで、このプログラムはその本に載っていたのでしょうか?
これは、セキュリティについてよく分かっていない人が書いたプログラムです。
Amazonの書誌情報を見ると、徳丸さんが協力となっているので、そんなことは無いと思うのですが。って、それは改訂版か。
・・・・・・と、出版社の改訂版のページを見ると、

Webセキュリティ第一人者の協力を得て、サンプルソースの安全性も高めました。

と書いてある。コードを参考にするなら、改訂版を買い直した方が良いかもしれません。

投稿2018/08/22 04:38

otn

総合スコア84499

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

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

takub

2018/08/22 05:02

ご回答いただき誠にありがとうございます。 ご指摘いただいたおかげで、理解ができました! お忙しい中、ありがとうございます。 また、書籍に関してアドバイスもありがとうございます。 改定版なのですが、分かりやすさを優先しているとのことです・・・。 セキュリティに対しては、違う本で学んでみようと思います!
guest

0

$_POSTはスーパーグローバル変数なので$beforeで渡さなくてもいいですね
もちろん汎用性を狙ってのことだと思いますが

また$beforeやその要素である$valueが必ず配列である保証はありませんので
実装の際にはそれぞれをチェックする処理が必要になります

投稿2018/08/22 03:54

yambejp

総合スコア114769

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

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

takub

2018/08/22 05:04

ご回答いただき誠にありがとうございます。 汎用性を狙った作りなのですね、、 アドバイス誠にありがとうございました!
guest

0

ベストアンサー

・sanitizeの引数がなぜ「$before」という変数に設定されているか。
($_POSTで受け取ったデータ)

別に変数名なんて何でもいいんですけど、
わかりやすくしたんだと思います。

・返り値をなぜ「$after」という変数に入れているか。

別に変数名なんて何でもいいんですけど、
わかりやすくしたんだと思います。

・両方とも実行部分では「$before」 「$after」という変数は出てきていないのになぜ動くのか。

function sanitize($before)
の記述で変数名beforeで受け取るよ、と宣言しています。
また、$afterに関しては、本来foreach()ループに入る前に
$after = array(); などと初期化するべきものです。
php.iniなどの設定次第では、Noticeが出力されます。
でも、
$after[$key]=htmlspecialchars($value,ENT_QUOTES,'UTF-8');
の記述で$afterが配列であると判断されて動作します。

もうちょっと直すと、

php

1function sanitize($before) { 2 if (is_array($before)) { 3 $after = array(); // []; でもよい 4 foreach ($before as $key=>$value) { 5 $after[$key] = htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); 6 } 7 return $after; 8 } 9 else { 10 return htmlspecialchars($before, ENT_QUOTES, 'UTF-8'); 11 } 12}

sanitizeというユーザー関数の宣言として、
一つの引数をとり、
その変数名を$beforeにしています。
$beforeが配列であるなら、
foreach()ループで順次キーと値のセットを取り出しています。
$afterに$beforeから取り出すキーを使って値を加工したものを格納しています。
それを最後にreturn文で返しています。
配列でないならば、単に加工したものをreturn文で返しています。

もしも、関数の外で$before$afterが使われていても、
sanitizeで使っているそれとは関わりがありません。

投稿2018/08/22 03:47

編集2018/08/22 04:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takub

2018/08/22 05:10

回答いただきまして誠にありがとうございます。 また、大変ご丁寧に解説していただきまして本当にありがとうございます。 どのように処理が行われるか、おかげさまでよく理解することができました! foreachを使うときに、$after = array();で最初に定義すべきという部分が、自分自身見落としておりました・・! この度はご丁寧に教えていただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問