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'] ?? [];
验证步骤
- 打开浏览器开发者工具网络标签,确认OPTIONS请求返回200状态码
- 查看POST请求的响应,若存在错误会返回具体信息
- 执行插入后,通过MySQL命令行或phpMyAdmin检查表数据
内容的提问来源于stack exchange,提问作者jamesc160
相关产品推荐
相关产品推荐

