You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP商户注册表单:仅发邮件无法写入merchants表求助

问题修复方案

你的代码核心问题是邮件发送成功后仅定义了插入数据的函数,但从未调用该函数,导致数据库插入逻辑根本没执行。另外还存在函数嵌套在条件块、数据库连接代码重复的问题,以下是修复后的完整代码:

修复后的代码

<?php
session_start();

require_once(__DIR__ . '/sendEmails/vendor/autoload.php');

// 公共数据库连接函数,避免重复代码
function getDbConnection() {
    $dbHost = 'localhost';
    $dbName = 'ecommerce_store';
    $dbUsername = 'root';
    $dbPassword = '';

    try {
        $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUsername, $dbPassword);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    } catch(PDOException $e) {
        die("Database connection failed: " . $e->getMessage());
    }
}

// 检查邮箱是否已存在
function checkIfEmailExists($email) {
    $pdo = getDbConnection();
    $query = "SELECT * FROM merchants WHERE email = :email";
    $stmt = $pdo->prepare($query);
    $stmt->execute([':email' => $email]);
    
    return $stmt->rowCount() > 0;
}

// 插入商户数据到数据库
function insertMerchantData($companyName, $contactName, $email, $phone_number, $address, $city, $state, $zip_code) {
    try {
        $pdo = getDbConnection();
        $query = "INSERT INTO merchants (company_name, contact_name, email, phone_number, address, city, state, zip_code) VALUES (:companyName, :contactName, :email, :phone_number, :address, :city, :state, :zip_code)";
        $stmt = $pdo->prepare($query);
        $stmt->execute([
            ':companyName' => $companyName,
            ':contactName' => $contactName,
            ':email' => $email,
            ':phone_number' => $phone_number,
            ':address' => $address,
            ':city' => $city,
            ':state' => $state,
            ':zip_code' => $zip_code
        ]);

        return true;
    } catch(PDOException $e) {
        echo "Database error: " . $e->getMessage();
        return false;
    }
}

// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 获取表单数据
    $companyName = isset($_POST['company_name']) ? $_POST['company_name'] : '';
    $contactName = isset($_POST['contact_name']) ? $_POST['contact_name'] : '';
    $email = isset($_POST['email']) ? $_POST['email'] : '';
    $phone_number = isset($_POST['phone_number']) ? $_POST['phone_number'] : '';
    $address = isset($_POST['address']) ? $_POST['address'] : '';
    $city = isset($_POST['city']) ? $_POST['city'] : '';
    $state = isset($_POST['state']) ? $_POST['state'] : '';
    $zip_code = isset($_POST['zip']) ? $_POST['zip'] : '';

    // 检查邮箱是否已存在
    if (checkIfEmailExists($email)) {
        header("Location: login.php");
        exit;
    }

    // 发送注册邮件
    $mail = new PHPMailer\PHPMailer\PHPMailer();
    $mail->isSMTP();
    $mail->Host = 'smtp.outlook.com';
    $mail->Port = 587;
    $mail->SMTPAuth = true;
    $mail->Username = 'delegant@outlook.com';
    $mail->Password = '****';
    $mail->setFrom('gcizmandelegant@outlook.com', 'e-Shopper');
    $mail->addAddress($email, $contactName);
    $mail->Subject = 'Merchant Registration Successful';
    $mail->Body = 'Dear ' . $contactName . ',<br><br>Your merchant registration was successful.<br><br>Thank you!';
    $mail->isHTML(true);

    if (!$mail->send()) {
        echo 'Email could not be sent.';
        echo 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
        // 关键:调用插入函数,执行数据库写入
        $insertSuccess = insertMerchantData($companyName, $contactName, $email, $phone_number, $address, $city, $state, $zip_code);
        if ($insertSuccess) {
            // 可选:插入成功后跳转至成功页面
            // header("Location: registration_success.php");
            // exit;
            echo "Registration successful!";
        }
    }
}
?>

关键修改说明

  • 核心修复:在邮件发送成功的分支里,主动调用insertMerchantData函数,传入表单收集到的所有数据,触发数据库插入操作
  • 代码优化:将所有函数移至全局作用域,避免PHP函数嵌套的语法问题;封装公共数据库连接函数,减少重复代码
  • 可读性提升:移除重复注释,调整代码结构,让逻辑更清晰

内容的提问来源于stack exchange,提问作者The01800

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:37:05