PHP を使用するデータベース駆動型アプリケーションの作成
レッスン 3: 新規アプリケーションユーザーの作成
このレッスンでは、新規ウィッシャーの作成機能を使用してアプリケーションを拡張します。
この実装は index.php ファイルに影響し、createNewWisher.php および editWishList.php という名前の 2 つの新しいファイルが作成されます。
新規ウィッシャーの作成のユースケースは、次の 2 つの手順で構成されます。
1. ユーザーが最初のページ index.php を開き、リンクをクリックして登録する。
2. ユーザーが、新しいウィッシャーを作成するために createNewWisher.php ページに切り替える。
3. 新しいウィッシャーを作成したあと、ユーザーが editWishList.php ページに切り替え、ウィッシュリストを作成する。
現在のドキュメントは、PHP チュートリアル「NetBeans IDE for PHP での CRUD アプリケーションの作成」の一部です。
前のレッスンからのアプリケーションソースコード
MySQL ユーザー: 前のレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここをクリックします。
Oracle データベースユーザー: 前のレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここをクリックします。
新規ウィッシャーの作成を開始するリンクの追加
index.php を開きます。終了 </form> タグの下に空行を追加します。その空行に、次のコードブロックを入力します。
<br>Still don't have a wish list?! <a href="createNewWisher.php">Create now</a>
ここでは次のようになっています。
- Still don't have a wish list?! は、リンクの横のページ上に表示されるテキストです。
- <a href="createNewWisher.php"></a> は、createNewWisher.php ページを開くリンクを実装するコードです。
- Create now は、リンクとして表示されるテキストです。
新規 PHP ファイルの作成
レッスン 2 の説明に従い、プロジェクトのソースファイルに新しい PHP ファイルを 2 つ作成します。
- createNewWisher.php
- editWishList.php
editWishList.php で、「Hello!」というテキストを HTML 本文に追加するか、デフォルトの内容のままにしておきます。このファイルはあとのレッスンで変更しますが、ここでは存在する必要があります。createNewWisher.php がそのファイルを参照するためです。このレッスンでは、createNewWisher.php を変更します。
新規ウィッシャーのデータを入力するための HTML フォームの追加
次の HTML ブロックを、createNewWisher.php の PHP ブロックの下に入力またはペーストします。
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
Welcome!<br>
<form action="createNewWisher.php" method="POST">
Your name: <input type="text" name="user"/><br/>
Password: <input type="password" name="password"/><br/>
Please confirm your password: <input type="password" name="password2"/><br/>
<input type="submit" value="Register"/>
</form>
</body>
</html>
注: password 型は、文字がアスタリスクに置き換えられる、特殊なテキストフィールドの型です。コードは、ユーザーが新しいウィッシャーの名前とパスワードをテキストフィールドに入力するための HTML フォームを示します。ユーザーが「Register」ボタンをクリックすると、入力したデータが、検査のために同じページ createNewWisher.php に転送されます。
注: HTML バリデータからの警告は無視してかまいません。
データの検査とデータベースへの追加
この節では、createNewWisher.php に PHP コードを追加します。このコードは、ファイルの先頭の PHP ブロックに追加してください。PHP ブロックは、すべての HTML コード、空白行、または空白の上にある必要があります。PHP コードブロックの位置は、リダイレクト文を正しく機能させるために重要です。PHP ブロックの内部に、この節に示す次のコードブロックを記述されている順序で入力またはペーストします。
次のコードを追加し、データを検査します。
- 変数を初期化します。最初の変数はデータベースの証明書を渡します。そのほかは PHP 操作で使用される変数です。
/** database connection credentials */
$dbHost="localhost";
$dbUsername="phpuser";
$dbPasswd="phpuserpw";
/** other variables */
$userNameIsUnique = true;
$passwordIsValid = true;
$userIsEmpty = false;
$passwordIsEmpty = false;
$password2IsEmpty = false;
- 変数の下に if 節を追加します。if 節のパラメータは、ページが POST メソッド経由で同じページから要求されたものであることを確認します。そうでない場合、それ以上の検査は実行されず、ページは前述のように空のフィールドで表示されます。
if ($_SERVER["REQUEST_METHOD"] == "POST") {
}
- if 節の中括弧内に、ユーザーがウィッシャーの名前を入力したかどうかを確認するための、別の if 節を追加します。テキストフィールド「user」が空の場合は、$userIsEmpty の値が true に変わります。
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if ($_POST["user"]=="")
$userIsEmpty = true;
}
データベース接続を確立するコードを追加します。接続が確立できない場合、出力に MySQL または Oracle OCI8 のエラーが送信されます。
MySQL データベースの場合:
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if ($_POST["user"]=="") {
$userIsEmpty = true;
}
$con = mysqli_connect("localhost", "phpuser", "phpuserpw");
if (!$con) {
exit('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
//set the default client character set
mysqli_set_charset($con, 'utf-8');
}
Oracle データベースの場合:
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if ($_POST['user'] == "")
$userIsEmpty = true;
$con = oci_connect("phpuser", "phpuserpw", "localhost/XE");
if (!$con) {
$m = oci_error();
exit('Connect Error' . $m['message']);
}
}
- 「user」フィールドと名前が一致するユーザーが、すでに存在するかどうかを確認するコードを追加します。このコードは、「user」フィールド内の名前と一致する名前のウィッシャー ID 番号の検索を試みることによって、これを実行します。そのような ID 番号が存在する場合、$userNameIsUnique の値は「false」に変更されます。
MySQL データベースの場合:
if ($_SERVER["REQUEST_METHOD"] == "POST") {
Displaying error messages
if ($_POST["user"]=="") {
$userIsEmpty = true;
}
$con = mysqli_connect("localhost", "phpuser", "phpuserpw");
if (!$con) {
exit('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
//set the default client character set
mysqli_set_charset($con, 'utf-8');
mysqli_select_db($con, "wishlist");
$user = mysqli_real_escape_string($con, $_POST["user"]);
$wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='".$user."'");
$wisherIDnum=mysqli_num_rows($wisher);
if ($wisherIDnum) {
$userNameIsUnique = false;
}
}
Oracle データベースの場合:
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if ($_POST['user'] == "")
$userIsEmpty = true;
$con = oci_connect("phpuser", "phpuserpw", "localhost");
if (!$con) {
$m = oci_error();
exit('Connection Error ' . $m['message']);
}
$query = "SELECT id FROM wishers WHERE name = :user_bv";
$stid = oci_parse($con, $query);
$user = $_POST['user'];
$wisherID = null;
oci_bind_by_name($stid, ':user_bv', $user);
oci_execute($stid);
// Each user name should be unique. Check if the submitted user already exists.
$row = oci_fetch_array($stid, OCI_ASSOC);
if ($row){
$userNameIsUnique = false;
}
}
- ユーザーが一意であることを確認するコードのあとに、ユーザーがパスワードの入力と確認を正しく行ったかどうかを確認する一連の if 句を追加します。コードは、フォーム内の「Password」("password") および「Confirm Password」('password2) の各フィールドが空でなく、同一であることを確認します。そうでない場合は、それに応じて対応する boolean 変数の値が変わります。
if ($_POST["password"]=="")
$passwordIsEmpty = true;
if ($_POST["password2"]=="")
$password2IsEmpty = true;
if ($_POST["password"]!=$_POST["password2"]) {
$passwordIsValid = false;}
-
「wishers」データベースに新しいエントリを挿入するコードを追加して、if ($_SERVER['REQUEST_METHOD'] == "POST") 節を終了します。コードは、ウィッシャーの名前が一意に指定されていること、およびパスワードが有効に入力および確認されていることを確認します。条件を満たす場合、コードは HTML フォームから「user」と「password」の値を取り、wishers データベース内の新しい行の Name 列と Password 列にそれぞれ挿入します。行を作成したあと、コードはデータベース接続を切断し、アプリケーションをページ editWishList.php にリダイレクトします。
MySQL データベースの場合:
/** Check that the page was requested from itself via the POST method. */
if ($_SERVER['REQUEST_METHOD'] == "POST") {
/** Check whether the user has filled in the wisher's name in the text field "user" */
if ($_POST['user'] == "") {
$userIsEmpty = true;
}
/** Create database connection */
$con = mysqli_connect("localhost", "phpuser", "phpuserpw");
if (!$con) {
exit('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
//set the default client character set
mysqli_set_charset($con, 'utf-8');
/** Check whether a user whose name matches the "user" field already exists */
mysqli_select_db($con, "wishlist");
$user = mysqli_real_escape_string($con, $_POST['user']);
$wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='".$user."'");
$wisherIDnum=mysqli_num_rows($wisher);
if ($wisherIDnum) {
$userNameIsUnique = false;
}
/** Check whether a password was entered and confirmed correctly */
if ($_POST['password'] == "")
$passwordIsEmpty = true;
if ($_POST['password2'] == "")
$password2IsEmpty = true;
if ($_POST['password'] != $_POST['password2']) {
$passwordIsValid = false;
}
/** Check whether the boolean values show that the input data was validated successfully.
* If the data was validated successfully, add it as a new entry in the "wishers" database.
* After adding the new entry, close the connection and redirect the application to editWishList.php.
*/
if (!$userIsEmpty && $userNameIsUnique && !$passwordIsEmpty && !$password2IsEmpty && $passwordIsValid) {
$password = mysqli_real_escape_string($con, $_POST['password']);
mysqli_select_db($con, "wishlist");
mysqli_query($con, "INSERT wishers (name, password) VALUES ('" . $user . "', '" . $password . "')");
mysqli_free_result($wisher);
mysqli_close($con);
header('Location: editWishList.php');
exit;
}
}
Oracle データベースの場合:
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if ($_POST['user'] == "")
$userIsEmpty = true;
$con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
if (!$con) {
$m = oci_error();
echo $m['message'], "\n";
exit;
}
$query = "select ID from wishers where name = :user_bv";
$stid = oci_parse($con, $query);
$user = $_POST['user'];
$wisherID = null;
oci_bind_by_name($stid, ':user_bv', $user);
oci_execute($stid);
//Each user name should be unique. Check if the submitted user already exists.
$row = oci_fetch_array($stid, OCI_ASSOC);
if ($row) {
$wisherID = $row['ID'];
}
if ($wisherID != null) {
$userNameIsUnique = false;
}
//Check for the existence and validity of the password
if ($_POST['password'] == "")
$passwordIsEmpty = true;
if ($_POST['password2'] == "")
$password2IsEmpty = true;
if ($_POST['password'] != $_POST['password2']) {
$passwordIsValid = false;
}
/** Check whether the boolean values show that the input data was validated successfully.
* If the data was validated successfully, add it as a new entry in the "wishers" database.
* After adding the new entry, close the connection and redirect the application to editWishList.php.
*/
if (!$userIsEmpty && $userNameIsUnique && !$passwordIsEmpty && !$password2IsEmpty && $passwordIsValid) {
$query = "INSERT INTO wishers (name, password) VALUES (:user_bv, :pwd_bv)";
$stid = oci_parse($con, $query);
$pwd = $_POST['password'];
oci_bind_by_name($stid, ':user_bv', $user);
oci_bind_by_name($stid, ':pwd_bv', $pwd);
oci_execute($stid);
oci_free_statement($stid);
oci_close($con);
header('Location: editWishList.php');
exit;
}
}
入力フォームでのエラーメッセージの表示
ここでは、入力したデータが無効であった場合のエラーメッセージの表示を実装します。この実装は、検査と、「データの検査とデータベースへの追加」に説明されている boolean 変数の値の変更に基づいています。
- 次の PHP コードブロックを、HTML 入力フォーム内の、ウィッシャーの名前入力の下に入力します。
Welcome!<br>
<form action="createNewWisher.php" method="POST">
Your name: <input type="text" name="user"/><br/>
<?php
if ($userIsEmpty) {
echo ("Enter your name, please!");
echo ("<br/>");
}
if (!$userNameIsUnique) {
echo ("The person already exists. Please check the spelling and try again");
echo ("<br/>");
}
?>
- 次の PHP コードブロックを、HTML 入力フォーム内の、パスワード入力のコードの下に入力します。
Password: <input type="password" name="password"/><br/>
<?php
if ($passwordIsEmpty) {
echo ("Enter the password, please!");
echo ("<br/>");
}
?>
- 次の PHP コードブロックを、HTML 入力フォーム内の、パスワード確認入力のコードの下に入力します。
Please confirm your password: <input type="password" name="password2"/><br/>
<?php
if ($password2IsEmpty) {
echo ("Confirm your password, please");
echo ("<br/>");
}
if (!$password2IsEmpty && !$passwordIsValid) {
echo ("The passwords do not match!");
echo ("<br/>");
}
?>
新規ウィッシャーの作成機能のテスト
- アプリケーションを実行します。index ページが開きます。

- index ページで、テキスト「Still don't have a wish list?」の横にあるリンクをクリックします。次のフォームが開きます。

- フィールドは空のままにし、「Register」をクリックします。エラーメッセージが表示されます。

- 登録済みのウィッシャーの名前を入力します。たとえば、「Your name」フィールドに「Tom」と入力し、その他のフィールドを正しく入力して、「Register」をクリックします。エラーメッセージが表示されます。
- 「Password」および「Please confirm your password」の各フィールドに異なる値を入力し、「Register」をクリックします。エラーメッセージが表示されます。
- 「Your name」フィールドに「Bob」と入力し、両方のパスワードフィールドに同じパスワードを指定して「Register」をクリックします。表示されるページは空ですが、次のように URL が editWishList.php で終わっているため、リダイレクションは正しく渡されています。

- データがデータベースに格納されたことを確認するには、「サービス」ウィンドウの wislist1 ノードの下にある wishers に移動し、コンテキストメニューから「データを表示」を選択します。
