第一个表单提交插入行后续提交更新同一行

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

【讨论】:

以上是关于第一个表单提交插入行后续提交更新同一行的主要内容,如果未能解决你的问题,请参考以下文章

layui表单如何提交下拉框的键值

jQuery clone() FireFox 错误 - 无法提交克隆的表单

PHP表单以数组作为行提交

Oracle APEX - 使用表单提交过程选择要插入的下一行

在HTML中,建立一个提交表单页面,提交后可以直接在数据库看见。

html表单提交,disabled无法获取数据的问题