代码之家  ›  专栏  ›  技术社区  ›  AAM

如何在php/mysql中查看/编辑/删除清单表中的记录

  •  0
  • AAM  · 技术社区  · 7 年前

    我用php构建了一个检查表,数据保存在mysql数据库表中。

    使用下面的代码,数据将保存在数据库中,现在我希望能够编辑和删除记录。 数据库表有两列-auto increment 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>';
    }
    ?>
    

    报表-函数.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() );
        }
    }
    ?>
    

    我希望在用户第一次提交数据之后,页面应该加载一个带有先前复选框的新表,并且用户应该能够进行所需的更改并重新提交它。数据库应相应更新。

    0 回复  |  直到 7 年前
        1
  •  0
  •   Professor Abronsius    7 年前

    给出的标准似乎有点模糊,由于没有给出真正的方向,而是寻求帮助,我拼凑了一些半伪代码,也许可以帮助您实现最终目标(或者其中的一些)。

    要编辑/删除记录,您需要某种访问它们的方式。最简单的方法是通过指向同一页或专用处理程序脚本的querystring。下面选择专用处理程序。

    [假设上一页 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报告 你应该对如何进行有一个更好的理解,否则我会在酒吧!