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
相关产品推荐
相关产品推荐

