Почему мой PHP-код неправильно обновляет мое приложение CRUD?

Я пытаюсь создать CRUD-приложение для своего бизнеса, у меня мало знаний PHP. Я следовал руководству, которое оказалось успешным, пока не добрался до части обновления.

<?php
$servername = "localhost";
$username = "root";
$password = "";
$database= "replog_test";

//create connection
$connection = new mysqli($servername, $username, $password, $database);

$id = "";
$service_dept = "";
$po = "";
$customer = "";
$pcs = "";
$equipment = "";
$date_rec = "";
$problem = "";
$warr = "";
$date_ship = "";

$errorMessage = "";
$successMessage = "";

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    //GET method: Show the data of the client

    if (!isset($_GET["id"])) {
        header("location: /novasvm/index.php");
        exit;
    }

    $id = $_GET["id"];

    // read the row of the selected client from the database table
    $sql = "SELECT * FROM replog WHERE id=$id";
    $result = $connection->query($sql);
    $row = $result->fetch_assoc();

    if (!$row) {
        header("location: /novasvm/index.php");
        exit;
    }

    $service_dept = $row["service_dept"];
    $po = $row["po"];
    $customer = $row["customer"];
    $pcs = $row["pcs"];
    $equipment = $row["equipment"];
    $date_rec = $row["date_rec"];
    $problem = $row["problem"];
    $warr = $row["warr"];
    $date_ship = $row["date_ship"];
}
else {
    // POST method: Update the data of the client
    $service_dept = $_POST["service_dept"];
    $po = $_POST["po"];
    $customer = $_POST["customer"];
    $pcs = $_POST["pcs"];
    $equipment = $_POST["equipment"];
    $date_rec = $_POST["date_rec"];
    $problem = $_POST["problem"];
    $warr = $_POST["warr"];
    $date_ship = $_POST["date_ship"];

    do {
        if ( empty($service_dept) || empty($po) || empty($customer) || empty($pcs) || empty($equipment) || empty($date_rec) || empty($problem) || empty($warr)) {
            $errorMessage = "All fields except DATE SHIPPED are required";
            break;
        }

        $sql = "UPDATE replog " . 
                "SET service_dept = '$service_dept', po = '$po', customer = '$customer', pcs = '$pcs', equipment = '$equipment', date_rec = '$date_rec', problem = '$problem', warr = '$warr', date_ship = '$date_ship' " . 
                "WHERE id = '$id'";

        $result = $connection->query($sql);
        
        if (!$result) {
            $errorMessage = "Invalid Query: " . $connection->error;
            break;
        }

        $successMessage = "Client Updated Correctly";
        header("location: /novasvm/general/replog.php");
        exit;

    } while(false);
}

?>

<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <link rel = "stylesheet" href = "../style.css" type = "text/css">
    <link rel = "stylesheet" href = "../reset.css" type = "text/css">
    <link rel = "preconnect" href = "https://fonts.googleapis.com">
    <link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin>
    <link href = "https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel = "stylesheet">
    <title>Repair Log</title>
</head>
<body>
    <div>
        <h2>New Data</h2>

        <?php  
        if ( !empty($errorMessage)) {
            echo "
            <div>
                <strong>$errorMessage</strong>
            </div>
            ";
        }          
        ?>

        <form method = "post">
            <input type = "hidden" name = "id" value = "<?php echo $id; ?>">
            <div>
                <label>Service Department</label>
                <div>
                    <input type = "text" name = "service_dept" value = "<?php echo $service_dept; ?>">
                </div>
            </div>
            <div>
                <label>PO Number</label>
                <div>
                    <input type = "text" name = "po" value = "<?php echo $po; ?>">
                </div>
            </div>
            <div>
                <label>Customer</label>
                <div>
                    <input type = "text" name = "customer" value = "<?php echo $customer; ?>">
                </div>
            </div>
            <div>
                <label>Pieces</label>
                <div>
                    <select name = "pcs" id = "">
                        <option value = "" selected = "selected"></option>
                        <option value = "1">1</option>
                        <option value = "2">2</option>
                        <option value = "3">3</option>
                        <option value = "4">4</option>
                        <option value = "5">5</option>
                        <option value = "6">6</option>
                        <option value = "7">7</option>
                        <option value = "8">8</option>
                        <option value = "9">9</option>
                    </select>
                </div>
            </div>
            <div>
                <label>Equipment</label>
                <div>
                    <input type = "text" name = "equipment" value = "<?php echo $equipment; ?>">
                </div>
            </div>
            <div>
                <label>Date Received</label>
                <div>
                    <input type = "date" name = "date_rec" value = "<?php echo $date_rec; ?>">
                </div>
            </div>
            <div>
                <label>Problem / Serial No.</label>
                <div>
                    <input type = "text" name = "problem" value = "<?php echo $problem; ?>">
                </div>
            </div>
            <div>
                <label>Warranty</label>
                <div>
                    <select name = "warr" id = "">
                        <option value = "" selected = "selected"></option>
                        <option value = "yes">Yes</option>
                        <option value = "no">No</option>
                    </select>
                </div>
            </div>
            <div>
                <label>Date Shipped</label>
                <div>
                    <input type = "date" name = "date_ship" value = "<?php echo $date_ship; ?>">
                </div>
            </div>

            <?php
            if (!empty($successMessage)) {
                echo "
                <div>
                    <strong>$successMessage</strong>
                </div>
                ";
            }
            ?>

            <div>
                <button type = "submit">Submit</button>
            </div>
            <div>
                <a href = "/novasvm/general/replog.php" role = "button">Cancel</a>
            </div>
        </form>
    </div>
