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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

2552閲覧

cakephpのソースコードの解説をお願いします。

konisi721

総合スコア11

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2021/01/01 03:01

編集2021/01/01 04:05

ckaphp,php,mysqlを使って、野球の打席結果の集計をして表示するアプリを作成中です。インストラクターの方にコードを教えていただき、入力したのですが、ソースコードの解読ができず、どのような命令なのかあまり分かっていないので解説をお願いします。
2行目の $games = $table->find()->where("gameday like '".$this->request->getQuery("k")."%'")->all();からの解説をお願いします。

該当のソースコード

cakephp

1{ 2 $table = $this->getTableLocator()->get("games"); 3 $games = $table->find()->where("gameday like '".$this->request->getQuery("k")."%'")->all(); 4 $arr = "in("; 5 $arr1 = ""; 6 foreach ($games as $g) { 7 $arr.=$g->id.","; 8 } 9 if ($arr!="in("){ 10 $arr = rtrim($arr,",").")"; 11 $arr1 = " where id ".$arr; 12 $arr2 = $arr; 13 $arr = " where gameid ".$arr; 14 $arr3 = ""; 15 } else { 16 $arr = ""; 17 $arr2 = ""; 18 }

試したこと

googleでinの検索
インストラクターへの質問をして

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

インストラクターの回答
$games = $table->find()->where("gameday like '".$this->request->getQuery("k")."%'")->all();

sql部分だけ見ると

gameday like '".$this->request->getQuery("k")."%'")

like文は曖昧一致という意味で、 後ろに書かれたものが文字列にあるかどうかを調べる

この場合、$this->request->getQuery("k")には、2019や2020が入っているので、それが連結されます。
よって、2020の場合、
gameday like '2020%'
となりますね。

%は、なんでもいいので文字があるということで、
前に書けば、途中のものも取ってこれる。
後ろに書けば2020で始まるものという意味。

そのため、 2020%なので、 2020-01-01 は一致します。 2020-12-31 も一致します。

まずinですが、その値があるかどうかを調べるも。

gameid in (1,2,3,4,5,6,7)
とすると、gameidが1か2か3か4か5か6か7のもののみ取得。

それを踏まえて、

$arr = "in(";

初期値に "in ("を入れておく。

$arr1を初期化。

$arr1 = "";

絞り込んだ$gamesデータをforeachで回し、その1行1行を$gに入れる。

foreach ($games as $g) {
$arr.=$g->id.",";
}

idを連結していきます。
in (1,3,4,7,9,10, のような感じになる。

if ($arr!="in("){

$arrがin( 以外のとき、つまりはforeachに一回は入った時の処理。

$arr = rtrim($arr,",").")";

最後の1文字を削除します。最後が','だったら削除といった感じ。
in (1,3,4,7,9,10, こんな感じになっているので、最後の,を消し、")"を.で連結している。。

$arr1 = " where id ".$arr;

文字列連結。
この時点で、$arr1は、
where id in (1,3,4,7,9,10) のようになる。

$arr2 = $arr;

バックアップ。

$arr = " where gameid ".$arr;

同じように連結。
where gameid in (1,3,4,7,9,10) のようになる。

$arr3の初期化。

$arr3 = "";

$arrがin( のとき、つまりはforeachに一回も入っていない時の処理。

} else { $arr = ""; $arr2 = ""; }

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2021/01/01 03:58

意図はコードを書いた人にしか分かりません。 >googleでの検索 「調べた」と書いただけで他者に伝わる情報量は0です。
konisi721

2021/01/01 04:06

ありがとうございます。 編集させていただきました。 インストラクターの回答を載せましたので、そこも参考にしています。
hoshi-takanori

2021/01/01 13:16

インストラクターさんの教育方針がどうなってるか知りませんが、そのコードは最終的に SQL 文を生成して実行することになるので、SQL が分からないと何も分からないのではないでしょうか…。
m.ts10806

2021/01/01 21:35

結局どのように解決としたのか分かりませんね。
guest

回答2

0

ベストアンサー

インストラクターがいるのであれば、直接インストラクターに質問すればよいと思います。
それとは別に、以下はSQLインジェクション脆弱性になると思います。

PHP

1$games = $table->find()->where("gameday like '".$this->request->getQuery("k")."%'")->all();

whereメソッドに文字列でクエリを指定するのはやめましょう。教材またはインストラクターがよくないのでは?

投稿2021/01/01 04:53

ockeghem

総合スコア11701

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

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

0

インストラクターへの質問をし回答で解決

投稿2021/01/02 00:57

konisi721

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問