程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了“为参数 0 指定了无效的 PHP 类型”。用于简单的 PHP/SQL 调用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决“为参数 0 指定了无效的 php 类型”。用于简单的 php/SQL 调用?

开发过程中遇到“为参数 0 指定了无效的 php 类型”。用于简单的 php/SQL 调用的问题如何解决?下面主要结合日常开发的经验,给出你关于“为参数 0 指定了无效的 php 类型”。用于简单的 php/SQL 调用的解决方法建议,希望对你解决“为参数 0 指定了无效的 php 类型”。用于简单的 php/SQL 调用有所启发或帮助;

在 windows Server 2012 R 2 上使用 php 8 和 MS sql Server 2014。我相信我已经更新了 sql 的 php 驱动程序。

鉴于此示例 php 脚本:

<?php
        $connectionInfo = array( "Database"=>"$database","UID"=>"$username","PWD"=>"$password","CharacterSet"=>"UTF-8");
        $conn = sqlsrv_connect( $hostname,$connectionInfo);
        
        if( !$conn ) {
             echo "Connection Could not be established.<br />";
             dIE( print_r( sqlsrv_errors(),truE));
        }
    $sql = "{CALL countRows2 (?)}";
    $nbrRows = 0;
    $varpar1 = array(&$nbrRows,sqlSRV_ParaM_INOUT,sqlSRV_phpTYPE_INT,sqlSRV_sqlTYPE_int);
    $params = array(&$varpar1); 

     $stmt = sqlsrv_prepare( $conn,$sql,$params);
     if( !$stmt ) {
      dIE( print_r( sqlsrv_errors(),truE));
     }

     error_log("Prepared worked");
     if( sqlsrv_execute ($stmt) === false ) {
        error_log("Execute Failed ");
         dIE( print_r( sqlsrv_errors(),truE));
     }


      error_log("Nbr Rows = " . $nbrRows);

?>

还有这个存储过程

SET ANSI_NulLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,name>
-- Create date: <Create Date,>
-- Description: <Description,>
-- =============================================
ALTER PROCEDURE [dbo].[countRows2] 
    -- Add the parameters for the stored procedure here
    @count INT OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
        BEGIN TRY
            -- Insert statements for procedure here
            SET @count = (SELECT COUNT(*) FROM dbo.entrIEs);

        END TRY
        BEGIN CATCH
            declare @error int,@message varchar(4000),@xstatE int;
            SELEct @error = ERROR_@R_772_10793@ER(),@message = ERROR_messaGE();
            raiserror ('Caught exception: %d: %s',16,1,@error,@messagE) ;
        END CATCH
END

我明白了:

准备工作执行失败的阵列( [0] => 数组 ( [0] => imsSP [sqlSTATE] => imsSP [1] => -16 [代码] => -16 [2] => 为参数 0 指定了无效的 php 类型。 [消息] => 为参数 0 指定了无效的 php 类型。 )

)

如果我在调用中添加一个额外参数或省略一个参数,系统会抱怨签名不匹配,因此 php 和 sql DB 之间似乎存在某种联系。

但是为什么它会抱怨无效的 php 类型?

如果我这样做

$params = array(&$nbrRows); 

$stmt = sqlsrv_prepare( $conn,$params);
if( !$stmt ) {
    dIE( print_r( sqlsrv_errors(),truE));
}

error_log("Prepared worked");
if( sqlsrv_execute ($stmt) === false ) {
    error_log("Execute Failed ");
      dIE( print_r( sqlsrv_errors(),truE));
}

error_log("Nbr Rows = " . $nbrRows);

不会抛出任何错误,但 $nbrRows 始终为 0:

准备工作的 Nbr Rows = 0

解决方法

感谢您的建议。

这有效:

$varpar1 = array(&$nbrRows,SQLSRV_PARAM_INOUT,SQLSRV_phpTYPE_INT,SQLSRV_SQLTYPE_int);
$params = array($varpar1);

大佬总结

以上是大佬教程为你收集整理的“为参数 0 指定了无效的 PHP 类型”。用于简单的 PHP/SQL 调用全部内容,希望文章能够帮你解决“为参数 0 指定了无效的 PHP 类型”。用于简单的 PHP/SQL 调用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。