MVCってなんやねん

blog.codecamp.jp
Controllerがユーザからのリクエスト(URLにアクセス)を受け取ります。次にControllerはリクエストに対し必要な処理をModelへ依頼し、Modelは処理を行いその結果を返します。必要な処理が終わったら、ControllerはViewへユーザへ表示するHTML内容を依頼し、Viewが表示内容を返します。

blog.codecamp.jp
「ユーザからの入力を受け取るControllerファイルはドキュメントルートに置きます。それ以外のファイルはURLから直接アクセスできる必要はありませんので、ドキュメントルート外にファイルを置きましょう。」
「一般公開するファイルは必要最低限にする」
blog.codecamp.jp

white-bear.info
MVCフレームワークRuby on Railsが発祥のようで、そのRuby on Railsでは、M(モデル)はデータベースのテーブルをそのままオブジェクトとして扱います。テーブルAにはモデルAオブジェクトが対応し、テーブルBにはモデルBオブジェクトが対応するというカンジです。

まず、メインの処理となるビジネスロジックはモデルに書きます。たまにコントローラーに書く方もいますが、基本的にはモデルが担当するべきでしょう。具体的には、モデルにメイン処理のメソッドを実装して、コントローラーではこのモデルのメソッドをコールするような形式が良いかと。そしてモデルのメソッドから得られたデータをビューに渡して表示するといった流れになります。

モデルをテーブル(ファイル)に対応させる方法
Railsにおける「モデル=テーブル」という考え方でMVCを構成します。
テーブル(ファイル)ごとにオブジェクト生成→メソッド呼び出しといった流れになるので非常に整理しやすくなります。ただ、テーブルと関係のない処理をどこに記述するのかといった問題があります。この場合、新たにクラスを用意してそこに記述するか、とりあえずコントローラーに記述することになります。

モデルをコントローラーに対応させる方法
この方法はコントローラーに対して必ずモデルを用意するので、処理やページごとにモデルを作るイメージになります。複数テーブルにまたがる処理やテーブルに関係のない処理などもモデルに記述すれば良いので、メソッドを記述するべきクラスに迷うことはありません。ただ、同一のテーブルにアクセスしているにもかかわらず、あちこちのモデルに同じような処理が記述されるようなケースが発生することがあります。

→テーブル単位かコントローラー単位か

コードの再利用性と作業分担、セキュリティ対策ができるMVC

php オブジェクト指向

www.shigeweb.jp

クラスとは
「クラス」は、『「メンバ変数(プロパティ)」という変数と「メンバ関数メソッド)」という関数を内部に持つ』という特殊な構造をした、「オブジェクト型」の値、「オブジェクト」の構造を定義するもの。
オブジェクトのイメージは『「オブジェクト」とは、幾つかの「属性(プロパティ)」と「機能(メソッド)」を持った「物体(オブジェクト)」である』といった感じ。
クラスの定義は、「class クラス名{ 定義 }」という形で行い、定義部にて「メンバ変数」と「メンバ関数」の定義を行う。
クラス名の命名規則は、基本的に関数の命名規則と同じ。が、「stdClass」という名前は使えない。
メンバ変数を定義する場合は、必ず変数の前に「var」を置いて定義する。
メンバ関数の名前には、クラス内でのみ使用される特殊な関数の名前である「__sleep()」と「__wakeup()」という名前は使えない(特別な意味を持つようになる)。
定義されたクラスの「インスタンス」であるオブジェクトを生成するには「var演算子」を使い、「$obj = new HODE()」として変数に格納する。
オブジェクトが持つメンバ変数やメンバ関数を使う場合には、「->(アロー演算子)」を用いて、「$obj->func();」という形で使う。
メンバ関数内で、そのクラスのメンバ変数やメンバ関数を使用する場合は、「$this」という特別な変数を使い、「$this->hode」という形で使用する。
クラスと同名のメンバ関数を「コンストラクタ」と言い、これはインスアンス(オブジェクト)生成時に自動的に実行される。
「var」を使ったメンバ変数の定義でセットできるのは定数のみで、定数以外のものをセットしたい場合は、コンストラクタ内でセットする。
オブジェクト生成時の、クラス名の後の「(丸括弧)」は省略出来る。むしろ、コンストラクタに引数を渡す必要が無い場合は書く必要が無い。
「extends」を用いて「class 派生クラス extends 基底クラス{ 定義 }」とすると、基底クラス(派生元クラス)が持つ全てのメンバ変数とメンバ関数を兼ね備えた派生クラスを定義出来る。この事を、「継承」と言う。
基底クラスから継承したメンバ関数と同じ名前の関数を定義する(「オーバーライド」)事が出来る。
「::演算子(コロン2つ)」を用いて「HODE::func();」のように使うと、インスタンスを生成していないクラスのメンバ関数を使う事が出来る。ただし、メンバ関数内でメンバ変数は使えない。
メンバ関数をオーバーライドしても、「parent::メソッド名」で基底クラスで定義された方をコールできる。
「$this」は、生成されたオブジェクト自身へのリファレンス

