PHP执行SQL Server预编译语句报参数1类型无效错误求助
问题原因
你遇到的IMSSP -16 无效的参数1PHP类型报错,最常见的诱因是PHP 7+版本中使用了旧版sqlsrv扩展要求的引用传参写法,导致扩展无法正确识别变量类型,其次是参数的实际类型和数据库字段类型不匹配,sqlsrv自动类型推断失败。
解决方案
1. 移除参数数组的引用符号
PHP 5.x版本的sqlsrv扩展要求参数传引用,但PHP 7及以上版本无需该写法,传引用反而会导致类型识别异常。修改$params定义如下:
$params = array( $id_customer, $name1, $name2, );
修改后重新执行,90%以上的该类报错都会被解决。
2. 显式指定参数类型(可选,解决剩余场景问题)
如果移除引用后仍报错,可以手动指定每个参数的PHP类型和对应SQL字段类型,避免自动推断出错,示例写法如下(请根据你数据库实际的字段类型、长度调整参数):
// 示例假设STCODCLI是长度20的varchar,STRAGSO1、STRAGSO2是长度100的varchar $params = array( array($id_customer, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_VARCHAR(20)), array($name1, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_VARCHAR(100)), array($name2, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_VARCHAR(100)), );
如果STCODCLI是整型字段,对应修改为SQLSRV_SQLTYPE_INT即可。
3. 强制转换变量类型(可选)
如果$id_customer的实际类型和字段类型不符,可以在传参前强制转换:
- 字段为字符串:
(string)$id_customer - 字段为整型:
(int)$id_customer
内容的提问来源于stack exchange,提问作者chattago2002
相关产品推荐
相关产品推荐

