レシピ備忘録

美味しいと思ったレシピを忘れないために

最初に読まれるindex.phpのrequire_onceによってconfig.phpとPoll.phpが読まれる。

config.phpでの定義(config:設定)

ini_set('display_errors',1);エラー表示の設定の仕方

エラーをHTML出力の一部として画面に出力するようにini_set()で設定。エラーがブラウザに出力されるので、見やすい。(ターミナルに表示されるエラーがブラウザにも出力されます。)

define(定数名,値) 定数の定義の仕方

define(DSN','mysql:host=localhost;dbname=dotinstall_poll_php');
define('DB_USERNAME','dbuser');
define('DB_PASSWORD','t8CmBz4A');

defineで定義された定数(DSN,DB_USERNAME,DB_PASSWORD)は、Poll.phpのデーターベースに接続する設定の所で使用されている。

session_start();関数 セッション利用の開始命令(サーバー側にデータの保存する)

settion_start関数は、初めてのアクセスか、2回目のアクセスかを判別します。
初めてのアクセスの場合は、セッションIDを作成します。

require_onceでfunctions.phpが読まれれる

htmlspecialchars(文字列, 処理オプション,文字コード)

エスケープする設定をしている
function h($s) {
return htmlspecialchars($s, ENT_QUOTES,'UTF-8');
}

h(*) *に入った変数をENT_QUOTES (シングルクオテーションもダブルクオテーションも変換してね)

PDO(PHP data Object)でデーターベースに接続するためにオブジェクトを作る

生成方法は new PDO(DB接続文字列、ユーザー名、パスワード)

private function _connectDB() {
try {
$this->_db = new \PDO(DSN, DB_USERNAME, DB_PASSWORD);
$this->_db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
} catch (\PDOException $e) {
throw new \Exception('Failed to connect DB');
}
}
これがconstructで定義されているのでオブジェクト生成時に実行される。そして$_dbでデーターベースに接続できるように設定された。
Poll.phpのgetResults()や_save()などのデーターベースにアクセスする所で使用。
 
データーベース接続文字列は決まっていてMysqlの場合は new PDO(mysql:host=ホスト;dbname=データーベース名) なのでここでは (mysql:host=localhost;dbname=dotinstall_poll_php'); としてある。

この長い()の名前をわずか3文字のDSNで表現できるようにconfig.phpのdefine()でDSNの値はこれだよ。define('DSN','mysql:host=localhost;dbname=dotinstall_poll_php');と定数定義設定していて、Poll.phpでデーターベース接続_connectDB()の所で使用。

(PDOとはPHPからデーターベースにアクセスするためのクラス群。PDOを使用する事で、データーベースをmysqlからSQLiteに変更してもスクリプトの書き換えがほとんど入らなくなるメリット。

setAttribute() はDB接続オプション。PDO()の第4引数でも設定可能。
setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
は、SQL文実行時にエラーが出たら例外返してね。の命令文



Poll.phpでPollクラスを定義。オブジェクト(インスタンス)はindex.phpで$pollに代入してる
Poll.php








data() :data属性の取得

.val() :value属性を返す


```$('.box').on('click',function() {

$('#answer).val($(this).data('id'));

```



boxがclickされたらid answerのvalue属性にdata属性の数字をセットしてね。data="ここの数字" val()でセット。


data()関数は引数で得たい情報を設定
data('id') にすると数字get
data('user') : Jackなどstring(文字)をget

data('date-of-birth') :2000,01,01


```
if($_SERVER["REQUEST_METHOD"] === 'POST') {

$poll->post();

}
```

formからの投稿がPOSTメソッドできてるのかどうか。

formなどで送信先にサンクスページなどセットしていて、そこに重要な記述をしてた場合、ダイレクトにサンクスページにアクセスされたら困る。(URLアクセスなどで)そこで、formからpost経由でアクセスされたかを確認する為。(URLからのアクセスだったらエラー返して見せなくする)

formにセットしたmethod属性(post?get?)

$_SERVER : ヘッダ、パス、スクリプト位置などの情報を有する配列で、

$_SERVER[''] === 'POST'

今のURLを表示したり。

クロスサイトリクエストフォージェリ(以下CSRF


_validateToken (validate:検証)

_createToken()で$_SESSIONにtokenが入ってなかったらbin2hex(openssl_random_pseudo_bytes(16)してね。で$_SESSIONに値埋め込んでいる

bin2hex()文字列を16進数に変更

array_fill($startindex,$num,$value)
array_fill(0,3,0) で
Array(
[0] => 0
[1] => 0
[2] => 0)
の配列を作って返してくれる。それを$dataに代入。$dataのには foreachで
foreach($this->_db->query($sql) as $row) {
$data[$row['answer']] = (int)$row['c'];
}

$dataにArray(
[0] => 0
[1] => 0
[2] => 0)
が代入されているので、$data

$sql = "select answer , count(id) as c from answers group by answer";

group by句はSQLでの集計文