J'ai cette forme, qui est une forme PHP pour ajouter et mettre à jour un enregistrement en utilisant la même forme dépend des paramètres de la requête.
<?php
if (isset($_GET['id'])) {
$id = $_GET['id'];
echo '<h1>Edit</h1>';
} else {
echo '<h1>Add New</h1>';
}
global $wpdb;
$pr = $wpdb->get_results("SELECT * FROM wp_projects WHERE id = $id LIMIT 1");
?>
<form action="" method="post">
<input type="text" name="pr-name" value="<?php echo $pr[0]->name ?>" size="50">
<input type="text" name="pr-lang" value="<?php echo $pr[0]->languages ?>" size="50">
<?php
if (isset($_GET['id'])) {
echo '<input style="margin-left: 10%;" class="btn btn-primary" type="submit"
name="edit" value="Edit" />';
} else {
echo '<input style="margin-left: 10%;" class="btn btn-primary" type="submit"
name="add" value="Add" />';
}
?>
</form>
Logique pour gérer ce formulaire:
if (isset($_POST['add'])) {
global $wpdb, $name, $lang;
$name = !empty($_POST['pr-name']) ? sanitize_text_field($_POST['pr-name']) : null;
$lang = !empty($_POST['pr-lang']) ? sanitize_text_field($_POST['pr-lang']) : null;
$table_name = $wpdb->prefix . "projects";
$wpdb->insert($table_name, array(
'time' => current_time('mysql'),
'name' => $name,
'languages' => $lang,
));
}
if (isset($_POST['edit'])) {
global $wpdb, $name, $lang;
$name = !empty($_POST['pr-name']) ? sanitize_text_field($_POST['pr-name']) : null;
$lang = !empty($_POST['pr-lang']) ? sanitize_text_field($_POST['pr-lang']) : null;
$table_name = $wpdb->prefix . "projects";
$wpdb->update(
$table_name,
array('time' => current_time('mysql'), 'name' => $name ),
array('ID'=>$id),
array("%s"),
array("%d")
);
}
En ce moment, ce n'est pas l'ajout d'un dossier, et si j'utilise la route Edit (ou mise à jour) Il tourne toute vierge record. Il supprime les valeurs précédentes du dossier.
Si je supprime <?php echo $pr[0]->name ?>
tout les champs de saisie de formulaire fonctionne parfaitement, mais je ne pouvais pas obtenir les valeurs stockées de la base de données , donc je sais ce qui est je mise à jour.
Que puis-je faire pour le résoudre?
vous avez ici quelques problèmes.
Dans un premier temps , - ne jamais utiliser les données de $ _GET ou $ _POST directement dans le SQL - vous obtiendrez Injection SQL
Au deuxième, la façon dont vous pensez qu'il <?php echo $pr[0]->name ?>
fonctionne lorsque vous essayez d'ajouter un nouveau disque, s'il n'y a pas toutes les données en $ pr? Ainsi, vous pouvez essayer smth comme ça <?php echo $pr[0]->name ?? '' ?>
, ou d'aller de façon plus correcte que j'ai décrit ci - dessous.
Donc , vous devez utiliser cette ligne $pr = $wpdb->get_results("SELECT * FROM wp_projects WHERE id = $id LIMIT 1");
que lorsque vous dans l'édition URL. De cette façon , vous pouvez également ajouter vérifier - est - il avec ce dossier id
dans le db.
Ainsi, le code sera quelque chose comme ça:
<?php
global $wpdb;
$name = '';
$lang = '';
if (isset($_GET['id'])) {
$id = $_GET['id'];
$pr = $wpdb->get_results("SELECT * FROM wp_projects WHERE id = $id LIMIT 1");
if (!$pr) {
die('No record with id: ' . $id);
}
$name = $pr[0]->name;
$lang = $pr[0]->languages;
echo '<h1>Edit</h1>';
} else {
echo '<h1>Add New</h1>';
}
?>
<form action="" method="post">
<input type="text" name="pr-name" value="<?php echo $name ?>" size="50">
<input type="text" name="pr-lang" value="<?php echo $lang ?>" size="50">
<?php
if (isset($_GET['id'])) {
echo '<input style="margin-left: 10%;" class="btn btn-primary" type="submit"
name="edit" value="Edit" />';
} else {
echo '<input style="margin-left: 10%;" class="btn btn-primary" type="submit"
name="add" value="Add" />';
}
?>
</form>