---
# System prepended metadata

title: フォーム値をDBへ保存（タイトル仮）
tags: [ready for review]

---

###### tags: `ready for review`

# フォーム値をDBへ保存（タイトル仮）
PDOとプリペーアドステートメントを利用してデータを登録する方法を[こちら](https://hackmd.io/@GH-wNvm-QfG5Y89-RmIY8g/Sk0iaZMcu)で学習しました。
今回はフォームから送られてきた値を保存できるようにしていきます。

## データベースに接続しよう
[以前作成したcomplete.php](https://hackmd.io/@GH-wNvm-QfG5Y89-RmIY8g/HyEACrfK_)を準備して下さい。
まずはPHPタグを用意してPHPを埋め込めるようにしましょう。
```php=
<div>
  <?php echo $_POST["content"] ?>
</div>
<p>
  上記の内容で登録されました
</p>
<a href="index.php">お問い合わせフォームに戻る</a>
<?php
```
次にPDOのインスタンスを生成してデータベースと接続します。
忘れてしまった方は、[前章](https://hackmd.io/@GH-wNvm-QfG5Y89-RmIY8g/ByZge5Gq_)か[PDOとプリペアードステートメント](https://hackmd.io/@GH-wNvm-QfG5Y89-RmIY8g/Sk0iaZMcu)に戻って復習しましょう。
```php=
<div>
  <?php echo $_POST["content"] ?>
</div>
<p>
  上記の内容で登録されました
</p>
<a href="index.php">お問い合わせフォームに戻る</a>
<?php
try {
  $dbh = new PDO("mysql:dbname=SQL_lesson;host=localhost;charset=utf8", "root");
} catch(PDOException $e) {
  echo "エラーメッセージ : " . $e -> getMessage();
}
```

## プリペアードステートメントを利用しよう
今回はフォームから送信されてきた値をcontentカラムに入れてデータを登録します。
まずはこれをSQLにするとどうなるか考えてみましょう。
データを登録するということは`INSERT INTO`の文法を使用することがわかります。
ですので、
```sql=
INSERT INTO blogs (content) VALUES (フォームから送信されてきた値);
```
このようになります。
ここでSQL文の変動する箇所としない箇所を一緒に考えることができた方はプリペアードステートメントの理解はバッチリです！

変動しない箇所と名前付きプレースホルダを文字列にし、変数に代入しましょう。
その文字列をprepareメソッドの引数に渡すところまで記述してみましょう。
```php=
<div>
  <?php echo $_POST["content"] ?>
</div>
<p>
  上記の内容で登録されました
</p>
<a href="index.php">お問い合わせフォームに戻る</a>
<?php
try {
  $dbh = new PDO("mysql:dbname=SQL_lesson;host=localhost;charset=utf8", "root");
  
  $sql = "INSERT INTO blogs (content) VALUES (:content)";
  
  $stmt = $dbh -> prepare($sql);
} catch(PDOException $e) {
  echo "エラーメッセージ : " . $e -> getMessage();
}
```

今度は、名前付きプレースホルダとPOSTされた値をバインドして実行する処理を記述してみましょう。
```php=
<div>
  <?php echo $_POST["content"] ?>
</div>
<p>
  上記の内容で登録されました
</p>
<a href="index.php">お問い合わせフォームに戻る</a>
<?php
try {
  $dbh = new PDO("mysql:dbname=SQL_lesson;host=localhost;charset=utf8", "root");
  
  $sql = "INSERT INTO blogs (content) VALUES (:content)";
  
  $stmt = $dbh -> prepare($sql);
  
  $stmt -> bindValue(":content", $_POST["content"], PDO::PARAM_STR);
  
  $stmt -> execute();
} catch(PDOException $e) {
  echo "エラーメッセージ : " . $e -> getMessage();
}
```

ここまでできたらindex.phpからデータを投稿してみましょう！
complete.phpからindex.phpに戻った時、登録したデータが一覧表示含まれていたら成功です。

この章まででqueryメソッドとprepareメソッドを何度か使用してきました。
今回のように送信されてくる値が一定ではない、つまり、変動する場合はprepareメソッドを使用します。
逆に、変動しないSQL文はqueryメソッドを使用します。
文法を覚えることも大切ですが、まずはイメージを持てるように頑張っていきましょう！