English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете, как использовать PHP и MySQL для создания 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>
Создание страницы удаленияВ конце мы построим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.