本地环境PHP图片上传正常,服务器端数据库无数据写入问题
排查PHP图片上传后数据库未写入的线上环境问题
我来帮你分析下这个棘手的问题——本地跑完全正常,线上图片成功上传到uploads目录,但数据库就是没数据,还捕获不到异常,这种情况基本都是本地与线上环境的配置/权限/SQL语法差异导致的,咱们一步步来排查修复:
一、先强制开启错误输出,抓出隐藏的数据库错误
线上服务器通常默认关闭了PHP错误显示,所以你看不到SQL执行的具体问题。在代码最开头加上这段,强制显示所有错误:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); include './login_validity.php'; // 后面的代码保持不变
这样再提交表单,就能直接看到数据库操作的错误信息(比如权限不足、SQL语法错误、字段不匹配等)。
二、检查数据库连接的有效性
确保线上环境的$conn连接是正常的,有时候本地用的数据库配置和线上不一样(比如主机、用户名、权限)。在执行插入语句前加个连接校验:
// 在$query定义前添加 if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); }
如果连接有问题,这里会直接输出错误。
三、修复SQL语句的安全与语法问题
你现在直接拼接变量到SQL里,不仅有严重的SQL注入风险,还会因为变量中的特殊字符(比如单引号、换行)导致SQL语法断裂,线上数据库对语法的校验通常比本地严格。一定要用预处理语句,替换原来的插入逻辑:
// 替换原来的$query和$res部分 if(isset($img)){ // 确保图片路径变量存在 $stmt = $conn->prepare("INSERT INTO slider (title,image,shrt_description,description,date,is_show) VALUES (?,?,?,?,?,?)"); // 绑定参数,"ssssss"表示6个字符串类型参数,根据你的表字段类型调整 $stmt->bind_param("ssssss", $name, $img, $shrt_detail, $detail, $date, $show_status); $res = $stmt->execute(); if($res){ $mes = "Successfully Added"; } else { // 打印SQL执行错误 echo "数据库插入失败: " . $stmt->error; $_SESSION['message'] = "数据写入失败,请重试"; } $stmt->close(); }
预处理语句会自动处理特殊字符,避免语法错误,同时还能防SQL注入。
四、核对线上数据库表结构
确认线上的slider表和本地的完全一致:
- 字段名是否拼写正确?比如
shrt_description是不是线上表写成了short_description? - 字段类型是否匹配?比如
date字段是否接受你传入的日期格式?本地数据库可能宽松,线上严格,导致插入失败。 - 字段是否允许为空?比如
image字段如果设置为NOT NULL,但如果用户没上传图片时$img为NULL,就会插入失败。
五、查看服务器错误日志
如果还是没线索,去看线上服务器的错误日志:
- Apache服务器日志通常在
/var/log/apache2/error.log - Nginx服务器日志通常在
/var/log/nginx/error.log - PHP的错误日志路径可以看
php.ini里的error_log配置
日志里会记录PHP或数据库的底层错误,帮你定位问题。
附上你提供的原始代码(格式化后):
<?php include './login_validity.php'; $res = ''; $mes = ''; $img = NULL; if (isset($_POST['submit'])) { $name = $_POST['title']; $des = $_POST['description']; $shrt_detail = $_POST['shrt_description']; $date = $_POST['date']; $show_status = $_POST['is_show']; $detail = $des; //------------------image upload--------------------- if (!empty($_FILES["fileToUpload"]["name"])) { $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($target_file, PATHINFO_EXTENSION); // Check if image file is a actual image or fake image $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if ($check !== false) { $uploadOk = 1; } else { $_SESSION['message'] = "File is not an image."; $uploadOk = 0; } // Allow certain file formats if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" && $imageFileType != "tif") { $_SESSION['message'] = "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { $_SESSION['message'] = "Sorry, your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { $_SESSION['message'] = "The file " . basename($_FILES["fileToUpload"]["name"]) . " has been uploaded."; } else { $_SESSION['message'] = "Sorry, there was an error uploading your file."; } } $img = $target_file; } $query = "INSERT INTO slider (title,image,shrt_description,description,date,is_show) VALUES ('$name','$img','$shrt_detail','$detail','$date','$show_status')"; $res = $conn->query($query); $mes = "Successfully Added"; } ?>
内容的提问来源于stack exchange,提问作者user9416697
相关产品推荐
相关产品推荐

