使用参数化查询时收到错误“为参数 1 指定了无效的 PHP 类型”

问题描述 投票:0回答:1

我正在尝试执行一个存储过程,将数据输入到我的数据库中。

我设置参数如下:

($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 中测试了存储过程,它工作正常。

php sql-server sqlsrv
1个回答
0
投票

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 警告。

© www.soinside.com 2019 - 2024. All rights reserved.