1
1

More than 3 years have passed since last update.

【try-catchは難しくなかった】cakePHPとPHPの理解を深めるためフォームの書き方を復習してみた

Last updated at Posted at 2020-01-12

cakePHP2.x

view/Users/create.ctp

$this->Form->create('モデル名','オプション');
$this->Form->input('フィールド','オプション')
$this->Form->end('ボタン名')
Controller/UsersController.php

function create {
 if($this->request->is('method属性'){
   $this->モデル名->save($this->request->data);
 }
} 

覚えておく事

モデル等の命名について

テーブル名は「-s」をつけるが
ただモデル名は「-s」をつけない
 ※Controller,Viewは「-s」をつける

(createの)オプション~inputのオプションは別~

array('type'=>'','action'=>'')

typeはHTMLのmethod属性を指定するもの
└'get'か'post'を指定する
└PUTやDELETEはvalue属性なのでここに入らない

 actionはaction属性を指定するもの
  └「.」で編集しているファイルのディレクトリーがはいる

⇒連想配列を書かないとmethodに'post'が入り'action'には自ファイルのアドレスがはいる

is()

 リクエストタイプを判別する

  if($this->request->is('post')){
    //postの場合の処理}

上記の文書の時は、postのリクエストがあった場合の処理をさせている

PHP7.x

form.php
<form method="POST" action="<?php print($_SERVER['PHP_SELF']) ?>">
<input type="text" name="name">
<input type="text" name="content">
<input type="submit" name="btn1" value="投稿する">
</form>

<?php
 @$name = $_POST['name'];
 @$content = htmlspecialchars($_POST['content']);


    try{
        $pdo = new PDO('mysql:host=localhost;dbname=study;charset=utf8','root','1234');
        $sql = "INSERT INTO bull(
            name,content
        ) VALUES (
            '$name','$content'
        )";
        $res = $pdo->query($sql);
    } catch(PDOException $e) {
        echo $e->getMessage();
        die();
    }
?>

DBの読み込み

$PDO = new PDO($pdo = new PDO($dsn, $username, $password);

PDOクラスをインスタンス化をして、DBに接続できる様にする。
dsn ⇨ DBに接続する文字列(DBによって書き方が異なる)
username ⇨接続するDBのユーザー名
password ⇨接続するDBのパスワード

try-catch

何らかの理由でDBに接続できなかった時にPDOクラスはPDOException例外を発生するみたいです。
その例外によってスクリプト全体が停止しまわない様に例外対処のために「try-catch-finally」が使われるみたいです。

try{
 //例外が発生する可能性のあるコード
}catch(発生するかもしれない例外の種類 例外を受け取る変数名){
 //例外発生時の処理
}finally{
 //例外に関わらず実行するコード
}

catch(PDOException $e)

発生したPDOException例外に対して$eに例外を受け取らせています。
変数$eから例外メッセージを受け取るために

$e->getMessage();

と記載しています

INSERT INTO

INSERT INTO テーブル名(列名1, ...) VALUES(列値1, ...)

テーブル名の後ろにカラム名を入れて、VALUESの後ろに代入する値を入れる。

エラー制御演算子(@について)

あまり使わない方がいいみたいですがエラーが出て先に進めなかったので利用しました

@エラーを表示させたくないコード

htmlspecialchars

入力した内容の一部をエンコードしてくれる事で悪意のあるスクリプトを不実行にしてくれる。
例えば

とフォームに入力すると

&lt;script&gt;alert(1)&lt;/script&gt;

とエンコードされDBに保存される。

一番不安に思ったのがそのままDB内容を表示させようとするといけないんじゃね?デコードされるんじゃない?と思いきやサイト表記は 

となる。

理由としてはブラウザがHTMLエンティティ化というものをしてくれるみたい

補足
htmlspecialchars_decodeの使い道
 ⇒HTMLエンティティ化したものはブラウザの機能で変換されるが、コード内で使用する際は変換されないのでデコードが必要になるのでDBなどいじる時は必要になる

参考サイト

【CakePHP】CakeRequest
┗$this->requestのメソッドが色々書いているので参考になる

PHPでデータベースに接続するときのまとめ
 ┗DB周りについて詳しく書いてる

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1