English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、PHPとMySQLを使用してCRUDアプリケーションを構築する方法を学びます。
CRUDとはC reate、R ead、U pdateとD eleteの略称。CRUD操作はデータベースの基本的なデータ操作です。前の章では、作成(挿入)、読み取り(選択)、更新、削除操作の実行方法を学びました。このチュートリアルでは、MySQLデータベーステーブルに対してすべての操作を実行するためのシンプルなPHPアプリケーションを作成します。
いいですね、テーブルの作成から始めましょう。すべての例でこのテーブルを使用します。
以下のSQLクエリを実行してMySQLデータベースにemployeeのテーブル。今後のすべての操作でこのテーブルを使用します。
CREATE TABLE employees ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, address VARCHAR(255) NOT NULL, salary INT(10) NOT NULL );
テーブルが作成された後、MySQLデータベースサーバーに接続するためのPHPスクリプトを作成する必要があります。以下のコードを含む“ config.php”のファイルを作成します。
その後、PHP require_once()関数を使用して、他のページにこの設定ファイルを含めます。
<?php /* データベース認証情報。 仮にMySQLが動作していると仮定します デフォルト設定のサーバー(ユーザー“ root”,パスワードなし) */ define('DB_SERVER', 'localhost'); define('DB_USERNAME', 'root'); define('DB_PASSWORD', ''); define('DB_NAME', 'demo'); /* MySQLデータベースに接続しようと試みます */ $link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME); //接続確認 if($link === false){ die("エラー:接続できません。" . mysqli_connect_error()); } ?>
首先,我们将为CRUD应用程序创建一个登录页面,该页面包含一个数据网格,其中显示了employee数据库表中的记录。它还为网格中显示的每个记录都有操作图标,您可以选择查看其详细信息,对其进行更新或删除。
我们还将在数据网格的顶部添加一个创建按钮,该按钮可用于在employee表中创建新记录。创建一个名为“ index.php”的文件,并将以下代码放入其中:
!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Dashboard</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"></script> <style type="text/css"> .wrapper{ width: 650px; margin: 0 auto; } .page-header h2{ margin-top: 0; } table tr td:last-child a{ margin-right: 15px; } </style> <script type="text/javascript"> $(document).ready(function(){ $('[data-toggle="tooltip"]').tooltip(); }); </script> </head> <body> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header clearfix"> <h2 class="pull-left">Employees Details</h2> <a href="create.php" class="btn btn-success pull-right">Add New Employee</a> </div> <?php //設定ファイルを含めます require_once "config.php"; //尝试执行选择查询 $sql = "SELECT * FROM employees"; if($result = mysqli_query($link, $sql)){ if(mysqli_num_rows($result) > 0){ echo "<table class='table table-bordered table-striped'>" echo "<thead>"; echo "<tr>"; echo "<th>#</th>" echo "<th>Name</th>" echo "<th>Address</th>" echo "<th>Salary</th>" echo "<th>Action</th>" echo "</tr>"; echo "</thead>" echo "<tbody>"; while($row = mysqli_fetch_array($result)){ echo "<tr>"; echo "<td>" . $row['id'] . "</td>"; echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['address'] . "</td>"; echo "<td>" . $row['salary'] . "</td>"; echo "<td>"; echo "<a href='read.php?id=%. $row['id'] ."' title='View Record' data-toggle='tooltip'><span class='glyphicon glyphicon}}-eye-open"></span></a>"; echo "<a href='update.php?id=%. $row['id'] ."' title='Update Record' data-toggle='tooltip'><span class='glyphicon glyphicon}}-pencil"></span></a>"; echo "<a href='delete.php?id=%. $row['id'] ."' title='Delete Record' data-toggle='tooltip'><span class='glyphicon glyphicon}}-trash'></span></a>"; echo "</td>"; echo "</tr>"; } echo "</tbody>"; echo "</table>"; // Free result set mysqli_free_result($result); } else{ echo "<p class='lead'><em>No records were found.</em></p>"; } } else{ echo "エラー:$sqlを実行できません。" . mysqli_error($link); } //接続を閉じます mysqli_close($link); ?> </div> </div> </div> </div> </body> </html>
中employeesテーブルにいくつかのレコードが入力された後、ログインページであるCRUDデータグリッドは以下のようになります:
ヒント:このCRUDアプリケーションのレイアウトを素早く、美しく作成するためにBootstrapフレームワークを使用しました。Bootstrapは、Web開発をより迅速で簡単にするための最も人気があり、機能が豊富なフロントエンドフレームワークです。
このセクションでは、CRUDアプリケーションのC create機能が使用できます。
「create.php」というファイルを作成し、以下のコードをその中に置きます。これにより、Webフォームが生成され、employeeテーブルにレコードを挿入します。
<?php //設定ファイルを読み込みます。 require_once "config.php"; //変数を定義し、空値で初期化します $name = $address = $salary = ""; $name_err = $address_err = $salary_err = ""; //フォームの提出時にフォームデータを処理します if($_SERVER["REQUEST_METHOD"] == "POST"){ // 名前のバリデーション $input_name = trim($_POST["name"]); if(empty($input_name)){ $name_err = "名前を入力してください。"; } または(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){ $name_err = "有効な名前を入力してください。"; } else{ $name = $input_name; } //住所の確認 $input_address = trim($_POST["address"]); if(empty($input_address)){ $address_err = "住所を入力してください。"; } else{ $address = $input_address; } //給料の検証 $input_salary = trim($_POST["salary"]); if(empty($input_salary)){ $salary_err = "給与額を入力してください。"; } elseif(!ctype_digit($input_salary)){ $salary_err = "正の整数を入力してください。"; } else{ $salary = $input_salary; } //データベースに挿入する前に入力エラーをチェックします if(empty($name_err) && empty($address_err) && empty($salary_err)){ //INSERT文のプレースホルダーを設定します $sql = "INSERT INTO employees (name, address, salary) VALUES (?, ?, ?)"; if($stmt = mysqli_prepare($link, $sql)){ //変数をプレースホルダとしてバインドします。 mysqli_stmt_bind_param($stmt, "sss", $param_name, $param_address, $param_salary); // パラメータを設定します $param_name = $name; $param_address = $address; $param_salary = $salary; // 準備されたステートメントの実行を試みます if(mysqli_stmt_execute($stmt)){ //レコードの作成に成功しました。ログインページにリダイレクトします。 header("location: index.php"); exit(); } else{ echo "何か問題が発生しました。少し待ってください。"; } } // ステートメントを閉じます mysqli_stmt_close($stmt); } //接続を閉じます mysqli_close($link); } ?> !DOCTYPE html> <html> <head> <meta charset="UTF-8"> タイトル:レコードの作成/title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <style type="text/css"> .wrapper{ width: 500px; margin: 0 auto; } </style> </head> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header"> <h2>レコードを作成</h2> </div> <p>このテーブルを入力して提出してください。従業員レコードをデータベースに追加します。</p> <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> <div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>"> <label>Name</label> <input type="text" name="name" class="form-control" value="<?php echo $name; ?>"> <span class="help-block"><?php echo $name_err;?>/span> </div> <div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>"> label>住所</label> <textarea name="address" class="form-control/textarea> <span class="help-block"><?php echo $address_err;?></span> </div> <div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>"> <label>給料</label> <input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>"> <span class="help-block"><?php echo $salary_err;?></span> </div> <input type="submit" class="btn btn-primary" value="提出"> <a href="index.php" class="btn btn-default">キャンセル</a> </form> </div> </div> </div> </div> </html>
同じ「create.php」ファイルはHTMLフォームを表示し、提出されたフォームデータを処理します。データを保存する前に、ユーザー入力に対する基本的なバリデーションも実行します。
CRUDアプリケーションの構築に進みましょう。R 読み取り機能を実装しました。
「read.php」というファイルを作成し、以下のコードをその中に配置します。これは、以下の基準に基づいて従業員のid属性を従業員テーブルからレコードを検索します。
<?php // idパラメータが存在するか確認してからさらに処理を行います if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){ //設定ファイルを含めます require_once "config.php"; //SELECT文 $sql = "SELECT * FROM employees WHERE id = ?"; if($stmt = mysqli_prepare($link, $sql)){ //変数をプレースホルダとしてバインドします。 mysqli_stmt_bind_param($stmt, "i", $param_id); //设置参数 $param_id = trim($_GET["id"]); //プレースホルダーステートメントを実行しようとしました if(mysqli_stmt_execute($stmt)){ $result = mysqli_stmt_get_result($stmt); if(mysqli_num_rows($result) == 1){ /* 提取结果行作为关联数组。 由于结果集仅包含一行,因此我们不需要使用while循环*/ $row = mysqli_fetch_array($result, MYSQLI_ASSOC); //检索单个字段值 $name = $row["name"]; $address = $row["address"]; $salary = $row["salary"]; } else{ //URLには有効なidパラメータが含まれていません。エラーページにリダイレクトします header("location: error.php"); exit(); } } else{ echo "ああ!何か問題が発生しました。もう少し待ってください。"; } } // ステートメントを閉じます mysqli_stmt_close($stmt); //接続を閉じます mysqli_close($link); } else{ //URLにはidパラメータが含まれていません。エラーページにリダイレクトします。 header("location: error.php"); exit(); } ?> !DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>レコードを確認</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <style type="text/css"> .wrapper{ width: 500px; margin: 0 auto; } </style> </head> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header"> <h1>レコードを確認</h1> </div> <div class="form-group"> <label>Name</label> <p class="form-control-static"><?php echo $row["name"]; ?><//p> </div> <div class="form-group"> label>住所</label> <p class="form-control-static"><?php echo $row["address"]; ?><//p> </div> <div class="form-group"> <label>給料</label> <p class="form-control-static"><?php echo $row["salary"]; ?><//p> </div> <p><a href="index.php" class="btn btn-primary">戻る</a></p> </div> </div> </div> </div> </html>
同様に、私たちのCRUDアプリケーションのUPDATE機能を構築できます。
「update.php」というファイルを作成し、以下のコードをその中に配置します。これは、以下の基準に基づいて従業員のid属性を更新従業員テーブルの既存のレコード。
<?php //設定ファイルを含めます require_once "config.php"; //変数を定義し、空値で初期化します $name = $address = $salary = ""; $name_err = $address_err = $salary_err = ""; //フォームの提出時にフォームデータを処理します if(isset($_POST["id"]) && !empty($_POST["id"])){ // 隠された入力値の取得 $id = $_POST["id"]; // 名前のバリデーション $input_name = trim($_POST["name"]); if(empty($input_name)){ $name_err = "名前を入力してください."; } または(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){ $name_err = "有効な名前を入力してください。"; } else{ $name = $input_name; } // 住所の検証 $input_address = trim($_POST["address"]); if(empty($input_address)){ $address_err = "住所を入力してください。"; } else{ $address = $input_address; } //給料の検証 $input_salary = trim($_POST["salary"]); if(empty($input_salary)){ $salary_err = "給料金額を入力してください。"; } elseif(!ctype_digit($input_salary)){ $salary_err = "正の整数を入力してください。"; } else{ $salary = $input_salary; } //データベースに挿入する前に入力エラーを確認 if(empty($name_err) && empty($address_err) && empty($salary_err)){ //UPDATE文 $sql = "UPDATE employees SET name=?, address=?, salary=? WHERE id=?"; if($stmt = mysqli_prepare($link, $sql)){ //変数をプレースホルダとしてバインドします。 mysqli_stmt_bind_param($stmt, "sssi", $param_name, $param_address, $param_salary, $param_id); //设置参数 $param_name = $name; $param_address = $address; $param_salary = $salary; $param_id = $id; //準備されたステートメントを実行しようとします if(mysqli_stmt_execute($stmt)){ //更新が成功しました。ログインページにリダイレクト header("location: index.php"); exit(); } else{ echo "少し問題がありました。もう少し待ってください。"; } } // ステートメントを閉じます mysqli_stmt_close($stmt); } //接続を閉じます mysqli_close($link); } else{ //idパラメータが存在するか確認してからさらに処理を行います if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){ //URLパラメータを取得 $id = trim($_GET["id"]); //select文 $sql = "SELECT * FROM employees WHERE id = ?"; if($stmt = mysqli_prepare($link, $sql)){ //変数をプレースホルダとしてバインドします。 mysqli_stmt_bind_param($stmt, "i", $param_id); //设置参数 $param_id = $id; //準備されたステートメントを実行しようとします if(mysqli_stmt_execute($stmt)){ $result = mysqli_stmt_get_result($stmt); if(mysqli_num_rows($result) == 1){ /* 提取结果行作为关联数组。 由于结果集仅包含一行,因此我们不需要使用while循环 */ $row = mysqli_fetch_array($result, MYSQLI_ASSOC); //检索单个字段值 $name = $row["name"]; $address = $row["address"]; $salary = $row["salary"]; } else{ //URL不包含有效的ID。 重定向至错误页面 header("location: error.php"); exit(); } } else{ echo "ああ!何か問題が発生しました。もう少し待ってください。"; } } // ステートメントを閉じます mysqli_stmt_close($stmt); //接続を閉じます mysqli_close($link); } else{ //URLにはidパラメータが含まれていません。エラーページにリダイレクトします。 header("location: error.php"); exit(); } } ?> !DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Update Record</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> <style type="text/css"> .wrapper{ width: 500px; margin: 0 auto; } </style> </head> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="page-header"> <h2>更新记录</h2> </div> <p>请编辑输入值并提交以更新记录。</p> <form action="<?php echo htmlspecialchars(basename($_SERVER['REQUEST_URI'])); ?>" method="post"> <div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>"> <label>Name</label> <input type="text" name="name" class="form-control" value="<?php echo $name; ?>"> <span class="help-block"><?php echo $name_err;?>/span> </div> <div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>"> label>住所</label> <textarea name="address" class="form-control/textarea> <span class="help-block"><?php echo $address_err;?></span> </div> <div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>"> <label>給料</label> <input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>"> <span class="help-block"><?php echo $salary_err;?></span> </div> <input type="hidden" name="id" value="<?php echo $id; ?>"/> <input type="submit" class="btn btn-primary" value="提出"> <a href="index.php" class="btn btn-default">キャンセル</a> </form> </div> </div> </div> </div> </html>
最後に、以下を構築します。d私たちのCRUDアプリケーションの削除機能に基づいています。
「delete.php」というファイルを作成し、以下のコードを入れてください。これは従業員のid属性は従業員テーブルから既存のレコードを削除します。
<?php //確認後、削除操作を実行します。 if(isset($_POST["id"]) && !empty($_POST["id"])){ //設定ファイルを読み込みます。 require_once "config.php"; //DELETE文 $sql = "DELETE FROM employees WHERE id = ?"; if($stmt = mysqli_prepare($link, $sql)){ //変数をプレースホルダとしてバインドします。 mysqli_stmt_bind_param($stmt, "i", $param_id); // パラメータを設定します $param_id = trim($_POST["id"]); //準備されたステートメントを実行しようとします if(mysqli_stmt_execute($stmt)){ //レコードの削除が成功しました。ログインページにリダイレクトします。 header("location: index.php"); exit(); } else{ echo "ああ!何か問題が発生しました。もう少し待ってください。"; } } // ステートメントを閉じます mysqli_stmt_close($stmt); //接続を閉じます mysqli_close($link); } else{ //idパラメータが存在するか確認 if(empty(trim($_GET["id"]))){ //URLにはidパラメータが含まれていません。エラーページにリダイレクトします。 header("location: error.php"); exit(); } } ?> <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> <div class="alert alert-danger fade in"> <input type="hidden" name="id" value="<?php echo trim($_GET["id"]); ?>"/> <p>このレコードを削除してもよろしいですか?</p><br> <p> <input type="submit" value="はい" class="btn btn-danger"> <a href="index.php" class="btn btn-default">いいえ</a> </p> </div> </form>
最後に、ファイル「error.php」を作成しましょう。リクエストが無効である場合、URLのクエリストリングにidパラメータが欠けているか、無効であると表示されます。
<h1>無効なリクエスト</h1> <div class="alert alert-danger fade in"> <p>申し訳ありませんが、ご提案いただいたリクエストは無効です。 <a href="index.php" class="alert-link">戻る</a>もう一度試してください.</p> </div>
長い旅を終え、ついにPHPとMySQLを使ってCRUDアプリケーションを完成させました。