Я извлекаю значения из базы данных в форму для обновления при нажатии кнопки отправки. Значения извлекаются, но процесс обновления завершается с ошибкой.
Вот код:
<?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.
Отредактировано после первых комментариев.
Кстати, возьмите за привычку никогда не использовать select * -- перечислите нужные столбцы.
Пробовали проверить на наличие ошибок? mysqli_error ваш друг, чтобы проверить это - не полагайтесь на возвращаемый статус любого другого метода
@aynber я исправил эту ошибку с запятой, но после отправки формы строка обновляется пустыми значениями, и на экране отображается сообщение, что записи не найдены, что должно быть причиной этого?
"sssss" наверное должно быть "ssssi"





У вас есть 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();
я исправил это, но даже после отправки формы строка обновляется пустыми значениями, и на экране отображается сообщение, что записи не найдены, что должно быть причиной этого?
Это означает, что в вашей таблице нет данных с использованием этого идентификатора. Итак, ваш идентификатор ($pid) неверен.
Можешь показать мне свою форму? Часть HTML? Не забывайте, что вы получаете $pid по значению из ввода с именем pid, поэтому, если формы нет или вы напрямую обращаетесь к своему PHP-коду, минуя форму, это нормально.
Часть формы html находится в сообщении с вопросом, ниже части php. pid все еще находится в строке, но значения, конечно, категория, заголовок, описание устанавливаются пустыми. записи не отображаются, потому что на странице CAposts.php я получил строки с определенной упомянутой категорией.
Я только что увидел, что вы пытаетесь отобразить все свои данные из БД, используя
// 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, как вы предложили, также не сработало, но значения курса, категории, заголовка, описания устанавливаются пустыми
Итак, ваша база данных таблиц пуста. Вы знаете, что вам нужно иметь по крайней мере один столбец в вашей таблице, верно?
Я ошибся сверху, попробуйте изменить это $param_pid = $pid; на это $param_pid = 1, а затем посмотрите, есть ли у вас какой-то результат.
у меня есть столбцы, я имел в виду, когда я обновляю значения курса, категории, заголовка, описания с помощью формы, они устанавливаются пустыми в таблице базы данных.
$param_pid = 1 при этом выдает ошибку Undefined index: pid в следующей части: if (mysqli_num_rows($result) == 1){ /* Выбрать строку результата как ассоциативный массив. Поскольку набор результатов содержит только одну строку, нам не нужно использовать цикл while */ $row = mysqli_fetch_array($result, MYSQLI_ASSOC); // Получить значение отдельного поля $pid = $row['pid']; $курс = $строка['курс'];
Здесь не хватает запятой:
title=? descp=?