phpデータベース周りで勉強したこと

これをまず読むとわかりやすい
データベースとSQL - PHP入門 - ポンクソフト

・ウェブシステムでデータを保存する手段としては、主に以下の5つがあります。
変数,クッキー.セッション.ファイル,データベース
  
・データベースによるデータ保存
データベースも長期間のデータ保持が可能で、さらにデータの「作成」「検索」「更新」「削除」を簡単にできる機能があります。
      
・主要なカラム型
カラム型 中に入る値
INT 整数
VARCHAR(n) n文字までの文字列
TEXT 制限のほぼない文字列
DATETIME 日付と時刻
DATE 日付
TIME 時刻

そのあとにこれ
PHPでMySQLを使う - PHP入門 - ポンクソフト

・PDO(PHP Data Objects)クラスを使うと、簡単に汎用的なデータベースアクセスのコードを書くことができます。
レコードの表示はテーブルなどで行をループして行い、レコードの挿入・更新はフォームを介して行うのが一般的です。
 
・PDOについて
PHPからMySQLのデータベースを扱うにはたくさんの方法があり、どれを選択するかは時と場合によるのですが、今回は汎用性が高くて高速な「PDO」クラスを使います。
PDOを使ってデータベースを操作する際の基本的な流れは「PDOオブジェクトの作成」→「SQLの発行」→「結果レコードの参照」になります。
・レコードの表示、挿入、更新、削除
 
・レコードの挿入
prepateメソッドSQL文を「準備」します。発行はまだしません。「?」は、後から値を入れるために、とりあえず仮に置いておくものです(「プレースホルダ」と言います)。
executeメソッドで、実際にSQL文を発行します。引数で配列を受け取り、先ほど準備したSQL文の「?」に配列の先頭から値を入れて行きます。ここでは最初の「?」にフォームの名前欄に入力した文字列、次の「?」に価格欄に入力した文字列が入ります。
queryは使わない。
 
MySQL DSN構文
mysql:dbname=データベース名;host=ホスト名;port=ポート番号

PDOについてさらに詳しく
PDOの利用 - PHP入門

・PDOオブジェクトの作成
PDOクラスはオブジェクトの作成時に、データベースへの接続に失敗した場合"PDOException"という例外を投げるようです。その為、try catchを使って例外処理を記述しておきます。
$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'dbuser';
$password = 'dbpass';

try{
$dbh = new PDO($dsn, $user, $password);
}catch (PDOException $e){
print('Connection failed:'.$e->getMessage());
die();
}

$dbh = null;  //PHPスクリプトが終了すればデータベースへの接続は閉じられますが、明示的に閉じる場合にはオブジェクトに"NULL"を代入する。
 
SQLの発行
データベースに接続した後で、実際にSQL文をデータベースに発行して様々な処理を行います。
SQL実行の結果を所持:1回だけ使用するようなSQL文をデータベースへ送信するにはPDOクラスで用意されている"query"メソッドを使います。
データの取得:PDOStatementクラスのオブジェクトから実際の値を取り出すにはPDOStatementクラスで用意されている"fetch"メソッドを使います。

$sql = 'select id, name from shouhin';
$stmt = $dbh->query($sql);

$result = $stmt->fetch(PDO::FETCH_ASSOC);
print($result[0]);
print($result[1]);

prepareメソッドとexecuteメソッド
「execute」メソッドを実行した結果、PDOStatementクラスのオブジェクトには「query」メソッドの場合と同じくSQL文の実行結果が含まれています(SELECT文のような結果がある場合)。そこから実際の値を取り出す方法は「query」メソッドの場合と同じく「fetch」メソッドを使います。

