Форма PHP для добавления и обновления записи с использованием одной и той же формы зависит от параметров запроса - PullRequest
1 голос
/ 27 марта 2020

У меня есть эта форма, которая является формой PHP для добавления и обновления записи с использованием одной и той же формы, зависит от параметров запроса.

<?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>

Logi c для обработки этой формы:

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")
    );
}

Прямо сейчас это не добавляет никакой записи, и если я использую маршрут Edit (или Update), он превращает всю запись пустой. Он удаляет предыдущие значения из записи.

Если я удаляю <?php echo $pr[0]->name ?> поля ввода формы, все работает отлично, но я не могу получить сохраненные значения из БД, поэтому я знаю, что я обновляю.

Что я могу сделать, чтобы решить это?

1 Ответ

1 голос
/ 27 марта 2020

у вас есть некоторые проблемы.

Сначала - никогда не используйте данные из $ _GET или $ _POST непосредственно в SQL - вы получите SQL Инъекция

Во-вторых, как вы думаете, <?php echo $pr[0]->name ?> будет работать, когда вы попытаетесь добавить новую запись, если в $ pr нет данных? Таким образом, вы можете попробовать что-то вроде этого <?php echo $pr[0]->name ?? '' ?>, или go более правильно, как я описал ниже.

Так что вам нужно использовать эту строку $pr = $wpdb->get_results("SELECT * FROM wp_projects WHERE id = $id LIMIT 1"); только когда вы находитесь в редактируемом URL. Таким образом, вы также можете добавить проверку - есть ли запись с этим id в БД.

Итак, код будет примерно таким:

<?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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...