Netflix克隆项目部署上线触发SQLSTATE[42S02]、42S22报错
仿Netflix站点部署故障排查
错误根因
两个报错均为数据库部署配置错误导致,和贴出的PHP业务代码逻辑无关,这也是项目本地XAMPP环境运行正常的核心原因:
- 首个
Base table or view not found报错:代码连接的线上数据库名为dingyczcz,部署时没有将本地库中的videoProgress业务表导入到该数据库下,PDO执行SQL时找不到对应表直接抛出异常。报错信息里的dingyczczvideoProgress是数据库名+表名的自动拼接标识,不是要求创建带这个名字的对象。 - 后续
Column not found报错:错误创建了名为dingyczczvideoProgress的空数据库,而非在dingyczcz业务库下创建videoProgress表,SQL执行时定位不到正确的表结构,自然找不到username字段。
修复步骤
- 删除误创建的名为
dingyczczvideoProgress的空数据库,该数据库对项目运行无任何作用。 - 打开项目的数据库配置文件,确认线上环境的数据库连接参数指向主机分配的
dingyczcz库,且连接账号拥有该库的读写、建表权限。 - 将本地XAMPP环境中项目使用的完整数据库(含所有表结构、初始业务数据,必须包含
videoProgress、videos等所有业务表)导出为SQL文件,导入到线上的dingyczcz数据库中。导入完成后确认dingyczcz库下存在videoProgress表,且表结构包含代码中用到的videoId、username、dateModified字段。 - 清理浏览器缓存、PHP进程缓存后重新访问站点即可恢复正常。
相关代码说明
VideoProvider.php中相关方法SQL写法无语法问题,以getEntityVideoForUser方法为例,核心查询逻辑无需修改:
public static function getEntityVideoForUser($con, $entityId, $username) { $query = $con->prepare("SELECT videoId FROM `videoProgress` INNER JOIN videos ON videoProgress.videoId = videos.id WHERE videos.entityId = :entityId AND videoProgress.username = :username ORDER BY videoProgress.dateModified DESC LIMIT 1"); $query->bindValue(":entityId", $entityId); $query->bindValue(":username", $username); $query->execute(); if($query->rowCount() == 0) { $query = $con->prepare("SELECT id FROM videos WHERE entityId=:entityId ORDER BY season, episode ASC LIMIT 1"); $query->bindValue(":entityId", $entityId); $query->execute(); } return $query->fetchColumn(); }
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

