Обновление в строке базы данных завершается ошибкой без ошибок в PHP

Я извлекаю значения из базы данных в форму для обновления при нажатии кнопки отправки. Значения извлекаются, но процесс обновления завершается с ошибкой.

Вот код:

<?php
session_start();

$username=$_SESSION['uname'];


$cn=mysqli_connect("localhost", "root", "", "testdb");
 
// Define variables and initialize with empty values
$course = $category = "";
$title = $descp = "";
 
// Processing form data when form is submitted
if (isset($_POST["pid"]) && !empty($_POST["pid"])){
    // Get hidden input value
    $pid = $_POST["pid"];

    
    // Check input errors before inserting in database
    if (empty($course) && empty($category) && empty($title) && empty($descp)){
        // Prepare an update statement
        $sql = "UPDATE posts SET course=?, category=?, title=?, descp=? WHERE pid=?";
         
        if ($stmt = mysqli_prepare($cn, $sql)){
            // Bind variables to the prepared statement as parameters
            mysqli_stmt_bind_param($stmt, "ssssi", $param_course, $param_category, $param_title, $param_descp, $param_pid);
            
            // Set parameters
            $param_course = $course;
            $param_category = $category;
            $param_title = $title;
            $param_descp = $descp;
            $param_pid = $pid;
            
            // Attempt to execute the prepared statement
            if (mysqli_stmt_execute($stmt)){
                // Records updated successfully. Redirect to landing page
                header("location: CAposts.php");
                exit();
            } else{
                echo "Something went wrong. Please try again later.";
            }

        // Close statement
        mysqli_stmt_close($stmt);
        }
         

    }
    
    // Close connection
    mysqli_close($cn);
} else{
    // Check existence of id parameter before processing further
    if (isset($_GET["pid"]) && !empty(trim($_GET["pid"]))){
        // Get URL parameter
        $pid =  trim($_GET["pid"]);
        
        // Prepare a select statement
        $sql = "SELECT * FROM posts WHERE pid = ?";
        if ($stmt = mysqli_prepare($cn, $sql)){
            // Bind variables to the prepared statement as parameters
            mysqli_stmt_bind_param($stmt, "i", $param_pid);
            
            // Set parameters
            $param_pid = $pid;
            
            // Attempt to execute the prepared statement
            if (mysqli_stmt_execute($stmt)){
                $result = mysqli_stmt_get_result($stmt);
    
                if (mysqli_num_rows($result) == 1){
                    /* Fetch result row as an associative array. Since the result set contains only one row, we don't need to use while loop */
                    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
                    
                    // Retrieve individual field value
                    $pid = $row['pid'];
                    $uname = $row['uname'];
                    $course = $row['course'];
                    $category = $row['category'];
                    $pdate = $row['pdate'];
                    $title = $row['title'];
                    $descp = $row['descp'];

                } else{
                    // URL doesn't contain valid id. Redirect to error page
                    header("location: CAposts.php");
                    exit();
                }
                
            } else{
                echo "Oops! Something went wrong. Please try again later.";
            }
        }
        
        // Close statement
        mysqli_stmt_close($stmt);
        
        // Close connection
        mysqli_close($cn);
    }  else{
        // URL doesn't contain id parameter. Redirect to error page
        header("location: CAposts.php");
        exit();
    }
}
?>


  <html>

  <head>
    <title>IMEDTalks-Post-
      <?php echo $title;?>
    </title>

    <link href = "./css/bootstrap.min.css" rel = "stylesheet" />
    <script src = "./scripts/jquery-3.3.1.min.js"></script>
    <script src = "./scripts/bootstrap.min.js"></script>


    <style>
      /* Make the image fully responsive */
      
      .carousel-inner img {
        width: 100%;
        height: 30%;
      }
    </style>

  </head>

  <body>

    <div class = "wrapper">
      <div class = "container-fluid">
        <div class = "row">
          <div class = "col-md-12">
            <div class = "page-header">
              <h2 class = "text-center">Update Post</h2>
            </div>
            <p class = "text-center">Please edit the input values and submit to update the post.</p>
            <form action = "<?php echo htmlspecialchars(basename($_SERVER['REQUEST_URI'])); ?>" method = "post">


              <div class = "form-group">
                <div class = "row">
                  <label class = "col-form-label col-md-1 offset-3" for = "course">Course:</label>
                  <div class = "col-md-2">
                    <select name = "course" class = "form-control" required>
                      <option value = "<?php echo $course;?>" selected>
                        <?php echo $course;?>
                      </option>
                      <option value = "">Choose any:</option>
                      <option value = "comp">Comp</option>
                      <option value = "theo">Theory</option>
                    </select>
                  </div>
                  <label class = "col-form-label col-md-1" for = "category">Category:</label>
                  <div class = "col-md-3">
                    <select name = "category" class = "form-control" required>
                      <option value = "<?php echo $category;?>" selected>
                        <?php echo $category;?>
                      </option>
                      <option value = "">Choose any:</option>
                      <option value = "plang">Programming Language</option>
                      <option value = "web">Web Technologies</option>
                      <option value = "maths">Mathematics and Statistics</option>

                      <option value = "others">Others</option>
                    </select>
                  </div>
                </div>
              </div>

              <div class = "form-group row">
                <label for = "title" class = "col-form-label col-md-2">Title:
                        </label>
                <div class = "col-md-10">
                  <input type = "text" class = "form-control" value = "<?php echo $title;?>" name = "title" required>
                </div>
              </div>


              <div class = "form-group row">
                <label for = "desc" class = "col-form-label col-md-12">Description:
                        </label>
                <div class = "col-md-12">
                  <textarea class = "form-control" name = "descp" rows = "20" required><?php echo $descp;?></textarea>
                </div>
              </div>

              <input type = "hidden" name = "pid" value = "<?php echo $pid;?>" />


              <div class = "form-group row">
                <div class = "col-md-4 offset-4">
                  <a href = "CAposts.php"><button type = "button" name = "cancel" 
                            class = "btn-lg btn-danger">Cancel</button></a>
                </div>

                <div class = "col-md-4">
                  <button type = "submit" name = "update" class = "btn-lg btn-success">Submit</button>
                </div>
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>


  </body>

  </html>

