【问题标题】:I want to let the user to submit form only for once and after he can update it我想让用户只提交一次表单,然后他可以更新它
【发布时间】:2020-05-06 05:15:16
【问题描述】:

我正在做一个有两张桌子的项目;用户表和电影表

我有代码在用户登录后提交与电影信息相关的表单,但我想要做的是只将该数据插入表中一次,插入后用户可以根据需要对其进行更新。

我已经编写了插入代码,正如您所知,每次我提交表单时它都会插入一个包含数据的新行,我希望只插入一行,然后该用户可以更新它。

我的插入代码如下


if (isset($_POST['an-submit'])) {
    if (empty($_POST['anfav'])) {
        $errors['anfav'] = 'Favourite required';
    }
    if (empty($_POST['anrank'])) {
        $errors['anrank'] = 'Rank required';
    }
    if (empty($_POST['anrewatched'])) {
        $errors['anrewatched'] = 'Rewatched required';
    }
    if (empty($_POST['anstatus'])) {
        $errors['anstatus'] = 'Status required';
    }
    if (empty($_POST['anrecommend'])) {
        $errors['anrecommend'] = 'Recommend required';
    }

    $anfav = $_POST['anfav'];
    $anrank = $_POST['anrank'];
    $anrewatched = $_POST['anrewatched'];
    $anstatus = $_POST['anstatus'];
    $anrecommend = $_POST['anrecommend'];
    $id = $_SESSION['id'];

    // Select id from users and insert into movie
    if (count($errors) === 0) {
        $query = "INSERT INTO anime SET movie_fav=?, movie_rank=?, movie_rewatch=?, movie_status=?, movie_rec=?, id =?";
        $stmt = $conn->prepare($query);
        $stmt->bind_param('siissi', $anfav, $anrank, $anrewatched, $anstatus, $anrecommend, $id);
        $result = $stmt->execute();

        if ($result) {
            $movie_id = $stmt->insert_id;
            $stmt->close();

            $_SESSION['movieid'] = $movie_id;   
            $_SESSION['anfav'] = $anfav;
            $_SESSION['anrank'] = $anrank;
            $_SESSION['anrewatched'] = $anrewatched;
            $_SESSION['anstatus'] = $anstatus;
            $_SESSION['anrecommend'] = $anrecommend;
            $_SESSION['message'] = 'Details have been submitted successfully!';
            $_SESSION['type'] = 'alert-success';
            header('location: movieinfo.php');
        } else {
            $_SESSION['error_msg'] = "Database error: Could not update details";
        }
    }
}

我怎样才能让表单只提交一次,然后让它可更新 谁能帮我解决这个问题

谢谢

【问题讨论】:

  • 正常方式:如果您填写表单 (html-form),则创建一个隐藏字段,其中“id”作为名称,主键 ($movie_id) 作为值。如果没有记录(新记录),则 id 为“0”。在脚本中,您可以检查 id 是 !=0(更新)还是“0”(插入)
  • 也可以使用INSERT ON DUPLICATE KEY UPDATE,这样如果发生唯一密钥冲突,它就会成为更新。如果 user_id 是唯一的或 (user_id,movie_id),我没有关注。然而,两者都有效。
  • users表id为主键,movie表id为外键,movieid为主键。
  • 很抱歉我忘了提及,但我在我的表单中使用了选择标签
  • 听起来您可能需要两个单独的页面。 1允许唯一插入,另一个用于更新sql行。值得庆幸的是,正如先前评论中所述,只要您的数据库中有唯一的 id 标签,您就可以根据 ID 在 sql 中调用该行并将值回显到您的更新表单。

标签: php mysql row


【解决方案1】:

您可以重定向到movieinfo.php,使用最后插入的ID,如header('location: movieinfo.php?movie_id='.$movie_id);,无需在会话中存储所有字段的数据。在movieinfo.php 中,您可以从相应的表中获取movie_id 的详细信息并将其显示在HTML 表单中以供更新。

例如:

if (isset($_POST['an-submit'])) {
    if (empty($_POST['anfav'])) {
        $errors['anfav'] = 'Favourite required';
    }
    if (empty($_POST['anrank'])) {
        $errors['anrank'] = 'Rank required';
    }
    if (empty($_POST['anrewatched'])) {
        $errors['anrewatched'] = 'Rewatched required';
    }
    if (empty($_POST['anstatus'])) {
        $errors['anstatus'] = 'Status required';
    }
    if (empty($_POST['anrecommend'])) {
        $errors['anrecommend'] = 'Recommend required';
    }

    $anfav = $_POST['anfav'];
    $anrank = $_POST['anrank'];
    $anrewatched = $_POST['anrewatched'];
    $anstatus = $_POST['anstatus'];
    $anrecommend = $_POST['anrecommend'];
    $id = $_SESSION['id'];

    // Select id from users and insert into movie
    if (count($errors) === 0) {
        $query = "INSERT INTO anime SET movie_fav=?, movie_rank=?, movie_rewatch=?, movie_status=?, movie_rec=?, id =?";
        $stmt = $conn->prepare($query);
        $stmt->bind_param('siissi', $anfav, $anrank, $anrewatched, $anstatus, $anrecommend, $id);
        $result = $stmt->execute();

        if ($result) {
            $movie_id = $stmt->insert_id;
            $stmt->close();

            $_SESSION['message'] = 'Details have been submitted successfully!';
            $_SESSION['type'] = 'alert-success';
            header('location: movieinfo.php?movie_id='.$movie_id);
        } else {
            $_SESSION['error_msg'] = "Database error: Could not update details";
$_SESSION['type'] = 'alert-error';
        }
    }
}

【讨论】:

  • 首先感谢您的回复。我已尝试根据您的建议进行更改,但每次提交表单时我仍然会将信息插入新行
  • @karthik,请分享 movieinfo.php 脚本。
  • 实际上我已经尝试根据 Alex Carsons 的建议创建两种表单,并且成功了。不管怎样,谢谢你的帮助
猜你喜欢
  • 2014-10-29
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多