我有一个表单页面,其中提交了INSERT或UPDATE查询,具体取决于ID的存在/不存在(当有一个ID时,它用于检索记录并预先填充表单)。在任何一种情况下,处理都在form.php中,因此表单的操作本身就是(action="/form.php">
)。我的问题是当form.php重新加载后提交时,URL有一个空ID,因此页面进入'INSERT'模式,而不是'UPDATE'模式。解决这个问题的最佳做法是什么?
我应该在“if”...
中添加什么操作符/条件 if (isset($_GET['ID']) && is_numeric($_GET['ID'])) {
...包括提交后的空ID ID(即form.php?ID=
)
OR,
如何将`$ newID = mysql_insert_id(); 1传递给表单的操作? (我在这里尝试了很多变化而没有成功)
$newID = mysql_insert_id();
...... [snip] ......
<form method="post" action="/html/form.php?ID=<?php echo $newID; ?>">
我正在阅读隐藏的输入和会话,但我还不清楚如何使用它们来解决这个问题。最后,由于我不是必须重新加载表单页面,因此我越来越倾向于将表单处理/数据库查询移动到另一个页面(例如,process.php)以希望简化;对此有何看法?什么是最好/最常见的做法?
非常感谢,
SVS
答案 0 :(得分:1)
通常的做法应该是将数据发布与数据显示分开。这可以防止用户首次到达页面时意外添加,以及在用户点击刷新时意外发布双重帖子。
此外,保持逻辑分离使代码在未来更具可读性和可维护性。
您应该寻找的方法是:
view.php?ID=<record to view> // Only displays a record already in the DB
add.php // The add record form with action="process_add.php"
process_add.php?Field1=<>&Field2=<>... // Receives data from add.php, puts it in
// the database and then forwards back to
// view.php or add.php as you see fit.
编辑:虽然我在process_add.php上有GET参数,但它们只是为了证明它们正在被传递。它们应该作为POST参数发送和实际实现。
答案 1 :(得分:1)
这是使用模板的这种代码的示例 基于传递id
的思想工作CRUD应用程序 但是,不知道,为什么你需要传递新生成的id。<?
mysql_connect();
mysql_select_db("new");
$table = "test";
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part:
$name = mysql_real_escape_string($_POST['name']);
if ($id = intval($_POST['id'])) {
$query="UPDATE $table SET name='$name' WHERE id=$id";
} else {
$query="INSERT INTO $table SET name='$name'";
}
mysql_query($query) or trigger_error(mysql_error()." in ".$query);
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
exit;
}
if (!isset($_GET['id'])) { //listing part:
$LIST=array();
$query="SELECT * FROM $table";
$res=mysql_query($query);
while($row=mysql_fetch_assoc($res)) $LIST[]=$row;
include 'list.php';
} else { // form displaying part:
if ($id=intval($_GET['id'])) {
$query="SELECT * FROM $table WHERE id=$id";
$res=mysql_query($query);
$row=mysql_fetch_assoc($res);
foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v);
} else {
$row['name']='';
$row['id']=0;
}
include 'form.php';
}
?>
模板:
form.php的
<? include TPL_TOP ?>
<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>
<? include TPL_BOTTOM ?>
和list.php:
<? include TPL_TOP ?>
<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
<? include TPL_BOTTOM ?>