php - 有没有办法从 2 个不同的表单插入数据并插入到列中的 1 行?

标签 php mysql sql database forms

我有一个用户表,其中包含以下列:用户 ID、用户名、名字、姓氏、电子邮件、 token 、密码、位置、电话。

我在两个不同的页面上有 2 个表单。 1.registration.php 2.user_info.php。

在registration.php中,我获取用户的电子邮件、用户名和密码。在 user_info.php 中,我获取用户的名字、姓氏、国家/地区、电话。

我想将两个表单数据插入 1 行。那么有什么办法吗?

现在用我的代码。它将两个表单中的信息插入数据库,但它在每个表单中插入 2 个不同的行数据。

这是我的registration.php

<?php

if (isset($_POST['signup-submit'])) {

$url = "https://www.google.com/recaptcha/api/siteverify";
$data = ['secret' => "[xxxx]", 'response' => $_POST['token'], 'remoteip' => $_SERVER['REMOTE_ADDR']];
$options = array('http' => array('header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data)));
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$res = json_decode($response, true);

    if ($res['success'] == true) {

        require("dbh.inc.php");
        require("functions.php");

        $username = escape($_POST['username']);
        $email = escape($_POST['email']);
        $token = bin2hex(random_bytes(50));
        $password = escape($_POST['password']);
        $passwordRepeat = escape($_POST['confirm_password']);

        if (empty($username) || empty($email) || empty($password) || empty($passwordRepeat)) {

        header("Location: ../registration.php?error=emptyfields");
        exit(); 

        } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL) || !preg_match("/^[a-zA-Z0-9]*$/", $username)) {

        header("Location: ../registration.php?error=invalidmailuid");
        exit();

        } elseif (strlen($username) <= '6') {

        header("Location: ../registration.php?error=usernamecheck");
        exit();

        } elseif (strlen($password) <= '8') {

        header("Location: ../registration.php?error=passwordcheck");
        exit();

        } elseif ($password !== $passwordRepeat) {

        header("Location: ../registration.php?error=passwordverify");
        exit();

        } else {

        $sql = "SELECT username, email FROM users WHERE username = ? AND email = ?";
        $stmt = mysqli_stmt_init($connection);
        if (!mysqli_stmt_prepare($stmt, $sql)) {            
        header("Location: ../registration.php?error=sqlerror");
        exit(); 

        } else {

        mysqli_stmt_bind_param($stmt, "ss", $username, $email);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_store_result($stmt);
        $resultCheck = mysqli_stmt_num_rows($stmt);

        if ($resultCheck > 0) {
            header("Location: ../registration.php?error=usermailtaken");
            exit(); 

        } else {

            $sql = "INSERT INTO users(username, email, password, token, joined) VALUES(?, ?, ?, ?, now())";
            $stmt = mysqli_stmt_init($connection);
            if (!mysqli_stmt_prepare($stmt, $sql)) {            
            header("Location: ../registration.php?error=sqlerror2");
            exit();

          } else {

            $hashed_password = password_hash($password, PASSWORD_DEFAULT);

            mysqli_stmt_bind_param($stmt, "ssss", $username, $email, $hashed_password, $token);
            mysqli_stmt_execute($stmt);
            header("Location: ../user_info.php");
            exit(); 

                }   
            }
        }   
    }
mysqli_stmt_close($stmt);
mysqli_close($connection);  

} else {
    header("Location: ../registration.php?error=captcha");
    exit();         
}

} else {
    header("Location: ../registration.php?error=emptyfields");
    exit();         
}

这是我的user_info.php

<?php 

if (isset($_POST['profile-submit'])) {

    require("dbh.inc.php");
    require("functions.php");

    $first_name = $_POST['first_name']; 
    $last_name = $_POST['last_name'];
    $location = $_POST['location'];
    $phone = $_POST['phone_number'];

    if (empty($first_name) || empty($last_name) || empty($location) || empty($phone)) {

        header("Location: ../user_info.php?error=emptyfields");
        exit();

    } else {

        $sql = "INSERT INTO users(first_name, last_name, location, phone) VALUES(?, ?, ?, ?)";
        $stmt = mysqli_stmt_init($connection);
        if (!mysqli_stmt_prepare($stmt, $sql)) {            
        header("Location: ../user_info.php?error=sqlerror");
        exit(); 

    } else {

        mysqli_stmt_bind_param($stmt, "sssi", $first_name, $last_name, $location, $phone);
        mysqli_stmt_execute($stmt);
        header("Location: ../index.php?signup=success");
        exit();     

        }
    }
    mysqli_stmt_close($stmt);
    mysqli_close($connection);

} else {
    header("Location: ../user_info.php?error");
    exit();         
}

最佳答案

您需要在user_info.php上使用UPDATE而不是INSERT

INSERT 添加新行。 https://dev.mysql.com/doc/refman/8.0/en/insert.html

INSERT inserts new rows into an existing table.

UPDATE 修改一行中的数据。 https://dev.mysql.com/doc/refman/8.0/en/update.html

UPDATE is a DML statement that modifies rows in a table.

当您执行UPDATE时,您需要添加一个WHERE子句以仅更新您想要的行。您通常使用主键来执行此操作,在本例中我假设主键是 user_id

您可以使用mysqli_insert_id($connection)来获取INSERT查询运行后插入的最后一个ID。我建议将其存储在 $_SESSION 变量中,然后在 user_info.php 上访问它,而不是通过 POST 或 GET 传递。这样,其他用户就不能仅在 GET 或 POST 请求中输入 ID 并更新其他用户的信息。这里有一些代码可以指导您。

注册.php

//start the session
session_start();
...
...
} else {

    mysqli_stmt_bind_param($stmt, "sssi", $first_name, $last_name, $location, $phone);
    mysqli_stmt_execute($stmt);
    $_SESSION['user_id'] = mysqli_insert_id($connection);
    header("Location: ../index.php?signup=success");
    exit();     

    }
}
....
....

user_info.php

....
....
  if (empty($first_name) || empty($last_name) || empty($location) || empty($phone) || !isset($_SESSION['user_id')) {

    header("Location: ../user_info.php?error=emptyfields");
    exit();

} else {

    $sql = "UPDATE users SET first_name = ?, last_name = ?, location = ?, phone =? WHERE user_id = ?";
    $stmt = mysqli_stmt_init($connection);
    if (!mysqli_stmt_prepare($stmt, $sql)) {            
    header("Location: ../user_info.php?error=sqlerror");
    exit(); 

} else {

    mysqli_stmt_bind_param($stmt, "sssi", $first_name, $last_name, $location, $phone, $_SESSION['user_id']);
    mysqli_stmt_execute($stmt);
    header("Location: ../index.php?signup=success");
    exit();     

    }
....
....

关于php - 有没有办法从 2 个不同的表单插入数据并插入到列中的 1 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58940851/

相关文章:

php - 将mysql结果的一行空格替换为 '-'

java - 如何在循环中创建动态 map 对象

sql - 为什么我不能在 count(*) "column"中使用别名并在having 子句中引用它?

php - SQL 查询未在 PHP 中运行,可能是与 SQL 相关的问题

php - 重置现有表中的 id 值(不删除记录)

javascript - 外部 javascript 文件中的 php

sql - Rails - 如何避免对此进行多次查询

php - 在CSS中重叠图像

java - 通过jdbc填充数据库

java - (JDK 1.6 和 ojdbc6.jar)与(JDK 1.5 和 ojdbc14.jar)