Как просматривать / редактировать / удалять записи из таблицы контрольных списков в php / mysql - PullRequest
1 голос
/ 08 апреля 2019

Я создал таблицу контрольного списка в php, данные сохраняются в таблице базы данных mysql.

С помощью приведенного ниже кода данные сохраняются в базе данных, теперь я хочу иметь возможность редактировать и удалять записи.Таблица базы данных имеет два столбца - Id с автоинкрементом и ColRow, в котором есть значения отмеченных полей.Значения извлекаются из разных таблиц базы данных.Заголовок и первые столбцы извлекаются из двух таблиц, которые сохраняются в таблице отчетов в зависимости от отмеченных пользователем полей.

Вот код:

report.php

<?php
require_once 'pages/header.php';
require_once './functions/schema-functions.php';

$course = Schema::getCourse();
$objective = Schema::getObjective();
?>

<form id="addReport" action ='./functions/report-functions.php' method="post">

<table id="table1" class="table">
    <?php
echo '<tr><th>Objectives</th>';
for ($i = 0; $i < count($course); $i++) {
    echo '<th id = "rotate1">'. $course[$i]->commonName . '</th>';            
}
echo '</tr>';

for ($y = 0; $y < count($objective); $y++) {
    echo '<tr><th class=row-header>'.$objective[$y]->objective.'</th>';

for ($x = 0; $x < count($course); $x++) {

    echo "<td><input name='check[]' type=checkbox value=c".$course[$x]->courseId."-o".$objective[$y]->objectiveId." id=checked></td>";

    }
    echo '</tr>';
}
?>

report-functions.php

 <?php

    if( isset( $_POST['submit'], $_POST['check'] ) ){
    try{

        require_once 'db-connect.php';
        $conn = DatabaseConnection::getConnection();


        $sql='insert into `report`  ( `colrow` ) values ( :value )';
        $stmt = $conn->prepare( $sql );



        if( $stmt ){

            $conn->beginTransaction();

            foreach( $_POST['check'] as $index => $value ) {
                $result = $stmt->execute( [ ':value' => $value ] );
                if( !$result ) {
                    throw new Exception( sprintf( 'Failed to execute query %d for %s', $index, $value ) );
                }
            }

            $conn->commit();
            exit();
        }
    }catch( Exception $e ){
        $conn->rollback();
        exit( $e->getMessage() );
    }
}
?>

Я хочу, чтобы после того, как пользователь отправил данные в первый раз, страница должна загрузить новую таблицу с предварительно установленными флажками, и пользователь должен иметь возможностьвнесите необходимые изменения и повторно отправьте их.База данных должна быть соответственно обновлена.

1 Ответ

0 голосов
/ 09 апреля 2019

Приведенные критерии кажутся немного сомнительными, и, поскольку не дано никакого реального указания, но требуется помощь, я собрал воедино некоторый полупсевдокод, чтобы, возможно, помочь вам на пути к конечной цели (или некоторым из них) в любом случае)

Чтобы редактировать / удалять записи, вам нужен способ доступа к ним. Самым простым будет использование строки запроса, указывающей либо на ту же страницу, либо на специальный скрипт-обработчик. Следующие опции выбирают выделенный обработчик.

[Предположим, что предыдущая страница includes уже включена. Важными изменениями здесь являются добавление гиперссылок, указывающих на новый скрипт report-edit.php]

<form id="addReport" action ='./functions/report-functions.php' method="post">
    <table id="table1" class="table">
        <?php
            echo '<tr><th>Objectives</th>';

            for ( $i = 0; $i < count( $course ); $i++ ) {
                $name=$course[$i]->commonName;
                echo "<th>{$name}</th>";            
            }
            echo '</tr>';

            for( $y = 0; $y < count( $objective ); $y++ ) {

                $objective_title=$objective[$y]->objective;

                echo "<tr>
                    <th class=row-header>{$objective_title}</th>";

                    for ( $x = 0; $x < count( $course ); $x++ ) {

                        $cseid=$course[$x]->courseId;
                        $objid=$objective[$y]->objectiveId;

                        echo "<td>
                            <input name='check[]' type='checkbox' value='c{$cseid}-o{$objid}' />
                            <!-- EDIT LINKS EXAMPLE  -->
                            <a href='./functions/report-edit.php?task=edit&course={$cseid}&objective={$objid}'>Edit</a>
                            <a href='./functions/report-edit.php?task=delete&course={$cseid}&objective={$objid}'>Delete</a>
                        </td>";
                    }
                echo '</tr>';
            }
        ?>
    </table>