</body>
</html>

Как только я отправляю данные, они никогда не обновляются ни на сервере xampp, ни на веб-странице. Оно остается точно таким же.

Ожидаемое обновление информации базы данных работает неправильно.

Его следует выполнить один раз, так как он проверяет условие после первого запуска, не так ли?

Raphi1 03.06.2024 20:08

Срабатывают ли какие-либо сообщения об ошибках? Включены ли на сервере полные отчеты об ошибках и ведение журнала? Во время отладки я настоятельно рекомендую избегать всех перенаправлений, поскольку они могут скрыть сообщения об ошибках. Если что-то не получается, die($errorMessage);. Если что-то получится, die('success');. Как только это будет решено, вы можете удалить die и снова добавить перенаправления.

Chris Haas 03.06.2024 20:13

Вы широко открыты для SQL-инъекций. Поскольку вы используете mysqli, воспользуйтесь преимуществами подготовленных операторов и bind_param. Это позволит решить любые неприятные проблемы с цитированием, которые могут возникнуть.

aynber 03.06.2024 20:13

Спасибо @ChrisHaas, это очень полезная информация. Я буду использовать это в дальнейшем.

Jakkber 03.06.2024 22:18

Я понимаю @aybnner, потом я исправлю ситуацию, сейчас я просто ищу функциональность. Это приложение также не будет доступно тем, кому не дано прямое разрешение через белый список IP-адресов и защиту входа.

Jakkber 03.06.2024 22:20

@Jakkber, ты, конечно, вольен поступать так, как хочешь, однако «Я потом что-то исправлю» слишком часто никогда не случается. Это одна из тех проблем, которые я бы действительно рекомендовал изучить сегодня, а не исправлять завтра. Посмотрите ссылки, которые разместил Айнбер, они на самом деле не такие уж и сложные, и, честно говоря, ваш код будет даже лучше читаться, потому что вы не объединяете, не экранируете или что-то в этом роде. Кроме того, фраза «Это приложение также будет недоступно» также известна как «знаменитые последние слова».

Chris Haas 03.06.2024 22:29

@ChrisHaas хаха, достаточно честно! Я доберусь до этого :)

Jakkber 04.06.2024 20:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не устанавливаете $id в своей фактической ветке else для оператора UPDATE.... Попробуйте это так:

<?php
$servername = "localhost";
$username = "root";
$password = "";
$database= "replog_test";

//create connection
$connection = new mysqli($servername, $username, $password, $database);

$id = "";
$service_dept = "";
$po = "";
$customer = "";
$pcs = "";
$equipment = "";
$date_rec = "";
$problem = "";
$warr = "";
$date_ship = "";

