HTMLフォームを作成し、$_POST
でデータを受け取れるようになりました。次はいよいよ、そのデータをINSERT
文でデータベースに保存するステップです。しかし、その前に一つ、非常に重要でありながら見落としがちな準備作業があります。
それが、受け取ったデータの**「データ型」を、データベースのテーブル設計に合わせて正しく変換する**ことです。
この記事では、なぜ型変換が必要なのか、そしてPHPの「型キャスト」を使って安全にデータを準備する方法を解説します。
1. なぜ「型変換」が重要なのか?
$_POST
や$_GET
で受け取った値は、たとえユーザーが123
と数字を入力したとしても、PHP上ではすべて**string
(文字列)型**として扱われます。
一方、データベースのテーブルでは、id
やrating
(評価)のようなカラムは**INT
(整数)型**として設計されていることがほとんどです。
この型の不一致を放置すると、以下のような問題が起こる可能性があります。
- データ整合性の低下: データベースは
INT
型のカラムに文字列の"5"
が送られてきても、気を利かせて数値の5
に自動変換してくれることがあります。しかし、この「暗黙の型変換」に頼るのは危険です。予期せぬ挙動や、データベースの種類・設定によってはエラーが発生する原因となり、データの整合性が損なわれる可能性があります。 - 意図しないバグの発生: 例えば
"5abc"
のような不正な文字列が送られた場合、データベースによっては5
として登録されてしまうなど、意図しない挙動に繋がることがあります。
プログラム側で**「このデータは整数です」と明示的に型を変換(キャスト)**してからデータベースに渡すことで、これらのリスクを防ぎ、より堅牢で予測可能なアプリケーションを構築できます。
2. PHPの「型キャスト」で型を揃える
PHPで変数のデータ型を変換するには**「型キャスト」**という機能を使います。変数の前に (変換したい型)
を記述するだけで、簡単に型を変換できます。
データベース登録前によく使うのは、文字列を整数に変換する(int)
です。
型キャストの例:
<?php
// $_POST['rating'] の中身が文字列の "5" だったと仮定
$rating_string = $_POST['rating'];
var_dump($rating_string); // 出力: string(1) "5"
// (int) で整数型にキャスト
$rating_integer = (int)$_POST['rating'];
var_dump($rating_integer); // 出力: int(5)
?>
var_dump
の結果を見ると、データ型がstring
からint
に正しく変換されていることが分かります。
3. 実装例:安全なデータ登録準備スクリプト
それでは、フォームから「読書レビュー」のデータを受け取り、バリデーションと型キャストを行って、データベースに登録する準備を整えるまでの流れをまとめたコードを見てみましょう。
add.php
のサンプルコード:
<?php
// このスクリプトはフォームからのPOST送信でのみ実行される
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
exit('不正なリクエストです。');
}
try {
// --- 1. バリデーション(入力値チェック) ---
if (empty($_POST['book_title'])) {
throw new Exception('書籍名は必須です。');
}
// 評価が空、または半角数字でなければエラー
if (empty($_POST['rating']) || !ctype_digit($_POST['rating'])) {
throw new Exception('評価は半角数字で入力してください。');
}
// --- 2. 受け取ったデータを変数に格納 ---
$book_title = $_POST['book_title'];
$rating = $_POST['rating'];
$review_text = $_POST['review_text'];
// --- 3. データベースの型に合わせた型変換(キャスト) ---
$rating_int = (int)$rating;
// --- 4. データベースへの登録処理 ---
// この$book_title, $rating_int, $review_text を使ってINSERT文を実行する
/*
(データベース接続... $pdo)
$sql = "INSERT INTO reviews (book_title, rating, review_text) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
// execute()にはキャスト済みの変数を渡す
$stmt->execute([$book_title, $rating_int, $review_text]);
*/
echo "受け付け完了。以下のデータで登録準備ができました。<br>";
echo "書籍名: " . htmlspecialchars($book_title, ENT_QUOTES, 'UTF-8') . "<br>";
echo "評価: " . htmlspecialchars($rating_int, ENT_QUOTES, 'UTF-8') . "<br>";
echo "---- var_dumpによる型情報 ----<br>";
var_dump($book_title);
var_dump($rating_int);
} catch (Exception $e) {
echo "エラー: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8');
}
?>
コードの流れ:
- まず、データが空でないか、期待する形式(数字かなど)かをバリデーションします。
- バリデーションを通過したデータを、扱いやすいように一度変数に格納します。
- データベースの
INT
型カラムに対応させる$rating
を、(int)
でキャストして整数型に変換します。 - 型を整えたこれらの変数を、
INSERT
文のプレースホルダに渡して実行します。
まとめ
$_POST
から受け取った値は、たとえ数字でも文字列型。- データベースに
INSERT
する前には、テーブルのカラム定義に合わせてデータ型を変換するのが基本。 - 文字列を整数に変換するには**
(int)
キャスト**を使う。 - **「バリデーション → 型キャスト → データベース登録」**という流れを徹底することで、データの整合性が保たれ、バグの少ない堅牢なアプリケーションになる。
このひと手間が、アプリケーションの品質を大きく左右します。データベースに値を渡す前の型変換を、常に意識するようにしましょう。