・データの追加(INSERT)
「prepare」メソッドSQL文を作成し「execute」メソッドSQL文をデータベースへ発行します。

・データの更新(UPDATE)
「prepare」メソッドSQL文を作成し「execute」メソッドSQL文をデータベースへ発行します。

・データの削除(DELETE)
「prepare」メソッドSQL文を作成し「execute」メソッドSQL文をデータベースへ発行します。

これもPDOについて分かりやすい
PDOでMySQLに接続からINSERTやSELEC、UPDATEからDELETE、SUM、COUNTやテーブル作成など|LABO IWASAKI


PHPでデータベースに接続するときのまとめ - Qiita

PHPでPDOを使ってMySQLに接続、INSERT、UPDATE、DELETE、COUNT、SUM - Qiita

PDOの真の力を開放する - PHPでデータベースを扱う(3): Architect Note

マニュアルはこれ
PHP: PDO - Manual

最後に動画を見て理解できるか確かめる
PHPデータベース入門 (全13回) - プログラミングならドットインストール
 lastInsertId()とは→PHP: PDO::lastInsertId - Manual
 rowCount()とは→PHP: PDOStatement::rowCount - Manual
 数字型を扱うときはbindvalueを使う
 PDO::FETCH_CLASS
 一連の処理をまとめて行なうことができるトランザクション

おまけ
Mysqlコマンド - Qiita

mysqlで詰まったとこまとめ

・mysqldとは・・・MySQLとしてのお仕事をしているデーモンさん
wa3.i-3-i.info

・ソケット解決法
mysqlソケットエラー解決法 - ウマい話、ちょいくれや。

・覚えたいコマンド

mysql -u root
set password for root@localhost=password('設定したいパスワード');
exit
mysql -u root -p
create database blog_app;
show databases;
drop database blog_app;
use test;

・てかmysqlじゃなくてphpmyadmin使った方が全然楽だわ。いちいちコマンド入力するのだりー

【Udemy】「世界で7万人が受講!未経験からWebプログラマーになるための全て」をやってみた

Udemyがセール中で20000円の講座(世界で7万人が受講!未経験からWebプログラマーになるための全て)が1300円とめちゃくちゃ安かったので購入した。とりあえず、PHP編だけやってみた。

良いところ
・初心者にとっては基礎からやってくれるので楽だと思う。30時間と量も豊富。
・音声スピードの調整ができる。
・「Udemyではコースをご購入頂いた30日後までは無条件で全額返金を行っております。仮に思っていた内容とコースが違った場合はこちらの機能をお使い下さい。」らしいです
・「頂いた質問には出来るだけ24時間以内に返答出来るよう心がけておりますが都合により多少遅れる事も御座います。」らしいです。

悪いところ
・一個一個のビデオは5分〜10分程とあるが、20分〜30分の動画が結構ある。ドットインストールに慣れている自分には冗長に感じた。
・動画作成者のプログラミングエラーによる時間ロスが思ったより多かった。
・前半と後半でナレーターやエディタが変わった。

まあ、やっぱちょっと長いっすね。
ちなみに購入するんだったら、いろんなサイトでこのコンテンツは売られているが、UdemyはセールをよくやっているのでUdemyがいいと思う。他のサイトだと20000円とか5000円とか色々。

php メモ

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

・mysqli_real_escape_string・・・接続の現在の文字セットを考慮して、SQL 文で使用する文字列の特殊文字をエスケープする
trimとセットで使う ホワイトスペースの除去

if($_SERVER['REQUEST_METHOD'] == 'POST')

フォームからサブミットしたかどうか

include("connection.php");

mysqlに接続

・elseの処理をきちんと記述

・パスワードの再設定
 ・login.phpにメール、パスワード、新しいパスワード、新しいパスワードの確認のフォームを作成
 ・if フォームからサブミット⇨mysqlに接続
 ・メールとパスワードがデータベースと一致するかチェック
 ・新しいパスワードが確認できたら、新しいパスワードを定義
 ・メールとパスワードが一致する行からidを取得 mysqli_query($dbc,select~)
 ・mysqli_num_rows で結果の行数を取得する
 ・取得できていたら、新しいパスワードを古いパスワードのとこに設定
 ・mysqli_affected_rows — 直前の MySQL の操作で変更された行の数を得る で確認