使用未定义常量 SQLSRV_SQLTYPE_VARCHAR - 假设 'SQLSRV_SQLTYPE_VARCHAR

Use of undefined constant SQLSRV_SQLTYPE_VARCHAR - assumed 'SQLSRV_SQLTYPE_VARCHAR

我无法使用 SQL Server 2014、PHP 7 和 Apache 2.4.17 执行带输出参数的 sp。

这是PHP:

$nombreUsuario = "DrBrahim";
$contraseña = "123456";
$resultado = "dummie";
$datosBienvenida = "dummie";

$sql = "{CALL LOGINv2 (?, ?, ?, ?)}";
$params = array(
    array($nombreUsuario, SQLSRV_PARAM_IN),
    array($contraseña, SQLSRV_PARAM_IN),
    array(&$resultado, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_VARCHAR),
    array(&$datosBienvenida, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_VARCHAR),
);
$stmt = sqlsrv_query($conn, $sql, $params);

if($stmt === false){
    echo 'No se pudo ejecutar la consulta:<br>';
    var_dump(sqlsrv_errors());

    die(print_r(sqlsrv_errors(), true));
}
else{
    sqlsrv_next_result($stmt);
    echo $resultado . "<br>Resultado: " . $resultado . 
    "<br>Datos de bienvenida: " . $datosBienvenida;
}

我明白了:

Notice: Use of undefined constant SQLSRV_PHPTYPE_STRING - assumed 'SQLSRV_PHPTYPE_STRING

还有这个:

An invalid PHP type for parameter 3 was specified.

我回答了以下问题和参考资料(以及更多),其中 none 帮助了我:

注意:当我使用 WebMatrix 尝试此操作时,我只看到第二条消息。

来自php.net

SQLSRV_PHPTYPE_STRING (integer)
Specifies a string PHP data type. This constant works like a function and accepts an encoding constant.

常量 SQLSRV_PHPTYPE_STRING 将被视为一个函数,因为您必须传递一个编码常量才能使其工作。例如:

array(&$resultado, SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_VARCHAR)

可以找到编码常量和有关 PHPTYPE 常量的更多信息 here


从上面 link:

When you use SQLSRV_PHPTYPE_STREAM or SQLSRV_PHPTYPE_STRING, the encoding must be specified. If no parameter is supplied, an error will be returned.


编辑
由于问题标题实际上询问的是 SQLSRV_SQLTYPE_VARCHAR 而不是 SQLSRV_PHPTYPE_STRING 我应该指出前者也是如此:

SQLSRV_SQLTYPE_VARCHAR (integer)
Describes the varchar SQL Server data type. This constant works like a function and accepts a single parameter indicating the character count.

因此,您将添加一个参数来表示该字段的最大字符数,就像您在 SQL 中所做的那样。所以像:

SQLSRV_SQLTYPE_VARCHAR(512)

其中 512 是 1-8000 之间的整数。

因为当您在 SQL 中使用 varchar(MAX) 时,您将使用:

SQLSRV_SQLTYPE_VARCHAR("max")