diff --git a/public/sample/sql/connect.php b/public/sample/sql/connect.php index 4f9b54c..9661a6e 100644 --- a/public/sample/sql/connect.php +++ b/public/sample/sql/connect.php @@ -8,13 +8,18 @@ define('DSN', "mysql:host=" . DB_HOST . ";port=" . DB_PORT . ";dbname=" . DB_NAME . ";charset=utf8mb4"); + $dbh = new PDO(DSN, DB_USER, DB_PASSWORD); // エラーが発生した場合に例外をスローする設定 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); -// ここにSQLクエリを記述 -$rows = $dbh->query("SELECT NOW() AS current_datetime")->fetchAll(PDO::FETCH_ASSOC); + +// Queryを設定 +$query = $dbh->query("SELECT NOW() AS current_datetime"); + +// 実行、結果を連想配列として取得 +$rows = $query->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { echo "Current Date and Time: " . $row['current_datetime'] . "\n"; diff --git a/public/sample/sql/list.php b/public/sample/sql/list.php index e69de29..efee9f3 100644 --- a/public/sample/sql/list.php +++ b/public/sample/sql/list.php @@ -0,0 +1,69 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$query = $dbh->query("SELECT * FROM sweepstakes"); +$rows = $query->fetchAll(PDO::FETCH_ASSOC); + +$dbh = null; + +?> + + + + + + + 応募一覧 + + + + +

応募一覧

+
+ + + + + + + + + + + + + + + + + + +
IDお名前住所応募商品応募日時
+ + + + + + + + + +
+ + 応募ページへ +
+ + + diff --git a/public/sample/sql/submit.php b/public/sample/sql/submit.php index f050357..4ef9dd2 100644 --- a/public/sample/sql/submit.php +++ b/public/sample/sql/submit.php @@ -1,7 +1,5 @@ setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - $insert_query_template = "INSERT INTO applications (name, address, product) VALUES (:name, :address, :product)"; - $stmt = $dbh->prepare($insert_query_template); + $insert_query_template = "INSERT INTO sweepstakes (name, address, product) VALUES (:name, :address, :product)"; + $query = $dbh->prepare($insert_query_template); - $stmt->bindParam(':name', $_POST["name"], PDO::PARAM_STR); - $stmt->bindParam(':address', $_POST["address"], PDO::PARAM_STR); - $stmt->bindParam(':product', $_POST["product"], PDO::PARAM_STR); + $query->bindParam(':name', $_POST["name"]); + $query->bindParam(':address', $_POST["address"]); + $query->bindParam(':product', $_POST["product"]); - $stmt->execute(); + $query->execute(); + + $dbh = null; } ?> @@ -58,6 +58,8 @@ 応募ページに戻る + + 応募一覧ページ @@ -69,6 +71,3 @@ - - - diff --git a/src/components/DockerLink.astro b/src/components/DockerLink.astro index d525149..68401e9 100644 --- a/src/components/DockerLink.astro +++ b/src/components/DockerLink.astro @@ -7,30 +7,49 @@ } --- - - + + Docker: {Astro.props.title} - diff --git a/src/pages/sql/030-sql-on-php.mdx b/src/pages/sql/030-sql-on-php.mdx index 06aa7ca..b808a6f 100644 --- a/src/pages/sql/030-sql-on-php.mdx +++ b/src/pages/sql/030-sql-on-php.mdx @@ -16,3 +16,98 @@ ```php file=public/sample/sql/connect.php public/sample/sql/connect.php ``` + +
+ +PHPからSQLを実行するとき、大まかに以下の4つのステップに分かれています。 + +```php file=public/sample/sql/connect.php {"準備":2-9} {"接続":11-12} {"Queryを指定":17-19} {"実行":21-22} +public/sample/sql/connect.php +``` + +
+ +これを応用して、[PHP - フォームの入力を受け取る](../php/030-form) の内容に追記をして、実際にデータベースにデータを保存してみましょう。 +なお、テーブルはこのように作成してあります。 + +**sweepstakes** + +| 列名 | データ型 | 説明 | +| :----------- | :-------------- | :----------------- | +| id | INT(11) | 自動採番されるID | +| name | VARCHAR(255) | 名前 | +| address | VARCHAR(255) | 住所 | +| product | VARCHAR(255) | 希望商品 | +| created_at | DATETIME | 登録日時 | + + + +```php file=public/sample/sql/submit.php ins={3-27} collapse={32-72} +public/sample/sql/submit.php +``` + +
+ +この例では、INSERT文を実際に実行しています。 +この処理を少し詳しく見てみましょう。 + +```php file=public/sample/sql/submit.php {"テンプレートを設定":16-18} {"値を設定":20-22} {"実行":24} collapse={32-72} +public/sample/sql/submit.php +``` + +
+ +値を設定するところで、`bindParam` というメソッドを使って値を設定しています。 +これにより、追加したい値をSQLに安全に組み込むことができます。 + +例えば設定する値が文字であったときに、ダブルクォートで囲まれていなければSQLとして正しく動作しません。 +このような細かい部分を自動的に処理してくれるのが `bindParam` なのです。 + +
+
+ +実際に値を保存することができたので、次には保存したデータを表示してみましょう。 + + + +```php file=public/sample/sql/list.php +public/sample/sql/list.php +``` + +
+ +ここでは、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 +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`文でループさせて、各行のデータを表示しているというわけです。