環境変数を管理する(6-5)
機密データをソースコードとは別で管理しよう
通常の変数
PHPのコードの中で定義し、実行したプロセス内でのみ使用できる
プログラムの中に
$name = 'kiyoto';
の様に定義する
コードに直接記述するので、コードを見れば変数の中身が分かり、
また環境によって切り替えることもできない
PHPが動いているOSに保存し、PHPアプリケーションに渡す仕組み
(OSに格納される変数)
OS上に
DB_USER=book_log
の様に定義する
PHPのコードに直接記述しないので、コードを見ても変数の中身がバレず、
また環境によって切り替えられる
環境変数を使うのに、.envファイルを使うと簡単に設定できて便利(phpdotenv)
現状
ソースコードにベタ書き
$link = mysqli_connect('db','book_log','pass','book_log');
.env使うと
ソースコードから分離できる。環境によっても使い分けられる
.envファイル:重要な設定データを定義する→環境変数として定義される
DB_HOST=db
プログラムファイル:.envファイルに定義された値を取得して使える
$dbHost = getenv('DB_HOST'); //$_ENV['DB_HOST']でも取得できる
$link = mysqli_connect($dbHost,…,…,…);
このままでは環境変数とはみなされない
.envファイルに定義された変数をを環境変数として定義しなくてはいけない
その為にライブラリを使う
実際の手順
1,composer initを実行
2,VSCodeにcomposer.jsonファイルが作られたことを確認する
3,php,envのインストールコマンドを実行
4,composer.jsonとcomposer.lockに記載されたことを確認する
5,実際にライブラリがインストールされているvendorフォルダを確認する
6,プロジェクトのルードディレクトリに.envファイルを作成
7,.envファイルに環境変数に置き換える
環境変数にはよく接頭辞を付ける
PASSWORDではなくDB_PASSWORDなど
他のパスワードがあった時に分かりやすくなる
8,プロジェクトに
require __DIR__ . '/../vendor/autoload.php';
でライブラリの内容を読み込む
autoload.phpだけ入れれば他のライブラリ全てが入る
9, $dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..');
$dotenv->load();
$dbHost = $_ENV['DB_HOST'];
$dbUsername = $_ENV['DB_USERNAME'];
$dbPassword = $_ENV['DB_PASSWORD'];
$dbDatabase = $_ENV['DB_DATABASE'];
$link = mysqli_connect($dbHost, $dbUsername, $dbPassword,
$dbDatabase);
//ここが変数から環境変数に置き換わっている
こんな感じでプロジェクトに記述する
Composerって何?(6-4)
現状の課題
機密データがソースコードにベタ書き
ソースコードを誰かに見られたらデータが漏洩し、データが流出する
なので、ライブラリを使用して、機密データを別途管理できる仕組みを作ろう
ライブラリって何?
ライブラリは使いたい部品が入っている道具箱
特定の機能を提供するコードをひとまとめにしたもの
ライブラリを使うと車輪の再発明をしなくてよくなる
*学習時は勉強になるので再発明してよし
PHPでライブラリを使おう
PHPでライブラリを導入したいときはComposerを使うと便利
ComposerはPHPの依存管理ツール
状況
・プロジェクトでたくさんのライブラリを使っている
・ライブラリの中には他のライブラリを使用(に依存)しているものがある
何も使わないと
・一つのライブラリを使うのに他のライブラリをいちいちインストールしてこないといけない
・チーム開発時に人によって使用しているライブラリのバージョンがバラバラ。それ起因でエラーになる
Composerを使うと
・プロジェクトが使用しているライブラリとそのバージョンを統一できる
・ライブラリが依存しているライブラリもセットでインストールできる
・プロジェクトごとにライブラリを管理できる
Composerの仕組み
composer.jsonとcomposer.lockファイルで依存するライブラリを定義する
[composer.json]
プロジェクトで使用するライブラリを一覧にしたもの
[composer.lock]
実際にどのライブラリのどのバージョンをダウンロードしたのかをひとまとめにしたもの
1,composer installを実行すると、インストールしたライブラリとバージョン情報がcomposer.lock書き出される
2,composer.lockがある状態でcomposer installすると、composer.lockに記されたバージョンのライブラリがインストールされる
すると、チーム内で同じバージョンのライブラリを使える
Composerを使おう
[init]
対話形式でcomposer.jsonを作成する(プロジェクトの初期に一度実行)
composer init
[require]
新しいライブラリを追加する
composer.jsonにライブラリが、composer.lockに実際にインストールしたものとバージョン情報が記載される
composer require <ライブラリ名>
[install]
composer.jsonもしくはcomposer.lockに従ってライブラリをインストールする
チーム開発時に使用。共通のバージョンのライブラリを使うことができる
composer install
[remove]
ライブラリを取り除く
composer remove <ライブラリ名>
メモ帳アプリ自作過程の備忘録(データベース)
しょうもないミスだし、解決できなかったものもあるが
躓いたところを書いておく。
一つ目、ターミナルからテーブルの作成しようとして以下を実行しようとした時
CREATE TABLE book_log.cooking
(cook VARCHAR(50),food VARCHAR(50),food2 VARCHAR(50));
赤くした括弧の部分をを書かずに、どこが悪いのか探し続けていた。
MySQLの公式ドキュメントを見返して間違いに気付いた。
$sql = <<<EOT
INSERT INTO cooking (
cook,
food,
food2
)VALUES(
"{$cooking['cook']}",
"{$cooking['food']}",
"{$cooking['food2']}"
)
EOT;
赤くした部分を "" と {} で囲っていなかった。
完成品である読書ログサービスと比較して、なぜ必要かを後付けて調べた。
"" はVALUESに対して文字列だと指定しなければいけないから。
{} は変数の範囲をはっきりさせるため。
これについてはちゃんと理解できていないし、間違っているかもしれない。。。
三つ目、配列を追加する時
単純に文法ミス
$a = [追加する文]
としてしまっていた所を
$a = 追加する文
と、直した。
四つ目、バリデーション処理を行っている時
function validate($cooking)
{
$error = ;
if (!strlen($cooking['cook'])) {
$error = 'Error: 料理名を入力してください' . PHP_EOL;
} elseif (strlen($cooking['cook']) > 50) {
$error = 'Error: 料理名は50文字以内で入力してください' . PHP_EOL;
}
if (!strlen($cooking['food'])) {
$error = 'Error: 食材1を入力してください' . PHP_EOL;
} elseif (strlen($cooking['food']) > 50) {
$error = 'Error: 食材1は50文字以内で入力してください' . PHP_EOL;
}
if (count($error) > 0) {
foreach ($error as $errors) {
echo $errors;
}
exit;
}
}
バリデーション処理(5-23~5-26)
バリデーション処理とは
入力された値が期待される値のものかチェックする事
例えば
・値が入力されているか?
・文字列の長さは適当な範囲か?
・数値が入力されているか?
・数値は適切な範囲内の値か?
・選択肢から選ばれた値か?
・書式が正しいか?(メールアドレス、電話番号など)
バリデーションの基本形
function validate($name)
//バリデーションメソッドを用意
{
$errors = [];
//エラーを入れる空配列を用意
if(!strlen($name)){
//$nameが未入力だったら
$errors['name'] = '社名を入力してください';
}elseif(strlen($name)>100){
//$nameが100文字を超えて入力されてたら
$errors['name'] = '社名は100文字以内で入力してください';
}
return $errors;
//エラー変数を返す
}
$name = trim(fgets(STDIN));
$validated = validate($name);
//入力された$nameをvalidate関数に入れる
//戻り値が$errorsなので$validatedには空配列かエラー内容が入る
if(count($validated)>0){
//エラー変数に何か含まれていた場合
foreach($validated as $error){
echo $error . PHP_EOL;
//エラー内容を表示する
}
return;
//処理を中断する
}
$sql = "INSERT INTO companies('name')VALUES({$name})";
//問題なければ処理を続ける
論理演算子を使おう
!(否定の演算子)
!$a
//$aがtrueでない時true
//$aも$bもtrueならtrue
//$aと$bのどちらかでもtrueならtrue
文字列を整数に変換しよう
型キャストを使うことで型を別の型へ変換できる
ユーザの入力値を適切な型に変換してプログラムで扱う時などに使用する
型キャストとは
変換しようとする型を括弧で括り、変換する変数の前に置くと(型キャスト)型を変換できる
(int) 整数への変換
・少数は切り捨て
・数字以外は0が出力される
(bool) 論理値への変換
(string) 文字列への変換
文字列を整数へ変換するなら
$a = '2';
var_dump((int)$a); //int(2)
比較演算子を使って数値を比較しよう
$a == $b
$aと$bが等しい場合にTRUE。型が違う場合はキャストされる(型変換される)
$a === $b
$aと$bが等しい場合にTRUE。キャストが行われない(厳密な比較)
$a != $b
$aと$bが等しくない場合にTRUE。型が違う場合はキャストされる
$a !== $b
$aと$bが等しくない場合にTRUE。キャストが行われない(厳密な比較)
$a < $b
$aが$bより小さい場合にTRUE
$a > $b
$aが$bより大きい場合にTRUE
$a <= $b
$aが$bより小さいか等しい場合にTRUE
$a >= $b
$aが$bより大きいか等しい場合にTRUE
データベースとは(5-1~5-4)
データベースはデータの基地。
データを1か所に集めいつでもすぐに利用できるようにしたもの
なぜファイル保存よりデータベースの方がいいのか
・使用者がエンジニアでないとファイルの管理が大変
・大量のデータの検索・登録・修正・削除を素早く簡単にできる
・同時に複数の人が利用してもデータに矛盾が生じない(同時実行制御)
・データが飛ばないように対策できる(耐障害性)
・データが流出しない(セキュリティ)
リレーショナルデータベースとは
データベースを具体的に落とし込んだのがリレーショナルデータベース
リレーションとは二次元表のこと
ファイルだと
・言語、その為の環境も必要で、プロのエンジニア以外が操作しにくい
二次元表だと
・二次元表だとプログラミング言語を使わなくてもデータを簡単に操作できる
・明快な演算でデータを抽出できる
・二次元表だとリレーショナルデータベースの言語であるSQLでデータを操作する
・幅広いユーザーが使える