Реализация редактирования на сайте

Рейтинг: -1Ответов: 2Опубликовано: 13.03.2023

У меня есть вопрос. ***Т.е на страницу поиска у меня есть записи с бд , есть столбец с действием (input type submit(сохранить)) , редактирую ячейку, нажимаю сохранить.***Выдает NULL Я сделал столбец с действием(кнопка сохранить),пытаюсь перезаписать (файл update.php).

findoper.php

<?php
session_start();
require_once "vendor/connect.php";
?>
<!DOCTYPE html>
<html lang="en">

<head>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <link rel="stylesheet" type="text/css" href="style/style.css">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Научно-справочная библиотека</title>
</head>

<body>
    <?php
    if (isset($_SESSION['user'])) {
        echo "<h1>" . $_SESSION['user']['login'], "," . $_SESSION['user']['role'] . ".</h1>";
    }
    ?>
    <form name="search" method="POST" action="findoper.php">
        <div style="display:flex; flex-direction: row; justify-content: center; align-items: center">
            <div class="info">
                <label>Название:</label>
                <input type="text" name="search[title]" />
            </div>
            <div class="info">
                <label>Автор:</label>
                <input type="text" name="search[author]" />
            </div>
            <div class="info">
                <label>Под редакцией:</label>
                <input type="text" name="search[compedit]" />
            </div>
            <div class="info">
                <label>Год:</label>
                <input type="text" name="search[year]" />
            </div>
            <div class="info">
                <input type="submit" name="submitForm" value="Поиск" />
            </div>
    </form>

    <div class="info">
        <form action="mainpageoper.php">
            <input type="submit" name="SubmitForm" value="Назад" />
        </form>
    </div>

    <br>
    <br>
    <div class="info">
        <form action="vendor/logout.php">
            <input type="submit" name="SubmitForm" value="Выход" />
        </form>
    </div>
    </div>
    <?php
    $queryCondition = "";
    if (!empty($_POST)) {
        $submitForm = $_POST["submitForm"];
        foreach ($_POST["search"] as $key => $value) {
            if (isset($value)) {
                if (empty($queryCondition)) {
                    $queryCondition = " WHERE ";
                } else {
                    $queryCondition .= " AND ";
                }
                $queryCondition .= "$key LIKE '%" . $value . "%'";
            }
        }
    }
    $sql = "SELECT `id`,`title`, `author`, `year`, `publisher`, `compedit`,`countpages`,`archive`,`BBK`,`inventnumber` FROM infprintedit " . $queryCondition;
    $result = mysqli_query($connect, $sql);
    $res = mysqli_fetch_all($result, MYSQLI_ASSOC);
    $rowsCount = $result->num_rows; // количество полученных строк
    echo "<table><tr><th>Название</th><th>Автор</th><th>Год</th><th>Издательство</th><th>Под редакцией</th><th>Количество страниц</th><th>Архив</th><th>ББК</th><th>Инвентарный номер</th><th>Количество экземпляров</th><th>Кто последний пользовался</th><th>Действие</th></tr>";
    foreach ($result as $row) {
    ?>
        <tr>
            <td contentEditable='true'>
                <?php echo $row["title"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["author"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["year"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["publisher"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["compedit"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["countpages"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["archive"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["BBK"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["inventnumber"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["numbinstances"]; ?>
            </td>
            <td contentEditable='true'>
                <?php echo $row["lasttaker"]; ?>
            </td>
            <td>
                <form action="vendor/update.php"> <input type="submit" name="edit" value="Сохранить" /></form>
            </td>
        </tr>
    <?
    }
    echo "</table>";
    $result->free();
    ?>
    <br>
</body>

</html>

update.php

<?php
session_start();
require_once 'connect.php';
$title = $_POST['title'];
$author = $_POST['author'];
$year = $_POST['year'];
$publisher = $_POST['publisher'];
$compedit = $_POST['compedit'];
$countpages = $_POST['countpages'];
$archive = $_POST['archive'];
$bbk = $_POST['bbk'];
$inventnumber = $_POST['inventnumber'];
$numbinstances = $_POST['numbinstances'];
$lasttaker = $_POST['lasttaker'];
mysqli_query($connect, "UPDATE `infprintedit` SET (title = '$title', author = '$author', year = '$year', publisher = '$publisher', compedit = '$compedit',  countpages = '$countpages', archive = '$archive', bbk='$bbk', inventnumber ='$inventnumber', numbinstances = '$numbinstances', lasttaker='$lasttaker' )");

var_dump($mysqli_query);

выдает null

Ответы

▲ 0Принят

Если использовать функцию contentEditable='true' то сохранение надо писать на js c использованием Ajax. То есть отредактировали, считали елемент из DOM дерева, дальше надо создать файлик в корне каталога(важно что бы до него можно было достучаться по url), по типу api.php в котором прописать sql запрос для обнjвления данных в запрос пердавать данные из GET/POST парметров. Поэтапно:

  1. Отредактировали
  2. Нажали сохранить.
  3. Поймали клик, на js.
  4. Считали новые отредактированные данные.
  5. Вызвали асинхронную функцию, в неё передали новые данные, функция GET/POST парметром отправила в фалик api,php новые данные.
  6. Api.php принял выполнил sql запрос в котором обновил данные, вернул ответ

Функция Ajax

 /**
 * Функция отправляется в api.php
 * @param id id элемента
 * @param data новые данные
 * @returns {Promise<any>}
 * @private
 **/
async function func(id, data){

    let response=   await fetch('/api/v1/api.php',{
        method:     'POST',
        headers:    {
            'Content-type': 'application/json; charset=UTF-8'
        },
        body:       JSON.stringify({
            id: id,
            data: data
        })
    });
    
    return  await response.json();

}
▲ 0

Как вариант сделать при переходе не input c формой и action, а ссылка <a href="vendor/edit.php/?id=159">Редактировать</a>, где передавать страницу на которой выводиться форма редктирования и через GET параметры id элемента который редактируется, по этому id на странице редактирования делать выборку из бд и потом сохранять.

    foreach ($result as $row) {?>
    <tr>
        <td><?=$row["id"]?></td>
        <td><?=$row["title"]?></td>
        <td><?=$row["author"]?></td>
        <td><?=$row["year"]?></td>
        <td><?=$row["publisher"]?></td>
        <td><?=$row["compedit"]?></td>
        <td><?=$row["countpages"]?></td>
        <td><?=$row["archive"]?></td>
        <td><?=$row["BBK"]?></td>
        <td><?=$row["inventnumber"]?></td>
        <td><a href="vendor/edit.php/?id=<?=$row['id']?>">Редактировть</a></td>
    </tr>
<?}