</form>

Затем, глядя на report-edit.php ~ полупсевдокод.

<?php
    /* report-edit.php */

    $tasks=array('edit','delete');
    $actions=array('commit-edit','commit-delete');

    /* include database connections */
    # require 'db-connect.php';




    if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_POST['action'] ) && in_array( $_POST['action'], $actions ) ){

        $course=filter_input( INPUT_POST, 'course', FILTER_SANITIZE_STRING );
        $objective=filter_input( INPUT_POST, 'objective', FILTER_SANITIZE_STRING );
        $value=filter_input( INPUT_POST, 'check', FILTER_SANITIZE_STRING );

        switch( $_POST['action'] ){
            case 'commit-edit':
                /* process form submission */
                $sql='update `report` set `colrow`=:value where `course-id`=:cseid and `objective-id`=:objid';
                /*

                    $args=array(
                        ':value'    =>  $value,
                        ':cseid'    =>  $course,
                        ':objid'    =>  $objective
                    );
                    $stmt=$db->prepare( $sql );
                    $result = $stmt->execute( $args );
                    exit( header( sprintf( 'Location: report.php?action=%s&status=%s', $_POST['action'], $result ) ) );
                */
            break;

            case 'commit-delete':
                /* process form submission */
                $sql='delete from `report` where `course-id`=:cseid and `objective-id`=:objid';
                /*

                    $args=array(
                        ':cseid'    =>  $course,
                        ':objid'    =>  $objective
                    );
                    $stmt=$db->prepare( $sql );
                    $stmt->execute( $args );
                    exit( header( sprintf( 'Location: report.php?action=%s&status=%s', $_POST['action'], $result ) ) );
                */
            break;

            default:
                exit('error');
            break;
        }

        exit( $sql );
    }





    if( $_SERVER['REQUEST_METHOD']=='GET' && !empty( $_GET['task'] ) && in_array( $_GET['task'], $tasks ) ){

        $course=filter_input( INPUT_GET, 'course', FILTER_SANITIZE_STRING );
        $objective=filter_input( INPUT_GET, 'objective', FILTER_SANITIZE_STRING );


        $head="
        <!DOCTYPE html>
        <html>
            <head>
                <title>{$_GET['task']}</title>
            </head>
            <body>";

        $foot="
            </body>
        </html>";


        switch( $_GET['task'] ){
            case 'edit':
            case 'delete':
                /* render a form */
                printf("
                    %s
                    <form method='post'>
                        <h1>%s record</h1>
                        <input type='text' name='course' value='%s' />
                        <input type='text' name='objective' value='%s' />
                        <input type='hidden' name='action' value='commit-%s' />
                        <input type='submit' />
                    </form>
                    %s",
                    $head,
                    ucfirst( $_GET['task'] ),
                    $course,
                    $objective,
                    $_GET['task'],
                    $foot
                );
            break;
            default:
                exit('error');
            break;
        }

    } else {
        http_response_code(404);
    }
?>

Не зная схемы или данных, возвращаемых в report.php, почти невозможно дать однозначный ответ относительно того, как вы проверяете флажки, если их значение равно X ~ никто, кроме вас, не знает удерживаемых значений - это это могут быть строки, целые числа, биты и т. д. и т. д., поэтому значение каждого флажка может быть cbanana-oharvest или c23-o44 и т. д. ... оно неизвестно!

Также неизвестно, почему синтаксис for( $i=0.... для итерации массива, а не foreach? На мой взгляд, использование for( $i=0; $i... etc открывает возможности для ошибок с индексами и т. Д. Однако, когда дело доходит до повторной проверки флажков, вам необходимо проверить, совпадает ли текущая строка в базе данных / массиве с чем-то еще - см. Предыдущий комментарий о неизвестных значениях, хотя , Итак, псевдо-мудрый:

if( $row['col-A-value' ]=="A value" && $row['col-B-value']=='B value' ){ $checked=' checked=true'; } else { $checked=''; }

<input name='check[]' type='checkbox' value='c{$cseid}-o{$objid}' {$checked} />

Ничто из вышеперечисленного не было проверено больше, чем элементарный тест, и, как уже говорилось, оно является скорее псевдо, чем окончательным. Чем больше вы задаете вопрос, тем больше вы получите ответ, я думаю, по большей части, но если вы создадите новый скрипт report-edit.php, добавите приведенный ниже код и внесете изменения в report.php, вы должны лучше понимать о том, как действовать, если нет, я буду в пабе!

...