PHP+HTML图片上传至SQL表:文件路径缺失问题求助
你的代码存在多个关键问题,导致文件路径无法存入SQL表,以下是具体问题和修复方案:
核心错误点及修复
文件字段获取逻辑错误:
你用$prodImage = $_POST["prodImage"];获取文件字段,但文件上传的信息存储在$_FILES数组中,而非$_POST。同时,判断文件是否上传应该检查$_FILES['prodImage']['error']状态,而非isset($_POST['prodImage'])。修复:
// 替换原有的$prodImage = $_POST["prodImage"]; $prodImage = ''; // 替换原有的if (isset($_POST['prodImage'])){ if ($_FILES['prodImage']['error'] != UPLOAD_ERR_NO_FILE) {变量大小写不一致:
代码中用$filelocation定义存储路径,但判断文件存在时写成了file_exists($fileLocation)(大写L),导致判断逻辑失效。修复:
if (file_exists($filelocation)){ // 改为小写l $errMessageProdImage = "Image name is taken"; $validData = false; }文件类型判断逻辑错误:
原代码用||(或)判断文件类型,这会导致无论上传什么类型,条件永远为真(比如上传jpg时,它不等于png,条件成立),直接触发验证失败。应该用&&(与),即当文件类型不是指定的三种之一时才报错。修复:
if($filetype != "image/jpeg" && $filetype != "image/jpg" && $filetype != "image/png") { $errMessageProdImage = "Product Image must be .jpeg, .jpg or .png"; $validData = false; }上传错误数组键名错误:
处理上传错误时用了$_FILES['productImage']['error'],但表单文件字段名是prodImage,键名不匹配导致错误信息无法正确获取。修复:
switch ($_FILES['prodImage']['error']) { // 改为prodImage文件路径未传递到数据库操作文件:
你需要确保$filelocation变量在包含doorLeverFormAddToDB.php时是可用的,建议将文件路径赋值给$prodImage变量,这样数据库操作文件可以直接使用该变量插入数据。修复:
$filelocation = "images/$fileupload"; $prodImage = $filelocation; // 将路径赋值给prodImage,供数据库文件使用缺失文件大小验证:
你在表单中设置了MAX_FILE_SIZE,但代码里没有添加对应的大小检查逻辑,需要补充:修复:
$maxFileSize = 41943040; // 对应表单里的40MB限制 if($filesize > $maxFileSize) { $errMessageProdImage = "File exceeds maximum size limit (40MB)"; $validData = false; }
修正后的完整文件上传验证代码片段
// 替换原有的文件上传相关代码块 if ($_FILES['prodImage']['error'] != UPLOAD_ERR_NO_FILE) { $fileupload = $_FILES['prodImage']['name']; $filetype = $_FILES['prodImage']['type']; $filesize = $_FILES['prodImage']['size']; $tempname = $_FILES['prodImage']['tmp_name']; $filelocation = "images/$fileupload"; $prodImage = $filelocation; // 赋值给prodImage,传递给数据库文件 $maxFileSize = 41943040; if($fileupload == "") { $errMessageProdImage = "Image name invalid"; $validData = false; } if (file_exists($filelocation)){ $errMessageProdImage = "Image name is taken"; $validData = false; } if($filetype != "image/jpeg" && $filetype != "image/jpg" && $filetype != "image/png") { $errMessageProdImage = "Product Image must be .jpeg, .jpg or .png"; $validData = false; } if($filesize > $maxFileSize) { $errMessageProdImage = "File exceeds maximum size limit (40MB)"; $validData = false; } if (!move_uploaded_file($tempname, $filelocation)) { $validData = false; switch ($_FILES['prodImage']['error']) { case UPLOAD_ERR_INI_SIZE: $errMessageProdImage = "File exceeds the maximum size limit set by the server"; break; case UPLOAD_ERR_FORM_SIZE: $errMessageProdImage = "File exceeds the maximum size limit set by the browser"; break; case UPLOAD_ERR_NO_FILE: $errMessageProdImage = "No File Uploaded"; break; default: $errMessageProdImage = "File could not be uploaded"; } } } else { // 未上传文件时触发错误 $errMessageProdImage = "No File Uploaded"; $validData = false; }
额外注意事项
- 确保
images目录存在且有写入权限(可通过chmod 755 images命令设置) - 在
doorLeverFormAddToDB.php中,要确保使用$prodImage变量插入到SQL表对应的字段中
内容的提问来源于stack exchange,提问作者Will Rideout

