こんにちは、takaです。
「$_POST」。
いきなり何だ、と思われるかもしれませんがこの変数しっかり分かってますか?
PHPを学習する上で非常に重要な概念ですが、初心者がつまずく最初のところではないでしょうか。もちろん、僕もつまずきました。
今回は一体この「$_POST」が何者なのか、そして実際にどのようにデータベースに値が挿入されるのかを、追っていきたいと思います。
この記事を読むことで、あやふやだった$_POSTの理解が深まりますよ。
まずは$_POSTくんを知ろう。
$_POSTくんと仲良くなるには、「そもそもこいつはどういう奴か」を知る必要があります。
人間と一緒でその人がどういう性格で何が好きかを知らないと、仲良く出来ないのと一緒です。
ここでは、$_POSTを理解する上で外せない三つのことを見ていきます。
①スーパーグローバル変数
いきなりカッコイイ名前が出てきましたね。
これ、僕が勝手に作ったんじゃなくてもともとPHPで定義されている変数として最初からあるものなんです。
(https://www.php.net/manual/ja/language.variables.superglobals.php)
じゃあ「どんな変数なの?」と言うことですが、シンプルに定義すると下記の通りです。
全てのスコープから呼び出せる変数である。
「は?スコープ?」ってなった方、安心してください。僕も同じでした。
PHPでこの「スコープ」って考え方はとっても大切です。上記を理解するには、まずこのスコープを理解していきます。
スコープとは?
先に出てきたこの「スコープ」と言う言葉。これは何を表しているかと言うと、「変数の有効範囲」を意味しています。
主にスコープにはグローバルスコープとローカルスコープがあります。両者の有効範囲はざっくりお伝えすると下記の通りです。
グローバルスコープ
有効範囲=コード全体
ローカルスコープ
有効範囲=関数内
一体どう言うことなのか、を実際にコードを参照しつつ見ていきます。
<?php
$num = 3; //グローバルスコープ変数
function test1() {
$num = 5; //ローカルスコープ変数
}
echo $num;
?>
同じ変数「$num」が二回登場してきました。一つは関数の外で、もう一つは関数の中で。
さて、最後の行にある「echo $num」で出力されるのは、3でしょうか5でしょうか。
正解は「3」です。
「$num=5」はあくまでtest1()という関数内でのみ通用するもの(ローカルなもの)で、その関数から一歩外に出ると使用出来なくなります。
逆に関数の外で定義した「$num=3」はグローバルスコープ変数なので、コードのどこから呼び出してもOKです。
また、「関数の中からグローバルスコープの変数を使いたい」といった時には、変数の前に「global」とつけてやる必要があります。
さて、最初の話しに戻ります。
一番始めに、$_POSTはスーパーグローバル変数であるとお伝えしました。そしてその定義は「全てのスコープから呼び出せる変数である」としています。
つまり$_POSTはグローバルだろうがローカルだろうが、どこでも使える変数だということです。
先の説明の中で関数の中からグローバルスコープ変数を使用する際は、変数の前に「global」をつける必要がある、とお伝えしましたが$_POSTはその必要すらありません。だってスーパーですから。どこからでも呼び出してもOK、となっていますからね。
これが$_POSTくんの一つ目の特徴である「スーパーグローバル変数」です。
② 値は連想配列の形式で入る
$_POSTくんを理解するための二つ目の特徴は、「連想配列形式で値が入る」と言うことです。
また出ましたね、わからない言葉が。
そう、「連想配列」です。でもこれもPHPを勉強する上ではとーっても大事なものです。
一緒に見ていきましょう。
連想配列とは?
連想配列を理解するには、まず配列を知る必要があります。
<? php
$fruits = array("apple", "grape", "banana");
echo $fruits[0]; //結果はapple
?>
$変数 = array(“”);とすることで変数に()内の値が入る。順番は[0]から始まり、[1],[2],[3]・・・と続く。
この[0],[1]・・・をインデックスや添え字と呼ぶ。(僕は背番号だと思ってます)
値を取り出す時は、値を入れた変数[インデックス]とすることでその値を取り出すことができる。
複数の値を入れておける便利な配列ですが、一つ難点があるとすれば「値を取り出したいときに番号だけだとわかりづらい!」というところ。そんな問題を解決してくれるのが連想配列さん。
<?php
$fruits = array(
"apple" => "冬の味覚",
"grape" => "秋の味覚",
"banana" => "夏の味覚"
);
echo $fruits[apple] // 冬の味覚
まあ簡単にいうと、「番号だと値を取り出すときに分かりづらいから、好きな名前をつけて値を取り出しやすくしようぜ」的なことです。
ここでのapple/grape/bananaを「キー名」と呼びます。これ大事なので覚えてね!
連想配列は「キー名 => 値」とすることで値をセットできます。上記の例で言うと、
“apple” => “冬の味覚”
「appleっていうキーに冬の味覚っていう値をいれて!」
というイメージです。
つまり、「$_POSTは連想配列の形式で値が入る」ということは「キー名 =>値」という形式で値が入る、ということですね。
ここで気になるのは、「え、じゃあこのキー名と値ってどうやって決まるの?」ということだと思います。
それが次の<form>タグへの話しと繋がってきます。
③ $_POSTの値は<form>タグをつかう
さて、先の説明の中で「$_POSTのキー名と値はどうやって決まるのか?」という疑問が出てきました。
結論からお伝えすると、それは
「フォームタグ内にあるinputタグやselectタグなどの、name属性がキー名となり、そこに入力された値がそのまま値となる」
ということになります。
ということになります、と言われてもさっぱりイメージが湧かないので、具体的にコードを見ていきましょう。
<sample.html>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>ユーザー登録</title>
</head>
<body>
<h1>ユーザー登録画面</h1>
<form action="signUp.php" method="post">
<p>お名前(必須)<br>
<input type="text" name="name"></p>
<p>年齢<br>
<input type="text" name="age"></p>
<p>お住まいの地域<br>
<input type="text" name="locate"></p>
<p><input type="submit" value="登録する"></p>
</form>
</body>
</html>
まず大事なのはこの部分。
<form action=”signUp.php” method=”post”>
action =”signUp.php” →「登録する」というボタン(submit)を押すと、signUp.phpというファイルに画面を遷移してね、という意味。
method = “post” →これをformタグにつけることで$_POSTが使用できるようになる。
次にinputタグ部分を見ていくと、
<input type=”text” name=”name”>
name=”name” →ここの”name”が、先に説明した$_POSTのキー名となる。
type=”text” →ここにユーザーが入力した値がそのまま$_POSTの値となる。
例えば、下記のように入力したとすると、
それぞれの$_POSTの値は次のようにセットされている。
$_POST =array(
“name” => “山田太郎”,
“age” => 28,
“location” => “鳥取”
);
この状態で一番下にある「登録する」を押すと、先ほどのactionで指定した「signUp.php」に画面が遷移する。
データベースへデータ挿入する
ここまで、「$_POSTとは何か?」ということを見ていきました。
次に見ていきたいのは、「じゃあ、実際にどうやってデータベースにデータ(値)が入っていくのか」ということです。
まず、挿入するデータベースは下記のものを想定します。
データベース=[sample_php01]
テーブル=[users]
挿入するデータは、$_POSTのところで説明するために使用した山田太郎さんのデータとします。
流れとしては、sample.htmlで入力してもらった値をそのままデータベースに入れるイメージです。
sample.htmlで最後に「登録する」というボタンを押すと、actionにある「signUp.php」に画面が遷移します。
そこで、データベースへの登録を行うコードを書いておけば、「登録する」というボタンが押されると同時に、上の「users」テーブルへとデータが挿入される、という流れです。
<signUp.php>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザー登録</title>
</head>
<body>
<?php
try{
$name = $_POST['name']; //山田太郎
$age = $_POST['age']; //28
$locate = $_POST['locate']; //鳥取
//データを扱いやすくするために、$_POSTのそれぞれの値を変数にいれてます。
$dsn = 'mysql:dbname=php_sample01;host=localhost;charset=utf8';
$username = 'root';
$password = 'root';
$options = array(
PDO::ATTR_ERRMODE =>PDO::ERRMODE_SILENT,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO($dsn, $username, $password, $options); //PDOを用いて接続準備
$sql = 'INSERT INTO users (name, age, locate) VALUES (:name, :age, :locate)';
$data = array(':name' => $name, ':age' => $age, ':locate' => $locate);
//先にSQL文とexcecuteで使う配列データをそれぞれ変数にいれておく。
$stmt = $dbh->prepare($sql);
$stmt->execute($data);
//値のバインドを省略したタイプで、データベースへデータを挿入する。
print 'データベースへ情報を追加しました。';
} catch (Exception $e) {
print 'データベースへの接続失敗。';
}
?>
</body>
</html>
*「何をしているのかさっぱりわからん! try? PDO? いきなり何で出てきたの?」という方はこちらをどうぞ。
こんにちはtakaです。 PHPを学習していく上で切っても切れない「データベース」との関係。 PDOやらtry~catchやら、最初に見た時は「何を言ってるの?」と感じた方、多いと思います。もちろん僕も。 今回の記事ではそんな[…]
<ブラウザ画面>
<データベース側>
まず大事なのは、$_POSTの特徴とデータベースへの接続の流れを知ること
ここまで、$_POSTがどういう役割を持っていて実際にデータベースにデータを挿入するにはどのようにコードを書けばいいのかをみてきました。
ただ、今回はとってもシンプルなコードに絞ってます。実際はバリデーションチェックと言って名前や年齢、地域名が本当に合っているのかということをチェックする必要があったり、各入力項目にはエスケープ処理をするために変数に「htmlspecialchars」を施したりと、かなり複雑なプログラムを組む必要があります。
でも、まず大事なことは「一体$_POSTってどんな役割を持っていて、なぜこいつがいることでデータベースの値を挿入したり、参照したりできるんだ?」ということを、始めに理解する、ということです。
それを理解しないまま上記のようなバリデーションチェックやエスケープ処理をしても、核となる概念を理解しないままでは結局何をしているのか見失ってしまいます。
実際僕もここの理解があやふやなまま学習を進めた結果、「結局、いまやっていることは何だろう?」と迷ってしまうことがありました。
一度に理解するのは大変かもしれません。
スコープの話しや連想配列など、聞きなれない言葉も出て来ていっぱいいっぱいになりますよね。
でも、今回ご紹介した「$_POST」って本当に大事な概念です。
その基礎の部分をしっかりと抑えておくだけでも、今後の学習に大きく役立ってくれると思います。
これからの学習の中で、少しでもこの記事が役に立ってくれると嬉しいです。
自分もまだまだ勉強中ですが、自分と同じように悩んでいる方の一助になれると幸いです。
ではまた!