我正在尝试执行一个存储过程,将数据输入到我的数据库中。
我设置参数如下:
($conn 有我的数据库信用,$xml 包含来自 XML 文件的数据)
$params = array(
array($xml->filenumber, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(20)),
array($xml->lastName, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(25)),
array($xml->firstName, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(25)),
array("", SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_STRING(14))
);
数据类型与存储过程相对应:
@FileNumber varchar(20),
@FamilyName varchar(25),
@GivenName varchar(25),
@FileID varchar(14) output
然后在 PHP 中执行它:
$sql = "EXEC dbo.AddFileHdr @FileNumber = ?, @FamilyName = ?, @GivenName = ?, @FileID =?";
$stmt = sqlsrv_prepare($conn, $sql, $params);
if( !$stmt ) {
die( print_r( sqlsrv_errors(), true));
}
if(sqlsrv_execute($stmt)){
while($res = sqlsrv_next_result($stmt)){
//doesnt need to output anything here
}
}else{
die( print_r( sqlsrv_errors(), true));
}
插入 3 个字段后,查询的预期行为是返回 14 个字符的 varchar
FileID
。我已经在 SQL Studio 中测试了存储过程,它工作正常。
SQLSRV_PHPTYPE_STRING
接受编码类型常量作为参数:
$fileId = "";
$params = array(
array($xml->filenumber, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(20)),
array($xml->lastName, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(25)),
array($xml->firstName, SQLSRV_PARAM_IN, SQLSRV_SQLTYPE_VARCHAR(25)),
array(&$fileId, SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR))
);
您可以使用其他编码常量更改
SQLSRV_ENC_CHAR
,如下所述:https://www.php.net/manual/en/sqlsrv.constants.php
顺便说一句,我建议您始终使用变量作为查询参数并通过引用传递它(参见
$fileId
):
作为查询参数传递的变量应该通过引用而不是值传递。例如,传递 &$myVariable 而不是 $myVariable。当执行带有按值参数的查询时,会引发 PHP 警告。