$errorMessage = "";
$successMessage = "";

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    //GET method: Show the data of the client

    if (!isset($_GET["id"])) {
        header("location: /novasvm/index.php");
        exit;
    }

    $id = $_GET["id"];

    // read the row of the selected client from the database table
    $sql = "SELECT * FROM replog WHERE id=$id";
    $result = $connection->query($sql);
    $row = $result->fetch_assoc();

    if (!$row) {
        header("location: /novasvm/index.php");
        exit;
    }

    $service_dept = $row["service_dept"];
    $po = $row["po"];
    $customer = $row["customer"];
    $pcs = $row["pcs"];
    $equipment = $row["equipment"];
    $date_rec = $row["date_rec"];
    $problem = $row["problem"];
    $warr = $row["warr"];
    $date_ship = $row["date_ship"];
}
else {
    // POST method: Update the data of the client
    $service_dept = $_POST["service_dept"];
    $po = $_POST["po"];
    $customer = $_POST["customer"];
    $pcs = $_POST["pcs"];
    $equipment = $_POST["equipment"];
    $date_rec = $_POST["date_rec"];
    $problem = $_POST["problem"];
    $warr = $_POST["warr"];
    $date_ship = $_POST["date_ship"];
    $id = $_POST["id"];   // <----------

    do {
        if ( empty($service_dept) || empty($po) || empty($customer) || empty($pcs) || empty($equipment) || empty($date_rec) || empty($problem) || empty($warr)) {
            $errorMessage = "All fields except DATE SHIPPED are required";
            break;
        }

        $sql = "UPDATE replog " . 
                "SET service_dept = '$service_dept', po = '$po', customer = '$customer', pcs = '$pcs', equipment = '$equipment', date_rec = '$date_rec', problem = '$problem', warr = '$warr', date_ship = '$date_ship' " . 
                "WHERE id = '$id'";

        $result = $connection->query($sql);
        
        if (!$result) {
            $errorMessage = "Invalid Query: " . $connection->error;
            break;
        }

        $successMessage = "Client Updated Correctly";
        header("location: /novasvm/general/replog.php");
        exit;

    } while(false);
}

?>

<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <link rel = "stylesheet" href = "../style.css" type = "text/css">
    <link rel = "stylesheet" href = "../reset.css" type = "text/css">
    <link rel = "preconnect" href = "https://fonts.googleapis.com">
    <link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin>
    <link href = "https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel = "stylesheet">
    <title>Repair Log</title>
</head>
<body>
    <div>
        <h2>New Data</h2>

        <?php  
        if ( !empty($errorMessage)) {
            echo "
            <div>
                <strong>$errorMessage</strong>
            </div>
            ";
        }          
        ?>

        <form method = "post">
            <input type = "hidden" name = "id" value = "<?php echo $id; ?>">
            <div>
                <label>Service Department</label>
                <div>
                    <input type = "text" name = "service_dept" value = "<?php echo $service_dept; ?>">
                </div>
            </div>
            <div>
                <label>PO Number</label>
                <div>
                    <input type = "text" name = "po" value = "<?php echo $po; ?>">
                </div>
            </div>
            <div>
                <label>Customer</label>
                <div>
                    <input type = "text" name = "customer" value = "<?php echo $customer; ?>">
                </div>
            </div>
            <div>
                <label>Pieces</label>
                <div>
                    <select name = "pcs" id = "">
                        <option value = "" selected = "selected"></option>
                        <option value = "1">1</option>
                        <option value = "2">2</option>
                        <option value = "3">3</option>
                        <option value = "4">4</option>
                        <option value = "5">5</option>
                        <option value = "6">6</option>
                        <option value = "7">7</option>
                        <option value = "8">8</option>
                        <option value = "9">9</option>
                    </select>
                </div>
            </div>
            <div>
                <label>Equipment</label>
                <div>
                    <input type = "text" name = "equipment" value = "<?php echo $equipment; ?>">
                </div>
            </div>
            <div>
                <label>Date Received</label>
                <div>
                    <input type = "date" name = "date_rec" value = "<?php echo $date_rec; ?>">
                </div>
            </div>
            <div>
                <label>Problem / Serial No.</label>
                <div>
                    <input type = "text" name = "problem" value = "<?php echo $problem; ?>">
                </div>
            </div>
            <div>
                <label>Warranty</label>
                <div>
                    <select name = "warr" id = "">
                        <option value = "" selected = "selected"></option>
                        <option value = "yes">Yes</option>
                        <option value = "no">No</option>
                    </select>
                </div>
            </div>
            <div>
                <label>Date Shipped</label>
                <div>
                    <input type = "date" name = "date_ship" value = "<?php echo $date_ship; ?>">
                </div>
            </div>

            <?php
            if (!empty($successMessage)) {
                echo "
                <div>
                    <strong>$successMessage</strong>
                </div>
                ";
            }
            ?>

            <div>
                <button type = "submit">Submit</button>
            </div>
            <div>
                <a href = "/novasvm/general/replog.php" role = "button">Cancel</a>
            </div>
        </form>
    </div>
</body>
</html>

Спасибо Спасибо спасибо! Я был на грани перезапуска. Как я уже упоминал выше, я очень новичок в этом и делаю это как своего рода побочный проект, который, надеюсь, поможет моей компании.

Jakkber 03.06.2024 22:22

Тоже такая глупая ошибка! Я понимаю, что будет полезно изучить основы PHP и SQL, но сейчас мне придется сделать это следующим образом. Мои знания других языков приносят большое преимущество, но до сих пор это было огромной проблемой.

Jakkber 03.06.2024 22:23

Другие вопросы по теме