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

时间:2016-08-02 15:53:47

标签: php apache sqlsrv

我无法使用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;
}

我明白了:

  

注意:使用未定义的常量SQLSRV_PHPTYPE_STRING - 假设   “SQLSRV_PHPTYPE_STRING

而且:

  

指定了参数3的无效PHP类型。

我已经阅读了以下问题和参考资料(以及更多),但没有一个能够提供帮助:

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

1 个答案:

答案 0 :(得分:0)

来自php.net

  

SQLSRV_PHPTYPE_STRING(整数)
  指定字符串PHP数据类型。此常量的作用类似于函数,并接受编码常量。

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

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

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

从上面链接:

  

使用SQLSRV_PHPTYPE_STREAM或SQLSRV_PHPTYPE_STRING时,必须指定编码。如果未提供参数,则将返回错误。

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

  

SQLSRV_SQLTYPE_VARCHAR(整数)
  描述varchar SQL Server数据类型。此常量与函数类似,并接受指示字符数的单个参数。

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

SQLSRV_SQLTYPE_VARCHAR(512)

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

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

SQLSRV_SQLTYPE_VARCHAR("max")