在本教程中,您將學(xué)習(xí)如何使用PHP和MySQL構(gòu)建CRUD應(yīng)用程序。
CRUD是C reate,R ead,U pdate和D elete 的首字母縮寫(xiě)。CRUD操作是數(shù)據(jù)庫(kù)的基本數(shù)據(jù)操作。在前面的章節(jié)中,我們已經(jīng)學(xué)習(xí)了如何執(zhí)行創(chuàng)建(即插入),讀?。催x擇),更新和刪除操作。在本教程中,我們將創(chuàng)建一個(gè)簡(jiǎn)單的PHP應(yīng)用程序,以便在一處對(duì)MySQL數(shù)據(jù)庫(kù)表執(zhí)行所有這些操作。
好吧,讓我們從創(chuàng)建表開(kāi)始,我們將在所有示例中使用該表。
執(zhí)行以下SQL查詢以在MySQL數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為employees的表。我們將在以后的所有操作中使用此表。
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 );
創(chuàng)建表后,我們需要?jiǎng)?chuàng)建一個(gè)PHP腳本以連接到MySQL數(shù)據(jù)庫(kù)服務(wù)器。讓我們創(chuàng)建一個(gè)名為“ config.php”的文件,并將以下代碼放入其中。
稍后,我們將使用PHP require_once()函數(shù)將此配置文件包含在其他頁(yè)面中。
<?php
/* 數(shù)據(jù)庫(kù)憑證。 假設(shè)您正在運(yùn)行MySQL
具有默認(rèn)設(shè)置的服務(wù)器(用戶“ root”,無(wú)密碼) */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'demo');
/* 嘗試連接到MySQL數(shù)據(jù)庫(kù) */
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
//檢查連接
if($link === false){
die("錯(cuò)誤:無(wú)法連接。 " . mysqli_connect_error());
}
?>首先,我們將為CRUD應(yīng)用程序創(chuàng)建一個(gè)登錄頁(yè)面,該頁(yè)面包含一個(gè)數(shù)據(jù)網(wǎng)格,其中顯示了employee數(shù)據(jù)庫(kù)表中的記錄。它還為網(wǎng)格中顯示的每個(gè)記錄都有操作圖標(biāo),您可以選擇查看其詳細(xì)信息,對(duì)其進(jìn)行更新或刪除。
我們還將在數(shù)據(jù)網(wǎng)格的頂部添加一個(gè)創(chuàng)建按鈕,該按鈕可用于在employee表中創(chuàng)建新記錄。創(chuàng)建一個(gè)名為“ 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";
//嘗試執(zhí)行選擇查詢
$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 "錯(cuò)誤:無(wú)法執(zhí)行 $sql. " . mysqli_error($link);
}
//關(guān)閉連接
mysqli_close($link);
?>
</div>
</div>
</div>
</div>
</body>
</html>在employees表中填充了一些記錄后,登錄頁(yè)面即CRUD數(shù)據(jù)網(wǎng)格可能看起來(lái)如下圖所示:
提示:我們使用了Bootstrap框架來(lái)快速,精美地制作此CRUD應(yīng)用程序布局。Bootstrap是最流行,功能最強(qiáng)大的前端框架,用于更快,更輕松地響應(yīng)Web開(kāi)發(fā)。
在本節(jié)中,我們將構(gòu)建CRUD應(yīng)用程序的C reate功能。
讓我們創(chuàng)建一個(gè)名為“ create.php”的文件,并將以下代碼放入其中。它將生成一個(gè)Web表單,可用于在employee表中插入記錄。
<?php
//包含配置文件
require_once "config.php";
//定義變量并使用空值進(jìn)行初始化
$name = $address = $salary = "";
$name_err = $address_err = $salary_err = "";
//提交表單時(shí)處理表單數(shù)據(jù)
if($_SERVER["REQUEST_METHOD"] == "POST"){
// Validate name
$input_name = trim($_POST["name"]);
if(empty($input_name)){
$name_err = "請(qǐng)輸入一個(gè)名字。";
} elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
$name_err = "請(qǐng)輸入有效的名稱。";
} else{
$name = $input_name;
}
//驗(yàn)證地址
$input_address = trim($_POST["address"]);
if(empty($input_address)){
$address_err = "Please enter an address.";
} else{
$address = $input_address;
}
//驗(yàn)證薪水
$input_salary = trim($_POST["salary"]);
if(empty($input_salary)){
$salary_err = "請(qǐng)輸入薪資金額。";
} elseif(!ctype_digit($input_salary)){
$salary_err = "請(qǐng)輸入一個(gè)正整數(shù)。";
} else{
$salary = $input_salary;
}
//插入數(shù)據(jù)庫(kù)之前檢查輸入錯(cuò)誤
if(empty($name_err) && empty($address_err) && empty($salary_err)){
//預(yù)處理INSERT語(yǔ)句
$sql = "INSERT INTO employees (name, address, salary) VALUES (?, ?, ?)";
if($stmt = mysqli_prepare($link, $sql)){
//將變量作為參數(shù)綁定到預(yù)處理語(yǔ)句
mysqli_stmt_bind_param($stmt, "sss", $param_name, $param_address, $param_salary);
// Set parameters
$param_name = $name;
$param_address = $address;
$param_salary = $salary;
// Attempt to execute the prepared statement
if(mysqli_stmt_execute($stmt)){
//已成功創(chuàng)建記錄。 重定向至登錄頁(yè)面
header("location: index.php");
exit();
} else{
echo "出了些問(wèn)題。 請(qǐng)稍后再試。";
}
}
// Close statement
mysqli_stmt_close($stmt);
}
//關(guān)閉連接
mysqli_close($link);
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>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>創(chuàng)建記錄</h2>
</div>
<p>請(qǐng)?zhí)顚?xiě)此表格并提交以將員工記錄添加到數(shù)據(jù)庫(kù)中。</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="Submit">
<a href="index.php" class="btn btn-default">Cancel</a>
</form>
</div>
</div>
</div>
</div>
</html>相同的“ create.php”文件將顯示HTML表單并處理提交的表單數(shù)據(jù)。在保存數(shù)據(jù)之前,它還將對(duì)用戶輸入執(zhí)行基本驗(yàn)證。
現(xiàn)在該構(gòu)建CRUD應(yīng)用程序的R ead功能了。
讓我們創(chuàng)建一個(gè)名為“ read.php”的文件,并將以下代碼放入其中。它將僅根據(jù)雇員的id屬性從employees表中檢索記錄。
<?php
// 在進(jìn)一步處理之前檢查id參數(shù)是否存在
if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){
//包括配置文件
require_once "config.php";
//SELECT語(yǔ)句
$sql = "SELECT * FROM employees WHERE id = ?";
if($stmt = mysqli_prepare($link, $sql)){
//將變量作為參數(shù)綁定到預(yù)處理語(yǔ)句
mysqli_stmt_bind_param($stmt, "i", $param_id);
//設(shè)置參數(shù)
$param_id = trim($_GET["id"]);
//嘗試執(zhí)行預(yù)處理語(yǔ)句
if(mysqli_stmt_execute($stmt)){
$result = mysqli_stmt_get_result($stmt);
if(mysqli_num_rows($result) == 1){
/* 提取結(jié)果行作為關(guān)聯(lián)數(shù)組。 由于結(jié)果集僅包含一行,因此我們不需要使用while循環(huán)*/
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
//檢索單個(gè)字段值
$name = $row["name"];
$address = $row["address"];
$salary = $row["salary"];
} else{
//URL不包含有效的id參數(shù)。 重定向至錯(cuò)誤頁(yè)面
header("location: error.php");
exit();
}
} else{
echo "哎呀! 出了點(diǎn)問(wèn)題。 請(qǐng)稍后再試。";
}
}
// Close statement
mysqli_stmt_close($stmt);
//關(guān)閉連接
mysqli_close($link);
} else{
//URL不包含id參數(shù)。 重定向至錯(cuò)誤頁(yè)面
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應(yīng)用UPDATE功能。
讓我們創(chuàng)建一個(gè)名為“ update.php”的文件,并將以下代碼放入其中。它將根據(jù)雇員的id屬性更新雇員表中的現(xiàn)有記錄。
<?php
//包括配置文件
require_once "config.php";
//定義變量并使用空值進(jìn)行初始化
$name = $address = $salary = "";
$name_err = $address_err = $salary_err = "";
//提交表單時(shí)處理表單數(shù)據(jù)
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.";
} elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
$name_err = "Please enter a valid name.";
} else{
$name = $input_name;
}
// Validate address address
$input_address = trim($_POST["address"]);
if(empty($input_address)){
$address_err = "Please enter an address.";
} else{
$address = $input_address;
}
//驗(yàn)證薪水
$input_salary = trim($_POST["salary"]);
if(empty($input_salary)){
$salary_err = "請(qǐng)輸入薪水金額。";
} elseif(!ctype_digit($input_salary)){
$salary_err = "請(qǐng)輸入一個(gè)正整數(shù)值。";
} else{
$salary = $input_salary;
}
//在插入數(shù)據(jù)庫(kù)之前檢查輸入錯(cuò)誤
if(empty($name_err) && empty($address_err) && empty($salary_err)){
//UPDATE語(yǔ)句
$sql = "UPDATE employees SET name=?, address=?, salary=? WHERE id=?";
if($stmt = mysqli_prepare($link, $sql)){
//將變量作為參數(shù)綁定到預(yù)處理語(yǔ)句
mysqli_stmt_bind_param($stmt, "sssi", $param_name, $param_address, $param_salary, $param_id);
//設(shè)置參數(shù)
$param_name = $name;
$param_address = $address;
$param_salary = $salary;
$param_id = $id;
//嘗試執(zhí)行準(zhǔn)備好的語(yǔ)句
if(mysqli_stmt_execute($stmt)){
//記錄更新成功。 重定向至登錄頁(yè)面
header("location: index.php");
exit();
} else{
echo "出了點(diǎn)問(wèn)題。 請(qǐng)稍后再試。";
}
}
// Close statement
mysqli_stmt_close($stmt);
}
//關(guān)閉連接
mysqli_close($link);
} else{
//在進(jìn)一步處理之前檢查id參數(shù)是否存在
if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){
//獲取URL參數(shù)
$id = trim($_GET["id"]);
//select語(yǔ)句
$sql = "SELECT * FROM employees WHERE id = ?";
if($stmt = mysqli_prepare($link, $sql)){
//將變量作為參數(shù)綁定到預(yù)處理語(yǔ)句
mysqli_stmt_bind_param($stmt, "i", $param_id);
//設(shè)置參數(shù)
$param_id = $id;
//嘗試執(zhí)行準(zhǔn)備好的語(yǔ)句
if(mysqli_stmt_execute($stmt)){
$result = mysqli_stmt_get_result($stmt);
if(mysqli_num_rows($result) == 1){
/* 提取結(jié)果行作為關(guān)聯(lián)數(shù)組。 由于結(jié)果集僅包含一行,因此我們不需要使用while循環(huán) */
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
//檢索單個(gè)字段值
$name = $row["name"];
$address = $row["address"];
$salary = $row["salary"];
} else{
//URL不包含有效的ID。 重定向至錯(cuò)誤頁(yè)面
header("location: error.php");
exit();
}
} else{
echo "哎呀! 出了點(diǎn)問(wèn)題。 請(qǐng)稍后再試。";
}
}
// Close statement
mysqli_stmt_close($stmt);
//關(guān)閉連接
mysqli_close($link);
} else{
//URL不包含id參數(shù)。 重定向至錯(cuò)誤頁(yè)面
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>請(qǐng)編輯輸入值并提交以更新記錄。</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="Submit">
<a href="index.php" class="btn btn-default">Cancel</a>
</form>
</div>
</div>
</div>
</div>
</html>最后,我們將構(gòu)建d我們的CRUD應(yīng)用elete功能。
讓我們創(chuàng)建一個(gè)名為“ delete.php”的文件,并將以下代碼放入其中。它將根據(jù)雇員的id屬性從雇員表中刪除現(xiàn)有記錄。
<?php
//確認(rèn)后進(jìn)行刪除操作
if(isset($_POST["id"]) && !empty($_POST["id"])){
//包含配置文件
require_once "config.php";
//DELETE語(yǔ)句
$sql = "DELETE FROM employees WHERE id = ?";
if($stmt = mysqli_prepare($link, $sql)){
//將變量作為參數(shù)綁定到預(yù)處理語(yǔ)句
mysqli_stmt_bind_param($stmt, "i", $param_id);
// Set parameters
$param_id = trim($_POST["id"]);
//嘗試執(zhí)行準(zhǔn)備好的語(yǔ)句
if(mysqli_stmt_execute($stmt)){
//刪除記錄成功。重定向到登錄頁(yè)
header("location: index.php");
exit();
} else{
echo "哎呀! 出了點(diǎn)問(wèn)題。 請(qǐng)稍后再試。";
}
}
// Close statement
mysqli_stmt_close($stmt);
//關(guān)閉連接
mysqli_close($link);
} else{
//檢查id參數(shù)是否存在
if(empty(trim($_GET["id"]))){
//URL不包含id參數(shù)。 重定向至錯(cuò)誤頁(yè)面
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>您確定要?jiǎng)h除此記錄嗎?</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>最后,讓我們?cè)賱?chuàng)建一個(gè)文件“ error.php”。如果請(qǐng)求無(wú)效,即URL查詢字符串中缺少id參數(shù)或該參數(shù)無(wú)效,將顯示此頁(yè)面。
<h1>無(wú)效請(qǐng)求</h1> <div class="alert alert-danger fade in"> <p>抱歉,您提出的請(qǐng)求無(wú)效。 請(qǐng) <a href="index.php" class="alert-link">返回</a> 然后再試一次.</p> </div>
經(jīng)過(guò)漫長(zhǎng)的旅程,終于我們用PHP和MySQL完成了CRUD應(yīng)用程序。