调用SQL Server存储过程时遇‘参数1为无效PHP类型’错误
解决PHP调用SQL Server存储过程时的“An invalid PHP type for parameter 1 was specified”错误
问题原因
- 参数类型不匹配:从XML节点
$xml->filenumber获取的值是SimpleXMLElement对象,并非存储过程期望的字符串类型,sqlsrv无法识别该对象作为有效参数。 - 输出参数定义不全:原代码仅指定了输出参数的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
相关产品推荐
相关产品推荐

