我用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() );
}
}
?>我希望在用户第一次提交数据后,页面应该加载一个带有以前选中的框的新表,并且用户应该能够进行所需的更改并重新提交。数据库应该进行相应的更新。
发布于 2019-04-10 02:34:08
给出的标准看起来有点模糊,由于没有给出真正的方向,但寻求了帮助,我拼凑了一些半伪代码,也许可以在实现最终目标的道路上帮助你(或者至少是其中的一些)。
要编辑/删除记录,您需要某种访问它们的方式。最简单的方法是通过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可能会出现索引等错误。然而,当涉及到重新检查复选框时,您需要测试数据库/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进行了更改,你应该更好地理解如何继续,如果不是这样,我将在酒吧!
https://stackoverflow.com/questions/55579816
复制相似问题