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

调用SQL Server存储过程时遇‘参数1为无效PHP类型’错误

解决PHP调用SQL Server存储过程时的“An invalid PHP type for parameter 1 was specified”错误

问题原因

  1. 参数类型不匹配:从XML节点$xml->filenumber获取的值是SimpleXMLElement对象,并非存储过程期望的字符串类型,sqlsrv无法识别该对象作为有效参数。
  2. 输出参数定义不全:原代码仅指定了输出参数的PHP类型,缺少对应的SQL Server数据类型,且直接传递空字符串无法正确接收返回值。

修复方案

1. 转换XML节点值为字符串

对所有从XML提取的参数,通过强制类型转换转为字符串,同时修正输出参数的定义:

// 初始化变量接收输出的FileID
$fileID = "";

$params = array(
    array((string)$xml->filenumber, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(20)),
    array((string)$xml->lastName, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(25)),
    array((string)$xml->firstName, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(25)),
    array(&$fileID, SQLSRV_PARAM_OUT, SQLSRV_SQLTYPE_VARCHAR(14), SQLSRV_PHPTYPE_STRING(14))
);
  • 使用(string)将SimpleXMLElement对象转为字符串,匹配存储过程的varchar参数要求。
  • 输出参数通过引用传递(&$fileID)接收返回值,同时补充SQLSRV_SQLTYPE_VARCHAR(14)与存储过程的输出类型对应。

2. 调整执行代码

确保SQL语句中输出参数加上OUTPUT关键字,执行后直接读取输出变量:

$sql = "EXEC dbo.AddFileHdr @FileNumber = ?, @FamilyName = ?, @GivenName = ?, @FileID = ? OUTPUT";
$stmt = sqlsrv_prepare($conn, $sql, $params);
if( !$stmt ) {
 die( print_r( sqlsrv_errors(), true));
}

if(sqlsrv_execute($stmt)){
    // 直接获取返回的FileID
    echo "生成的FileID: " . $fileID;
}else{
    die( print_r( sqlsrv_errors(), true));
}

内容的提问来源于stack exchange,提问作者user1765369

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:53:24