【问题标题】:How to view/edit/delete records from a checklist table in php/mysql如何从 php/mysql 中的清单表中查看/编辑/删除记录
【发布时间】:2019-08-29 23:31:09
【问题描述】:

我在 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>';
}
?>

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

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

【问题讨论】:

    标签: php html sql-update sql-delete


    【解决方案1】:

    给出的标准似乎有点脆弱,并且由于没有给出真正的方向但寻求帮助,我拼凑了一些半伪代码,也许可以帮助您实现最终目标(或其中一些)无论如何)

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

    [ 假设前一页 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-oharvestc23-o44 等...这是未知的!

    也不知道为什么数组迭代使用for( $i=0.... 语法而不是foreach?在我看来,使用for( $i=0; $i... etc 会增加索引等错误的可能性。但是,在重新检查复选框时,您需要测试数据库 /array 中的当前行是否等于其他值 - 请参阅先前关于未知值的评论.所以,伪明智的:

    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 进行更改,您应该会有更好的理解如何进行,否则我会在酒吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多