Newer
Older
hello-programmer-world / src / pages / sql / 030-sql-on-php.mdx
@h.sakamoto h.sakamoto on 5 Feb 3 KB sql
---
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`文でループさせて、各行のデータを表示しているというわけです。