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 Краткая аббревиатура CRUD. CRUD операции являются базовыми операциями данных в базе данных. В предыдущих главах мы уже изучили, как выполнять операции создания (вставки), чтения (выбора), обновления и удаления. В этом руководстве мы создадим простое приложение PHP, чтобы выполнять все эти операции на одной странице MySQL-таблицы.

Хорошо, начнем с создания таблицы, которую мы будем использовать во всех примерах.

Создание таблицы базы данных

Выполните следующий SQL-запрос для создания таблицы с именем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
);

Создание файла конфигурации

После создания таблицы нам нужно создать скрипт PHP для подключения к серверу базы данных MySQL. Давайте создадим файл с именем “config.php” и поместим в него следующий код.

Позже мы будем использовать функцию PHP require_once() для включения этого файла конфигурации в другие страницы.

Онлайн-пример

<?php
/* Кредитные данные. Предполагается, что вы запускаете MySQL
Сервер с	default settings (пользователь “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>Панель управления</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">Подробности сотрудников</h2>
                        <a href="create.php" class="btn btn-success pull-right">Добавить нового сотрудника</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>Имя</th>";
                                        echo "<th>Адрес</th>";
                                        echo "<th>Зарплата</th>";
                                        echo "<th>Действие</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>";
                            // Освободить результат набора
                            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>
<a href="index.php" class="btn btn-default">Отменить</a>

ВemployeesПосле того как в таблицу добавлены некоторые записи, страница входа, то есть CRUD-сеть данных, может выглядеть так, как показано на рисунке ниже:

Подсказка:Мы использовали фреймворк Bootstrap для быстрого и красивого создания макета этого CRUD-приложения. Bootstrap - это самый популярный и функциональный фронтенд-фреймворк, предназначенный для более быстрого и легкого ответа на разработку веб-приложений.

Создание страницы ввода

В этом разделе мы будем создавать CRUD приложениеC функции создания.

Давайте создадим файл с именем "create.php" и поместим в него следующий код. Он будет генерировать веб форму, которую можно использовать для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\"]);
    
        $name_err = "Пожалуйста, введите имя.";
    
        $name_err = "Пожалуйста, введите действительное имя.";
    } else{
        $name = $input_name;
    }
    
    //Валидация адреса
    $input_address = trim($_POST[\"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>Создание записи</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
                        </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>
                        </div>
                        <span class="help-block"><?php echo $address_err;?></span>
                            <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; ?>">
                        </div>
                        <input type="hidden" name="id" value="<?php echo $id; ?>"/>
                        <input type="submit" class="btn btn-primary" value="Подтвердить">
                    </form>
                </div>
            </div>        
        </div>
    </div>
<a href="index.php" class="btn btn-default">Отменить</a>

Тот же файл "create.php" будет отображать HTML форму и обрабатывать отправленные данные формы. До сохранения данных он также будет выполнять базовую валидацию ввода от пользователя.

Создание страницы чтения

Теперь нужно создать CRUD приложениеR функции чтения.

Давайте создадим файл с именем "read.php" и поместим в него следующий код. Он будет выполнять только на основеСотрудникидентификатор из таблицы 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>Просмотр записи</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">
                        
                        <p class="form-control-static"><?php echo $row[\"address\"];?></p>
                    </div>
                    <div class="form-group">
                        <div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : '';">
                        <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>
<a href="index.php" class="btn btn-default">Отменить</a>

Создание страницы обновления

Таким образом, мы можем создать функцию обновления нашего CRUD приложения.

Давайте создадим файл с именем \Сотрудникатрибута 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\"]);
    
        $name_err = \
    
        $name_err = \
    } else{
        $name = $input_name;
    }
    
    // Проверка адреса
    $input_address = trim($_POST[\"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
                        </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>
                        </div>
                        <span class="help-block"><?php echo $address_err;?></span>
                            <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; ?>">
                        </div>
                        <span class="help-block"><?php echo $salary_err;?></span>
                        <input type="hidden" name="id" value="<?php echo $id; ?>"/>
                        <input type="submit" class="btn btn-primary" value="Подтвердить">
                    </form>
                </div>
            </div>        
        </div>
    </div>
<a href="index.php" class="btn btn-default">Отменить</a>

</html>

Создание страницы удаленияВ конце мы построимd

Создадим файл под названием "delete.php" и поместим в него следующий код. Он будет выполнять функцию elete нашего CRUD приложения.Сотрудникатрибут 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>

После долгого путешествия, наконец, мы完成了 CRUD приложение с использованием PHP и MySQL.