Как обновить базу данных по данным формы

#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>
        ";
    }
};
?>
 

Вот несколько скриншотов страниц:

serie.php
введите описание изображения здесь
edit_serie.php

введите описание изображения здесь
введите описание изображения здесь

Комментарии:

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>