CRUD на PHP для работы с MySQL: пошаговый урок для начинающих
В этой статье мы рассмотрим разработку простого набора CRUD операций на PHP, предназначенного для работы с базой данных MySQL. Для создания кода CRUD будет использовано расширение MySQLi, для оформления – стили Bootstrap. Приложение будет выполнять все стандартные операции CRUD – создание, чтение, модификацию и удаление записей.
Что такое CRUD: это аббревиатура, обозначающая четыре главные операции, используемые в приложениях для управления базами данных – создание (create), чтение (read), модификацию (update) и удаление (delete) записей.
Итак, приступим к разработке CRUD на PHP и MySQLi с нуля.
Шаг 1: Создание таблицы базы данных
Приведенная ниже SQL команда создает таблицу с данными пользователей в базе MySQL.
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL,
phone_number VARCHAR(15) NOT NULL,
address VARCHAR(255) NOT NULL
);
Шаг 2: Создание файла конфигурации
После создания таблицы мы переходим к настройке подключения к серверу базы данных MySQL. Для этого нужно создать файл config.php и поместить в него приведенный ниже код.
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'php_crud');
$conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
if ($conn === false) {
die("ERROR: Could not connect. " . mysqli_connect_error());
}
?>
Это подключение можно вызывать на всех страницах – с помощью PHP функции require_once().
Шаг 3: Посадочная страница
На посадочной странице данные пользователей будут выводиться в виде таблицы. Мы предусмотрим иконки для операций редактирования, просмотра и удаления данных.
Для создания лендинга мы добавим файл index.php в директорию CRUD. Вставьте в файл данный ниже код.
<!DOCTYPE html>
<html lang="en">
<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://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<style>
.wrapper {
width: 1200px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<h2 class="text-center">PHP CRUD Tutorial Example with <a href="https://codingdriver.com/">Coding Driver</a></h2>
<div class="col-md-12">
<div class="page-header clearfix">
<h2 class="pull-left">Users</h2>
<a href="create.php" class="btn btn-success pull-right">Add New User</a>
</div>
<?php
// Include config file
require_once "config.php";
// select all users
$data = "SELECT * FROM users";
if($users = mysqli_query($conn, $data)){
if(mysqli_num_rows($users) > 0){
echo "<table class='table table-bordered table-striped'>
<thead>
<tr>
<th>#</th>
<th>First Name</th>
<th>Last Name</th>
<th>Email</th>
<th>Phone Number</th>
<th>Address</th>
<th>Action</th>
</tr>
</thead>
<tbody>";
while($user = mysqli_fetch_array($users)) {
echo "<tr>
<td>" . $user['id'] . "</td>
<td>" . $user['first_name'] . "</td>
<td>" . $user['last_name'] . "</td>
<td>" . $user['email'] . "</td>
<td>" . $user['phone_number'] . "</td>
<td>" . $user['address'] . "</td>
<td>
<a href='read.php?id=". $user['id'] ."' title='View User' data-toggle='tooltip'><span class='glyphicon glyphicon-eye-open'></span></a>
<a href='edit.php?id=". $user['id'] ."' title='Edit User' data-toggle='tooltip'><span class='glyphicon glyphicon-pencil'></span></a>
<a href='delete.php?id=". $user['id'] ."' title='Delete User' data-toggle='tooltip'><span class='glyphicon glyphicon-trash'></span></a>
</td>
</tr>";
}
echo "</tbody>
</table>";
mysqli_free_result($users);
} else{
echo "<p class='lead'><em>No records found.</em></p>";
}
} else{
echo "ERROR: Could not able to execute $sql. " . mysqli_error($conn);
}
// Close connection
mysqli_close($conn);
?>
</div>
</div>
</div>
</div>
</body>
</html>
Можно вставить какие-нибудь тестовые данные прямо в таблицу базы данных, изменения отобразятся на странице.
Шаг 4: Страница создания записей
На этом этапе мы разработаем CRUD операцию по созданию записей. Для этого создайте новый файл под названием create.php и поместите в него следующий код:
<?php
require_once "config.php";
$first_name = $last_name = $email = $phone_number = $address = "";
$first_name_error = $last_name_error = $email_error = $phone_number_error = $address_error = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$firstName = trim($_POST["first_name"]);
if (empty($firstName)) {
$first_name_error = "First Name is required.";
} elseif (!filter_var($firstName, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))) {
$first_name_error = "First Name is invalid.";
} else {
$firstName = $firstName;
}
$lastName = trim($_POST["last_name"]);
if (empty($lastName)) {
$last_name_error = "Last Name is required.";
} elseif (!filter_var($firstName, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))) {
$last_name_error = "Last Name is invalid.";
} else {
$lastName = $lastName;
}
$email = trim($_POST["email"]);
if (empty($email)) {
$email_error = "Email is required.";
} elseif (!filter_var($firstName, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))) {
$email_error = "Please enter a valid email.";
} else {
$email = $email;
}
$phoneNumber = trim($_POST["phone_number"]);
if(empty($phoneNumber)){
$phone_number_error = "Phone Number is required.";
} else {
$phoneNumber = $phoneNumber;
}
$address = trim($_POST["address"]);
if(empty($address)){
$address_error = "Address is required.";
} else {
$address = $address;
}
if (empty($first_name_error_err) && empty($last_name_error) && empty($email_error) && empty($phone_number_error) && empty($address_error) ) {
$sql = "INSERT INTO `users` (`first_name`, `last_name`, `email`, `phone_number`, `address`) VALUES ('$firstName', '$lastName', '$email', '$phoneNumber', '$address')";
if (mysqli_query($conn, $sql)) {
header("location: index.php");
} else {
echo "Something went wrong. Please try again later.";
}
}
mysqli_close($conn);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Create User</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style>
.wrapper {
width: 1200px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h2>Create User</h2>
</div>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($first_name_error)) ? 'has-error' : ''; ?>">
<label>First Name</label>
<input type="text" name="first_name" class="form-control" value="">
<span class="help-block"><?php echo $first_name_error;?></span>
</div>
<div class="form-group <?php echo (!empty($last_name_error)) ? 'has-error' : ''; ?>">
<label>Last Name</label>
<input type="text" name="last_name" class="form-control" value="">
<span class="help-block"><?php echo $last_name_error;?></span>
</div>
<div class="form-group <?php echo (!empty($email_error)) ? 'has-error' : ''; ?>">
<label>Email</label>
<input type="email" name="email" class="form-control" value="">
<span class="help-block"><?php echo $email_error;?></span>
</div>
<div class="form-group <?php echo (!empty($phone_number_error)) ? 'has-error' : ''; ?>">
<label>Phone Number</label>
<input type="number" name="phone_number" class="form-control" value="">
<span class="help-block"><?php echo $phone_number_error;?></span>
</div>
<div class="form-group <?php echo (!empty($address_error)) ? 'has-error' : ''; ?>">
<label>Address</label>
<textarea name="address" class="form-control"></textarea>
<span class="help-block"><?php echo $address_error;?></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>
</body>
</html>
Файл create.php будет отображать HTML форму для ввода и валидации данных.
Шаг 5: Страница модификации записей
По аналогии со страницей создания записей мы разработаем функцию и страницу модификации данных. Создайте файл с именем edit.php и вставьте в него приведенный ниже код, который обеспечивает редактирование записей, уже существующих в базе данных.
<?php
require_once "config.php";
$first_name = $last_name = $email = $phone_number = $address = "";
$first_name_error = $last_name_error = $email_error = $phone_number_error = $address_error = "";
if (isset($_POST["id"]) && !empty($_POST["id"])) {
$id = $_POST["id"];
$firstName = trim($_POST["first_name"]);
if (empty($firstName)) {
$first_name_error = "First Name is required.";
} elseif (!filter_var($firstName, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))) {
$first_name_error = "First Name is invalid.";
} else {
$firstName = $firstName;
}
$lastName = trim($_POST["last_name"]);
if (empty($lastName)) {
$last_name_error = "Last Name is required.";
} elseif (!filter_var($firstName, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))) {
$last_name_error = "Last Name is invalid.";
} else {
$lastName = $lastName;
}
$email = trim($_POST["email"]);
if (empty($email)) {
$email_error = "Email is required.";
} elseif (!filter_var($firstName, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))) {
$email_error = "Please enter a valid email.";
} else {
$email = $email;
}
$phoneNumber = trim($_POST["phone_number"]);
if (empty($phoneNumber)){
$phone_number_error = "Phone Number is required.";
} else {
$phoneNumber = $phoneNumber;
}
$address = trim($_POST["address"]);
if (empty($address)) {
$address_error = "Address is required.";
} else {
$address = $address;
}
if (empty($first_name_error_err) && empty($last_name_error) &&
empty($email_error) && empty($phone_number_error) && empty($address_error) ) {
$sql = "UPDATE `users` SET `first_name`= '$firstName', `last_name`= '$lastName', `email`= '$email', `phone_number`= '$phoneNumber', `address`= '$address' WHERE id='$id'";
if (mysqli_query($conn, $sql)) {
header("location: index.php");
} else {
echo "Something went wrong. Please try again later.";
}
}
mysqli_close($conn);
} else {
if (isset($_GET["id"]) && !empty(trim($_GET["id"]))) {
$id = trim($_GET["id"]);
$query = mysqli_query($conn, "SELECT * FROM users WHERE ID = '$id'");
if ($user = mysqli_fetch_assoc($query)) {
$firstName = $user["first_name"];
$lastName = $user["last_name"];
$email = $user["email"];
$phoneNumber = $user["phone_number"];
$address = $user["address"];
} else {
echo "Something went wrong. Please try again later.";
header("location: edit.php");
exit();
}
mysqli_close($conn);
} else {
echo "Something went wrong. Please try again later.";
header("location: edit.php");
exit();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<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>
.wrapper {
width: 1200px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h2>Update User</h2>
</div>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<input type="hidden" name="id" value="<?php echo $id; ?>"/>
<div class="form-group <?php echo (!empty($first_name_error)) ? 'has-error' : ''; ?>">
<label>First Name</label>
<input type="text" name="first_name" class="form-control" value="<?php echo $firstName; ?>">
<span class="help-block"><?php echo $first_name_error;?></span>
</div>
<div class="form-group <?php echo (!empty($last_name_error)) ? 'has-error' : ''; ?>">
<label>Last Name</label>
<input type="text" name="last_name" class="form-control" value="<?php echo $lastName; ?>">
<span class="help-block"><?php echo $last_name_error;?></span>
</div>
<div class="form-group <?php echo (!empty($email_error)) ? 'has-error' : ''; ?>">
<label>Email</label>
<input type="email" name="email" class="form-control" value="<?php echo $email; ?>">
<span class="help-block"><?php echo $email_error;?></span>
</div>
<div class="form-group <?php echo (!empty($phone_number_error)) ? 'has-error' : ''; ?>">
<label>Phone Number</label>
<input type="number" name="phone_number" class="form-control" value="<?php echo $phoneNumber; ?>">
<span class="help-block"><?php echo $phone_number_error;?></span>
</div>
<div class="form-group <?php echo (!empty($address_error)) ? 'has-error' : ''; ?>">
<label>Address</label>
<textarea name="address" class="form-control"><?php echo $address; ?></textarea>
<span class="help-block"><?php echo $address_error;?></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>
</body>
</html>
Шаг 6: Чтение записей
Для вывода на экран данных пользователей мы разработаем функцию чтения записей. Создайте файл read.php, сохраните в нем данный ниже код. Файл будет запрашивать данные пользователей по ID из таблицы базы данных.
<!DOCTYPE html>
<html lang="en">
<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>
.wrapper{
width: 1200px;
margin: 0 auto;
}
</style>
</head>
<body>
<?php
if (isset($_GET["id"]) && !empty(trim($_GET["id"]))) {
require_once "config.php";
$id = trim($_GET["id"]);
$query = mysqli_query($conn, "SELECT * FROM users WHERE ID = '$id'");
if ($user = mysqli_fetch_assoc($query)) {
$firstName = $user["first_name"];
$lastName = $user["last_name"];
$email = $user["email"];
$phoneNumber = $user["phone_number"];
$address = $user["address"];
} else {
header("location: read.php");
exit();
}
mysqli_close($conn);
} else {
header("location: read.php");
exit();
}
?>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1> User View</h1>
</div>
<div class="form-group">
<label>First Name</label>
<p class="form-control-static"><?php echo $firstName ?></p>
</div>
<div class="form-group">
<label>Last Name</label>
<p class="form-control-static"><?php echo $lastName ?></p>
</div>
<div class="form-group">
<label>Email</label>
<p class="form-control-static"><?php echo $email ?></p>
</div>
<div class="form-group">
<label>Phone Number</label>
<p class="form-control-static"><?php echo $phoneNumber ?></p>
</div>
<div class="form-group">
<label>Address</label>
<p class="form-control-static"><?php echo $address ?></p>
</div>
<p><a href="index.php" class="btn btn-primary">Back</a></p>
</div>
</div>
</div>
</div>
</body>
</html>
Шаг 7: Удаление записей
На заключительном этапе мы разработаем функцию удаления записей. Создайте файл delete.php, вставьте в него приведенный ниже код, который отвечает за удаление существующих в базе записей по ID пользователя.
<?php
if (isset($_POST["id"]) && !empty($_POST["id"])) {
require_once "config.php";
$id = $_POST["id"];
$query = "DELETE FROM users WHERE id = '$id'";
if (mysqli_query($conn, $query)) {
header("location: index.php");
} else {
echo "Something went wrong. Please try again later.";
}
mysqli_close($conn);
} else {
if (empty(trim($_GET["id"]))) {
echo "Something went wrong. Please try again later.";
header("location: index.php");
exit();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<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>
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1>Delete Record</h1>
</div>
<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>Are you sure you want to delete this record?</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>
</div>
</div>
</div>
</div>
</body>
</html>
Наконец, наш набор CRUD операций для работы с записями в базе данных MySQL готов. Если у вас есть вопросы или замечания – ждем их в комментариях.