#php #sql
Вопрос:
Я написал некоторый код, который получает данные из базы данных и отображает их на странице. С помощью кнопки «изменить», которая ведет на страницу, вы должны обновить данные в базе данных с помощью ввода формы, но я не знаю, как я могу позволить ей обновиться. В edit_serie.php страница-это изменяемая форма, которая должна обновлять введенные данные в базе данных, но я не знаю, как это сделать. Кодекс поведения edit_serie.php:
<?php
function select($query)
{
$host = 'localhost';
$db = 'netland';
$user = 'root';
$pass = '';
$dsn = "mysql:host=$host;dbname=$db;";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
// Er word ervoor gezorgd dat de database info in rijen komt door queries die uitgevoerd worden
$rawResult = $pdo->query($query);
while ($row = $rawResult->fetch()) {
foreach ($row as $column => $value) {
$rowResult[$column] = $value;
}
$endResult[] = $rowResu<
}
return $endResu<
}
$id = $_GET['id'];
if (isset($_GET['id'])) {
$rows = select('SELECT * FROM series WHERE id = ' . $id);
foreach ($rows as $row) {
echo "
<a href='index.php'>Terug</a>
<h1>${row['title']} - ${row['rating']}</h1>
<table>
<tr>
<th>Awards</th>
<form action='' method='POST'>
<td><input type='text' name='has_won_awards' value='${row['has_won_awards']}'</td>
</tr>
<tr>
<th>Seasons</th>
<td><input type='text' name='seasons' value='${row['seasons']}'</td>
</tr>
<tr>
<th>Country</th>
<td><input type='text' name='country' value='${row['country']}'</td>
</tr>
<tr>
<th>Language</th>
<td><input type='text' name='language' value='${row['language']}'</td>
</tr>
</table>
<textarea rows='10' cols='40' name='description'>'${row['description']}'</textarea>
<br><br>
<input type='button' value='Change'></form>
";
}
};
?>
Вот несколько скриншотов страниц:
Комментарии:
1. Ваш код широко открыт для внедрения SQL. Используйте подготовленную инструкцию, а не встраивание введенных пользователем данных в sql
2. У вас есть несколько ошибок в коде.
FORM
Элемент должен либо полностью содержаться в одной ячейке таблицы, либо вся таблица должна полностью содержаться в ячейкеform
. Входные элементы, такие как<input type='text' name='has_won_awards'
незамкнутые3. Когда вы достигнете точки «но я не знаю, как это сделать» с чем-то таким базовым, это, вероятно, означает, что на этом этапе вам следует сунуть нос в пару учебных пособий для начинающих.
4. Вот почему я здесь, я уже просмотрел учебные пособия, но почти все учебные пособия используют mysqli, и мне нужен pdo
5. @ProfessorAbronsius Да, элемент формы должен быть таким, как вы говорите, но у вас могут быть входные данные за пределами тегов формы, если вы даете им
form="my-form-id"
атрибут.
Ответ №1:
Разрыв соединения с базой данных и запрос из функции вы можете изучить следующее, чтобы получить представление о том, как вы можете выполнить редактирование отдельных записей. Соединение с бд должно использоваться как для, так select
и update
для, поэтому я разместил одно соединение перед другим кодом.
Сгенерированный HTML-код был исправлен, и добавлен новый скрытый ввод, в котором используется id
значение. Вы могли бы использовать значение из $_GET['id']
обновления базы данных, но я решил использовать скрытый ввод. Я думаю, что код обновления довольно ясен и понятен, но вам действительно нужно ознакомиться с хранимыми процедурами-или, возможно, с лучшей ссылкой на PHPDelusions.net
<?php
$host = 'localhost';
$db = 'netland';
$user = 'root';
$pass = '';
$dsn = sprintf("mysql:host=%s;dbname=%s;",$host,$db);
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO( $dsn, $user, $pass, $options );
} catch ( PDOException $e ) {
exit($e->getMessage());
}
if( $_SERVER['REQUEST_METHOD']=='POST' amp;amp; isset(
$_POST['id'],
$_POST['title'],
$_POST['has_won_awards'],
$_POST['rating'],
$_POST['seasons'],
$_POST['country'],
$_POST['language'],
$_POST['description']
)){
$sql='update `series` set
`title`=:title,
`rating`=:rating,
`has_won_awards`=:has_won_awards,
`seasons`=:seasons,
`country`=:country,
`language`=:language,
`description`=:description
where `id`=:id';
$stmt=$pdo->prepare( $sql );
$stmt->execute(array(
':id' => $_POST['id'],
':title' => $_POST['title'],
':rating' => $_POST['rating'],
':has_won_awards' => $_POST['has_won_awards'],
':seasons' => $_POST['seasons'],
':country' => $_POST['country'],
':language' => $_POST['language'],
':description' => $_POST['description']
));
}
?>
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8' />
<title>Edit</title>
</head>
<body>
<?php
if( isset( $_GET['id'] ) ) {
$sql='SELECT
`id`,
`title`,
`rating`,
`has_won_awards`,
`seasons`,
`country`,
`language`,
`description`
FROM series
WHERE `id`=:id';
$stmt=$pdo->prepare($sql);
$stmt->execute(array(
':id' => $_GET['id']
));
while( $rs=$stmt->fetch( PDO::FETCH_OBJ ) ){
printf('
<a href="index.php">Terug</a>
<h1>%1$s - %2$s</h1>
<form method="POST">
<table>
<tr>
<th>Title</th>
<td><input type="text" name="title" value="%1$s" /></td>
</tr>
<tr>
<th>Awards</th>
<td><input type="text" name="has_won_awards" value="%3$s" /></td>
</tr>
<tr>
<th>Seasons</th>
<td><input type="text" name="seasons" value="%4$s" /></td>
</tr>
<tr>
<th>Rating</th>
<td><input type="text" name="rating" value="%2$s" /></td>
</tr>
<tr>
<th>Country</th>
<td><input type="text" name="country" value="%6$s" /></td>
</tr>
<tr>
<th>Language</th>
<td><input type="text" name="language" value="%7$s" /></td>
</tr>
</table>
<textarea rows="10" cols="40" name="description">%8$s</textarea>
<br />
<br />
<input type="hidden" name="id" value="%9$s" />
<input type="submit" value="Change" />
</form>',
$rs->title,
$rs->rating,
$rs->has_won_awards,
$rs->seasons,
$rs->rating,
$rs->country,
$rs->language,
$rs->description,
$rs->id
);
}
}else{
ob_clean();
exit(http_response_code(404));
}
?>
</body>
</html>