Создание веб приложения на php+MySql. Редактирование и сохранение данных
Мы продолжаем создание нашего веб приложения с использованием php+mysql. В этом уроке мы реализуем механизм редактирования и сохранения данных в БД
Вначале нам надо понять, как мы будем унифицировать тот объект, который мы редактируем. Ссылка на редактирование у всех будет одинаковой — edit.php, но мы будем добавлять к ссылке id того игрока, информацию о котором мы собираемся обновить. В результате ссылка будет иметь следующий вид — edit.php?player_id=1 (мы попадем на страницу редактирования игрока с id=1).
При сохранении мы будем действовать похожим образом — в форме редактирования мы будем передавать не только обновленные данные, но и id игрока с помощью input type=»hidden».
Код урока (players.php)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script>
</head>
<body>
<header>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Sport CRM</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/">Главная</a></li>
<li><a href="players.php">Игроки</a></li>
<li><a href="teams.php">Команды</a></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container-fluid">
<?php include 'db.php'; ?>
<?php include 'api.php'; ?>
<?php
$players = getAllPlayers($db);
?>
<table class="table table-bordered">
<tr>
<th>Игрок</th>
<th>Команда</th>
<th>Страна</th>
</tr>
<?php foreach ($players as $player) { ?>
<tr>
<td><a href="edit.php?player_id=<?php echo $player['player_id']; ?>"><?php echo $player['player_name']; ?></a></td>
<td><?php echo $player['team_name']; ?></td>
<td><?php echo $player['country_name']; ?></td>
</tr>
<?php } ?>
</table>
</div>
<footer>
</footer>
</body>
</html>
Код урока (edit.php)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script>
</head>
<body>
<header>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Sport CRM</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/">Главная</a></li>
<li><a href="players.php">Игроки</a></li>
<li><a href="teams.php">Команды</a></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container-fluid">
<?php include 'db.php'; ?>
<?php include 'api.php'; ?>
<?php
$id = $_GET['player_id'];
if($id) {
$player = getPlayerById($db, $id);
}
else {
echo '<div class="alert alert-danger" role="alert">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="sr-only">Error:</span>
Игрок не найден
</div>';
}
?>
<form action="save.php" method="post">
<input type="hidden" name="id" value="<?php echo $player['player_id']; ?>">
<div class="form-group">
<label for="name">Игрок</label>
<input type="text" class="form-control" id="name" name="name" value="<?php echo $player['player_name']; ?>">
</div>
<button type="submit" class="btn btn-default">Сохранить</button>
</form>
</div>
<footer>
</footer>
</body>
Код урока (save.php)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script>
</head>
<body>
<header>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Sport CRM</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/">Главная</a></li>
<li><a href="players.php">Игроки</a></li>
<li><a href="teams.php">Команды</a></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container-fluid">
<?php include 'db.php'; ?>
<?php include 'api.php'; ?>
<?php
if(!empty($_POST['name']) && !empty($_POST['id'])) {
$name = $_POST['name'];
$id = $_POST['id'];
savePlayer($db, $name, $id);
}
else {
echo '<div class="alert alert-danger" role="alert">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="sr-only">Error:</span>
Ошибка сохранения
</div>';
}
?>
</div>
<footer>
</footer>
</body>
</html>
Код урока (api.php)
<?php
function getAllPlayers($db) {
$sql = "SELECT * FROM players
INNER JOIN teams ON players.team_id = teams.team_id
INNER JOIN countries ON players.country_id = countries.country_id;
";
$result = array();
$stmt = $db->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result[$row['player_id']] = $row;
}
return $result;
}
function getAllTeams($db) {
$sql = "SELECT * FROM teams
INNER JOIN countries ON teams.country_id = countries.country_id;
";
$result = array();
$stmt = $db->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result[$row['team_id']] = $row;
}
return $result;
}
function getPlayerById($db, $id) {
$sql = "SELECT * FROM players
WHERE player_id = :player_id;
";
$stmt = $db->prepare($sql);
$stmt->bindValue('player_id', $id, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row;
}
function savePlayer($db, $name, $id) {
$sql = "UPDATE players
SET player_name = :player_name
WHERE player_id = :player_id
";
$stmt = $db->prepare($sql);
$stmt->bindValue(':player_name', $name, PDO::PARAM_STR);
$stmt->bindValue(':player_id', $id, PDO::PARAM_INT);
$stmt->execute();
}
Добрый день! Подскажите, пожалуйста, как сформировать код, если нужно отредактировать выпадающий список?
<select name="kod_post" class="form-control" id="kod_post" value="»>
$value) {
echo «».$value[‘name_post’].»»;
}
?>
Данная конструкция выдает просто список, а необходимо чтобы изначально в списке стояло значение, которое записано в строке БД.
Здравствуйте, Елизавета. Прошу прощения за ожидание. Вам нужно вывести option с атрибутом selected
Добрый день. Денлаю простой редактор по вашему уроку. Мне нужно, зная ID изменять Status.
для этого написал форму
<form action="edit.php?search_id=» method=»GET»>
ID
Search
получаем ID, стираница edit.php
ID
<input type="text" name="id" value="»>
Status
Save
страница save.php
<?php
if(!empty($_GET['Status']) && !empty($_GET['id'])) {
$Status = $_GET['Status'];
$id = $_GET['id'];
saveStatus($db, $Status, $id);
}
else {
echo "Save error»;
}
?>
у меня в api.php только одна функция
prepare($sql);
$stmt->bindValue(‘:Status’, $Status, PDO::PARAM_STR);
$stmt->bindValue(‘:id’, $id, PDO::PARAM_INT);
$stmt->execute();
}
?>
Все время выдает ошибку Save error. как понять на каком этапе? По идее не передается параметр Status?
Проблема была в том, что у меня никак не читался вводимый мной Status. а потому выдавало ошибку. Я добавил еще один input на предыдущей странице edit.php и на страницу save.php статус и ID уже приходили методом GET потому я просто наживаю на сохранить и данные добавляются.
Я правильно понимаю, что вы решили вашу проблему?
Здравствуйте, Виктор. Прошу прощения, что отвечаю так поздно. Прошу вас не оставлять код в комментариях. Пишите подобные вопросы по почте или в соц сетях