PS: pid покупается на предыдущей странице, где данные перечислены в формате таблицы, и по нажатию кнопки эти данные/сообщение загружаются в форму для редактирования с использованием pid, который является первичным ключом в моей таблице базы данных. с помощью бутстрапа 4.

Отредактировано после первых комментариев.

Здесь не хватает запятой: title=? descp=?

aynber 27.03.2019 17:29

Кстати, возьмите за привычку никогда не использовать select * -- перечислите нужные столбцы.

Jonast92 27.03.2019 17:30

Пробовали проверить на наличие ошибок? mysqli_error ваш друг, чтобы проверить это - не полагайтесь на возвращаемый статус любого другого метода

Nico Haase 27.03.2019 17:33

@aynber я исправил эту ошибку с запятой, но после отправки формы строка обновляется пустыми значениями, и на экране отображается сообщение, что записи не найдены, что должно быть причиной этого?

FrazzerK 27.03.2019 17:36
"sssss" наверное должно быть "ssssi"
GrumpyCrouton 27.03.2019 17:41
Стоит ли изучать 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
5
85
2

Ответы 2

У вас есть 5 столбцов в вашем запросе, но вы связываете только 4 из них, поэтому вы забыли ссtrong>

$sql = "UPDATE posts SET course=?, category=?, title=? descp=? WHERE pid=?";

    if ($stmt = mysqli_prepare($cn, $sql)){
        // Bind variables to the prepared statement as parameters
        mysqli_stmt_bind_param($stmt, "sssi", $param_course, $param_category, $param_title, $param_descp, $param_pid);

Вот более чистый код для вашего обновления:

$stmt = $conn->prepare("UPDATE posts SET course=?, category=?, title=?, descp=? WHERE pid=?");
$stmt->bind_param("ssssi", $course, $category, $title, $descp, $pid);
$stmt->execute();

я исправил это, но даже после отправки формы строка обновляется пустыми значениями, и на экране отображается сообщение, что записи не найдены, что должно быть причиной этого?

FrazzerK 27.03.2019 17:38

Это означает, что в вашей таблице нет данных с использованием этого идентификатора. Итак, ваш идентификатор ($pid) неверен.

AntoineWtrd 27.03.2019 17:41

Можешь показать мне свою форму? Часть HTML? Не забывайте, что вы получаете $pid по значению из ввода с именем pid, поэтому, если формы нет или вы напрямую обращаетесь к своему PHP-коду, минуя форму, это нормально.

AntoineWtrd 27.03.2019 17:42

Часть формы html находится в сообщении с вопросом, ниже части php. pid все еще находится в строке, но значения, конечно, категория, заголовок, описание устанавливаются пустыми. записи не отображаются, потому что на странице CAposts.php я получил строки с определенной упомянутой категорией.

FrazzerK 27.03.2019 17:49

Я только что увидел, что вы пытаетесь отобразить все свои данные из БД, используя

// Prepare a select statement
    $sql = "SELECT * FROM posts WHERE pid = ?";
    if ($stmt = mysqli_prepare($cn, $sql)){
        // Bind variables to the prepared statement as parameters
        mysqli_stmt_bind_param($stmt, "i", $param_pid);

        // Set parameters
        $param_pid = $pid;

Кроме того, ценность всей вашей формы заключается в использовании этой информации, полученной из БД, что ничего не значит, я просто не могу понять. Вы пытаетесь получить все свои данные, используя переменную, которая исходит из данных самой БД...

Попробуйте что-нибудь, измените скрытую форму для своего идентификатора и используйте это (если у вас есть данные в БД с использованием идентификатора 1)

<input type = "hidden" name = "pid" value = "1" />

ручное предоставление pid, как вы предложили, также не сработало, но значения курса, категории, заголовка, описания устанавливаются пустыми

FrazzerK 27.03.2019 18:12

Итак, ваша база данных таблиц пуста. Вы знаете, что вам нужно иметь по крайней мере один столбец в вашей таблице, верно?

AntoineWtrd 27.03.2019 18:27

Я ошибся сверху, попробуйте изменить это $param_pid = $pid; на это $param_pid = 1, а затем посмотрите, есть ли у вас какой-то результат.

AntoineWtrd 27.03.2019 18:29

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

FrazzerK 27.03.2019 18:35

$param_pid = 1 при этом выдает ошибку Undefined index: pid в следующей части: if (mysqli_num_rows($result) == 1){ /* Выбрать строку результата как ассоциативный массив. Поскольку набор результатов содержит только одну строку, нам не нужно использовать цикл while */ $row = mysqli_fetch_array($result, MYSQLI_ASSOC); // Получить значение отдельного поля $pid = $row['pid']; $курс = $строка['курс'];

FrazzerK 27.03.2019 18:39

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