---
layout: "@/layouts/MarkdownLayout.astro"
---
export const title = "PHPでSQLを操作する";
import DockerLink from "@/components/DockerLink.astro";
import OuterLink from "@/components/OuterLink.astro";
# {title}
実際に動作するMySQLの環境を準備しています。
<DockerLink href="/sample/sql/connect.php" />
```php file=public/sample/sql/connect.php
public/sample/sql/connect.php
```
<br />
PHPからSQLを実行するとき、大まかに以下の4つのステップに分かれています。
```php file=public/sample/sql/connect.php {"準備":2-9} {"接続":11-12} {"Queryを指定":17-19} {"実行":21-22}
public/sample/sql/connect.php
```
<br />
これを応用して、[PHP - フォームの入力を受け取る](../php/030-form) の内容に追記をして、実際にデータベースにデータを保存してみましょう。
なお、テーブルはこのように作成してあります。
**sweepstakes**
| 列名 | データ型 | 説明 |
| :----------- | :-------------- | :----------------- |
| id | INT(11) | 自動採番されるID |
| name | VARCHAR(255) | 名前 |
| address | VARCHAR(255) | 住所 |
| product | VARCHAR(255) | 希望商品 |
| created_at | DATETIME | 登録日時 |
<DockerLink href="/sample/sql/form.html" />
```php file=public/sample/sql/submit.php ins={3-27} collapse={32-72}
public/sample/sql/submit.php
```
<br />
この例では、INSERT文を実際に実行しています。
この処理を少し詳しく見てみましょう。
```php file=public/sample/sql/submit.php {"テンプレートを設定":16-18} {"値を設定":20-22} {"実行":24} collapse={32-72}
public/sample/sql/submit.php
```
<br />
値を設定するところで、`bindParam` というメソッドを使って値を設定しています。
これにより、追加したい値をSQLに安全に組み込むことができます。
例えば設定する値が文字であったときに、ダブルクォートで囲まれていなければSQLとして正しく動作しません。
このような細かい部分を自動的に処理してくれるのが `bindParam` なのです。
<br />
<br />
実際に値を保存することができたので、次には保存したデータを表示してみましょう。
<DockerLink href="/sample/sql/list.php" />
```php file=public/sample/sql/list.php
public/sample/sql/list.php
```
<br />
ここでは、SELECT文を実行して保存されているデータを取得しています。
これで取得した情報が、どのように表示されているのかを見てみましょう。
```php file=public/sample/sql/list.php {"データの取得":15-17} {"表示のループ":43-62} "PDO::FETCH_ASSOC"
public/sample/sql/list.php
```
`fetchAll`メソッドを使うことで、取得したデータを配列として受け取ることができます。
このとき、`PDO::FETCH_ASSOC`というオプションを指定することで、列名をキーとした連想配列としてデータを受け取ることができます。
```php
<?php
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
/*
* $rows = [
* [
* 'id' => 1,
* 'name' => '山田太郎',
* 'address' => '東京都千代田区1-1-1',
* 'product' => '商品A',
* 'created_at' => '2024-01-01 12:00:00'
* ],
* [
* 'id' => 2,
* 'name' => '鈴木花子',
* 'address' => '大阪府大阪市2-2-2',
* 'product' => '商品B',
* 'created_at' => '2024-01-02 13:30:00'
* ]
* ];
*/
```
これを、`foreach`文でループさせて、各行のデータを表示しているというわけです。