English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 PHP와 MySQL을 사용하여 CRUD 애플리케이션을 구축하는 방법을 배울 것입니다.
CRUD는C CREATE,R READ,U UPDATE와D DELETE의 약자입니다. CRUD 작업은 데이터베이스의 기본 데이터操作입니다. 이전 장에서는 생성(즉, 삽입), 읽기(즉, 선택), 업데이트 및 삭제 작업을 수행하는 방법을 배웠습니다. 이 튜토리얼에서는 MySQL 데이터베이스 테이블에 모든 이러한 작업을 수행할 수 있는 간단한 PHP 애플리케이션을 생성하겠습니다.
좋습니다. 테이블 생성부터 시작해 보겠습니다. 모든 예제에서 이 테이블을 사용하겠습니다.
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数据网格可能看起来如下图所示:
提示:我们使用了Bootstrap框架来快速,精美地制作此CRUD应用程序布局。Bootstrap是最流行,功能最强大的前端框架,用于更快,更轻松地响应Web开发。
在本节中,我们将构建CRUD应用程序的C reate功能。
让我们创建一个名为“ create.php”的文件,并将以下代码放入其中。它将生成一个Web表单,可用于在employee表中插入记录。
<?php //구성 파일을 포함합니다 require_once "config.php"; //定义变量并使用空值进行初始化 $name = $address = $salary = ""; $name_err = $address_err = $salary_err = ""; //提交表单时处理表单数据 if($_SERVER["REQUEST_METHOD"] == "POST"){ // Validate name $input_name = trim($_POST["name"]); if(empty($input_name)){ $name_err = "请输入一个名字。"; } elif(!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; // Attempt to execute the prepared statement 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"> Create 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($_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>Address</label> <textarea name="address" class="form-control"><?php echo $address; ?>"/textarea> <span class="help-block"><?php echo $address_err;?></span> </div> <div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>"> <label>Salary</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 ead功能了。
让我们创建一个名为“ read.php”的文件,并将以下代码放入其中。它将仅根据직원的id属性从employees表中检索记录。
<?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>View 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"> <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>Address</label> <p class="form-control-static"><?php echo $row["address"]; ?></p> </div> <div class="form-group"> <label>Salary</label> <p class="form-control-static"><?php echo $row["salary"]; ?></p> </div> <p><a href="index.php" class="btn btn-primary">Back</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"])){ // Get hidden input value $id = $_POST["id"]; // Validate name $input_name = trim($_POST["name"]); if(empty($input_name)){ $name_err = "Please enter a name."; } elif(!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>Address</label> <textarea name="address" class="form-control"><?php echo $address; ?>"/textarea> <span class="help-block"><?php echo $address_err;?></span> </div> <div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>"> <label>Salary</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>
마지막으로 우리는dCRUD 애플리케이션의 삭제 기능에 따라
우리가 "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="Yes" class="btn btn-danger"> <a href="index.php" class="btn btn-default">No</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 애플리케이션을 완료했습니다.