English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP基本チュートリアル

PHP高級チュートリアル

PHP & MySQL

PHPリファレンスマニュアル

PHP MySQL 増删改查(CRUD)

このチュートリアルでは、PHPとMySQLを使用してCRUDアプリケーションを構築する方法を学びます。

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アプリケーションを完成させました。