第一个表单提交插入行后续提交更新同一行
Posted
技术标签:
【中文标题】第一个表单提交插入行后续提交更新同一行【英文标题】:first form submit insert row subsequent submits update the same row 【发布时间】:2017-01-22 16:07:20 【问题描述】:有人对我的问题有其他解决方案吗?
当我第一次点击提交按钮时,我想在 mysql 数据库中插入行。但是表单会验证输入是否有错误,因此如果发现错误,则用户将不得不再次单击提交按钮。现在我想更新数据库中的行。
我使用会话变量来实现这一点,但我现在不能,因为该网站使用 Realex 支付网关,所以当支付成功时我无法取消设置会话,因为此代码在他们的网站上。
这就是我所拥有的:
if(!isset($_SESSION['jid']))
$sql = "INSERT INTO ...";
$result = $db->query($sql);
if($result === false)
sql_failure_handler($sql, $db->error);
$jid = $db->insert_id;
$_SESSSION["jid"] = $jid;
else
$sql = "UPDATE ... WHERE ID = '$_SESSION['jid']";
$result = $db->query($sql);
if($result === false)
sql_failure_handler($sql, $db->error);
这段代码是为了说明我需要什么。
我正在考虑使用 post 变量:
if(empty($_POST['jid'])) // insert on first click of one of the buttons
$sql = "INSERT INTO table ...";
$result = $db->query($sql);
if($result === false)
sql_failure_handler($sql, $db->error);
$jid = $db->insert_id;
else
$sql = "UPDATE table SET ... WHERE ID = '" . $db->real_escape_string($_POST['jid']) . "'";
$result = $db->query($sql);
if($result === false)
sql_failure_handler($sql, $db->error);
然后有一个隐藏变量,但不确定这是否可行。也许是一个 jquery 来设置 jid 值?
【问题讨论】:
【参考方案1】:隐藏字段是一个不错的选择。
在表单中包含一个空的隐藏字段:
<input type="hidden" name="jid" value="" id="jid">
在 php 中。如果 $_POST['jid'] 为空,插入新行并返回带有新创建行 ID 的响应:
$sql = "INSERT INTO table...";
$result = $db->query($sql) or die('Errant query: '.$sql);
$newid = $db->insert_id;
header('Content-type: application/json');
echo '"message":"new field added", "id":"'.$newid.'"';
在客户端,如果发帖成功。更新隐藏字段的值,即
$('#jid').val(response.id)
后续帖子现在将具有 jid
另一种选择:
在PHP中,如果没有插入则检查ID是否已经存在于数据库中,如果是则更新。
$sql = "SELECT id FROM table WHERE id = '$jid' LIMIT 1";
$result = $db->query($sql) or die('Errant query: '.$sql);
$row_cnt = $result->num_rows;
if($row_cnt > 0)
UPDATE
else
INSERT
【讨论】:
以上是关于第一个表单提交插入行后续提交更新同一行的主要内容,如果未能解决你的问题,请参考以下文章
jQuery clone() FireFox 错误 - 无法提交克隆的表单
Oracle APEX - 使用表单提交过程选择要插入的下一行