You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:25:04