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

PHP脚本无法将电影ID保存至MySQL数据库求助

排查PHP写入MySQL无数据问题

问题根源分析

从你提供的信息来看,三个核心问题导致数据无法写入:

1. CORS预检请求未处理

你重复设置了Access-Control-Allow-Origin,且未处理浏览器发送的OPTIONS预检请求。跨域POST请求发起前,浏览器会先发送OPTIONS请求确认权限,你的脚本未针对该请求做正确响应,导致实际POST请求可能并未真正执行。

2. 数据库表约束违反

你的seen_movies表中title字段是NOT NULL约束,但INSERT语句仅插入id字段、未提供title值,这会直接导致SQL执行失败。同时脚本未检查execute()的返回结果,错误被隐藏,依然返回success。
另外,表的id字段是自增主键,手动插入电影ID可能触发主键冲突,进一步导致插入失败。

3. 缺少关键步骤的错误检查

脚本未检查prepare()、bind_param()、execute()的返回值,无法定位SQL执行过程中的错误,导致你误以为脚本正常运行。

修复方案

1. 修正CORS配置并处理OPTIONS请求

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// 处理OPTIONS预检请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
    header('Access-Control-Allow-Headers: Content-Type, Authorization');
    header('HTTP/1.1 200 OK');
    exit();
}

// 正常请求的CORS头
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

$servername = "*********";
$username = "******";
$password = "************";
$dbname = "my_movies";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die(json_encode(['status' => 'error', 'message' => 'Connection failed: ' . $conn->connect_error]));
}

2. 修正数据库表结构或INSERT语句

两种可选方案:

  • 方案一:修改表结构,允许title为空(若无需强制存储title)
ALTER TABLE seen_movies MODIFY COLUMN title varchar(255) NULL;
  • 方案二:调整INSERT语句,同时插入id和title(需前端同步传递title数据)
// 假设前端传递的selectedMovies是包含id和title的数组
if (isset($_POST['selectedMovies'])) {
    $selectedMovies = $_POST['selectedMovies'];
    $stmt = $conn->prepare("INSERT INTO seen_movies (id, title) VALUES (?, ?)");
    if (!$stmt) {
        die(json_encode(['status' => 'error', 'message' => 'Prepare failed: ' . $conn->error]));
    }
    $stmt->bind_param("is", $movieId, $movieTitle);

    foreach ($selectedMovies as $movie) {
        $movieId = $movie['id'];
        $movieTitle = $movie['title'];
        if (!$stmt->execute()) {
            error_log('Insert failed for ID ' . $movieId . ': ' . $stmt->error);
        }
    }
    $stmt->close();
}

3. 添加错误检查,暴露问题

在关键步骤增加错误捕获,方便定位问题:

// 检查prepare是否成功
$stmt = $conn->prepare("INSERT INTO seen_movies (id) VALUES (?)");
if (!$stmt) {
    die(json_encode(['status' => 'error', 'message' => 'Prepare failed: ' . $conn->error]));
}

// 检查绑定是否成功
if (!$stmt->bind_param("i", $movieId)) {
    die(json_encode(['status' => 'error', 'message' => 'Bind failed: ' . $stmt->error]));
}

// 执行时捕获错误
foreach ($selectedMovies as $movieId) {
    if (!$stmt->execute()) {
        die(json_encode(['status' => 'error', 'message' => 'Insert failed for ID ' . $movieId . ': ' . $stmt->error]));
    }
}

4. 适配前端数据格式

若前端发送的是JSON格式数据,需调整PHP的参数获取方式:

// 解析JSON格式的请求体
$input = json_decode(file_get_contents('php://input'), true);
$selectedMovies = $input['selectedMovies'] ?? [];

验证步骤

  1. 打开浏览器开发者工具网络标签,确认OPTIONS请求返回200状态码
  2. 查看POST请求的响应,若存在错误会返回具体信息
  3. 执行插入后,通过MySQL命令行或phpMyAdmin检查表数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:43:23