PHP上传图片至SQL Server数据库报错问题咨询
问题分析与修复方案
核心错误点
- 重复调用
move_uploaded_file:你连续执行了两次move_uploaded_file($tmp_name, $targetFile),第一次已经将临时文件移动到目标目录,第二次调用时临时文件已不存在,直接触发Sorry, there was an error uploading your file.提示。 - SQL插入语句错误:SQL语句中直接用文件名
$img_name作为字段值,完全不符合VARBINARY(MAX)字段的要求,需使用参数占位符绑定二进制数据。 - 参数绑定格式错误:
sqlsrv_prepare的参数数组配置不符合规范,无法正确将二进制数据传递到数据库。
修复后的完整PHP代码
<?php $serverName = ""; $connectionOptions = array( "Database"=>"Produccion", "UID"=>"", "PWD"=>""); // 建立数据库连接 $conn = sqlsrv_connect($serverName, $connectionOptions); if (!$conn) { die("Connection failed: " . print_r(sqlsrv_errors(), true)); } if ($_SERVER["REQUEST_METHOD"] == "POST") { if (isset($_FILES["image"]) && $_FILES["image"]["error"] == UPLOAD_ERR_OK) { $img_name = $_FILES['image']['name']; $tmp_name = $_FILES['image']['tmp_name']; $targetDir = "uploads/"; $targetFile = $targetDir . basename($img_name); // 确保上传目录存在,不存在则创建 if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); } // 验证文件类型 $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION)); if (in_array($imageFileType, ["jpg", "jpeg", "png"])) { // 仅调用一次文件移动操作 if (move_uploaded_file($tmp_name, $targetFile)) { $imageData = file_get_contents($targetFile); // 使用参数占位符,正确绑定二进制数据 $sql = "INSERT INTO ImageTable (ImageData) VALUES (?)"; $params = array( array($imageData, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY), SQLSRV_SQLTYPE_VARBINARY('max')) ); $stmt = sqlsrv_prepare($conn, $sql, $params); if ($stmt && sqlsrv_execute($stmt)) { echo "Image inserted into the database successfully."; } else { echo "Image insertion failed: " . print_r(sqlsrv_errors(), true); } // 删除临时文件(可选) unlink($targetFile); } else { echo "Sorry, there was an error uploading your file."; } } else { echo "Only JPG, JPEG, and PNG files are allowed."; } } else { echo "No file uploaded or upload error occurred."; } } // 关闭数据库连接 sqlsrv_close($conn); ?>
额外说明
- 无需启用Ole Automation Procedures:你的场景是通过PHP读取文件二进制内容直接插入
VARBINARY(MAX)字段,完全不需要启用该功能,仅当SQL Server内部通过OLE对象操作文件时才需要配置。 - 新增上传错误校验:添加
$_FILES["image"]["error"] == UPLOAD_ERR_OK判断,可更精准识别文件是否正常上传。 - 错误信息优化:用
print_r(sqlsrv_errors(), true)输出详细数据库错误,便于排查插入失败的具体原因。
内容的提问来源于stack exchange,提问作者Dprogrammer
相关产品推荐
相关产品推荐

