1

ユーザーが入力したデータを渡す mssql ストアド プロシージャを実行しようとしています。ストアド プロシージャを直接実行すると正常に動作しますが、添付のコードを使用して実行しようとすると、エラーが発生せず、何も更新されません。渡される日付と関係があると思います。データベースの日付フィールドは「datetime」として定義されています。それは何か別のものかもしれませんが、このシステムで同じように実行される他のストアド プロシージャは正常に動作しています。

//initiate function
    $proc = mssql_init('usp_Update_Certificate_Customer_Details', $msdb); 

    //define parameters
    $telId = $_POST['telId'];
    $certNumber = $_POST['certNumber'];
    $custTel = $_POST['main_tel'];
    $instRef = $_POST['install_ref'];
    //$commDate = $_POST['comm_date'];
    $standards = $_POST['standards'];
    $commDate = date('Y-m-d h:i:s');
    echo 'telid: '.$telId.' certNumber: '.$certNumber.' custTel: '.$custTel.' instRef: '.$instRef.' commDate: '.$commDate.' standards: '.$standards;
    mssql_bind($proc, '@Telephone_ID', $telId, SQLINT4, false, false, 10);
    mssql_bind($proc, '@Certificate_Number', $certNumber, SQLINT4, false, false, 10);
    mssql_bind($proc, '@Customer_Telephone', $custTel, SQLVARCHAR, false, false, 10);
    mssql_bind($proc, '@Installers_Reference', $instRef, SQLVARCHAR, false, false, 10);
    mssql_bind($proc, '@Commisioned_Date', $commDate, SQLDATETIME, false, false, 10);
    mssql_bind($proc, '@Installed_to_Standards', $standards, SQLVARCHAR, false, false, 10);

    //Execute Procedure 
    $result = mssql_execute($proc); 

    //Free Memory 
    mssql_free_statement($proc); 

フィールドを「SQLDATETIME」に設定して上記のように実行すると、php 警告が表示されます

    Warning: mssql_bind() expects parameter 4 to be long, string given

フィールドを「SQLVARCHAR」に設定して実行すると、エラーは発生しませんが、データベースの更新は発生しません

以下で実行されるストアド プロシージャを貼り付けました。

    SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:        Phil Yeomn

-- Create date: 19-04-2008

-- Description:   Update Customer Details

-- =============================================

ALTER PROCEDURE [dbo].[usp_Update_Certificate_Customer_Details](

@Telephone_ID INT,

@Certificate_Number Int,

@Customer_Telephone Varchar(50),

@Installers_Reference Varchar(50),

@Commisioned_Date Datetime,

@Installed_To_Standards Varchar(50)

)



AS

BEGIN

SET NOCOUNT ON;



IF @Telephone_ID <> 0 AND @Customer_Telephone IS NULL

BEGIN

      DELETE FROM ssaib.dbo.Telephone_T

      WHERE Telephone_ID = @Telephone_ID



      SET @Telephone_ID = NULL

END



IF @Telephone_ID = 0 AND @Customer_Telephone IS NOT NULL

BEGIN

INSERT INTO       ssaib.dbo.Telephone_T (Telephone_Number_VC, Last_Update_DT)

VALUES               (@Customer_Telephone, GETDATE())



SET @Telephone_ID = SCOPE_IDENTITY()

END



IF @Telephone_ID = 0

BEGIN

SET @Telephone_ID = NULL

END



UPDATE      ssaib.dbo.Certificate_Returns_T

SET         Customer_Telephone_ID = @Telephone_ID,

            Installers_Reference_VC = @Installers_Reference,

            Commisioned_Date_DT = @Commisioned_Date,

            Installed_To_Standards_VC = @Installed_To_Standards

WHERE  (Certificate_Return_ID = @Certificate_Number)





END

以下に完全なエラーを貼り付けました。最初の行は、ストアド プロシージャに渡される値であり、すべて存在することを確認するために文字列として表示されます。

telid: 61529 certNumber: 1262789 custTel: 01423 734002 instRef: /3548 commDate: 2012-05-05 00:00:00 standards: PD 6662 and DD 243
Warning: mssql_bind() expects parameter 4 to be long, string given in /home/ssaibuk/public_html/common/modules/supplier/certificates-direct.php on line 111

Warning: mssql_execute() [function.mssql-execute]: message: Procedure or function 'usp_Update_Certificate_Customer_Details' expects parameter '@Commisioned_Date', which was not supplied. (severity 16) in /home/ssaibuk/public_html/common/modules/supplier/certificates-direct.php on line 116

Warning: mssql_execute() [function.mssql-execute]: General SQL Server error: Check messages from the SQL Server (severity 16) in /home/ssaibuk/public_html/common/modules/supplier/certificates-direct.php on line 116

Warning: mssql_execute() [function.mssql-execute]: stored procedure execution failed in /home/ssaibuk/public_html/common/modules/supplier/certificates-direct.php on line 116
4

3 に答える 3

1

信じられないかもしれませんが、DATETIME フィールドを VARCHAR に設定してから、日時形式 'Ymd H:i:s' を渡すのが正しい方法です。また、大文字と小文字が区別されるため、それを渡すときにその後のフィールド( @Installed_To_Standards )に大文字の「T」があることを確認する必要があります。

于 2012-08-02T09:32:38.407 に答える
0

で 12 時間形式を使用していhます。H24 時間形式が必要です。あなただけの問題ではないかもしれません。しかし、それはそれらの1つです。

$commDate = date('Y-m-d H:i:s');

根本的な問題はSQLFLT8、日付パラメーター タイプとして使用していると思います。データを反映する必要がありdatetimeます。

于 2012-07-26T13:59:43.773 に答える
0

SQL Server で日付オブジェクトを扱うのは嫌いです。これを回避するために私が行ったことは、ストアド プロシージャに日付を入力するたびに 2 つのパラメーターを設定することです。

基本的に、1 つは VARCHAR (19) で、単なる日付文字列です。もう 1 つは、デフォルトで NULL に設定されている実際の DATETIME オブジェクトです。

DATETIME オブジェクトが NULL であることを確認するチェックがあります。そうであれば、VARCHAR (19) パラメータを DATETIME オブジェクトに変換します。

これは、PHP タイムスタンプを VARCHAR (19) パラメータのフォーマットされた文字列に変換するために使用するものです。date("Y-m-d H:i:s",$timestamp);

これは、ストアド プロシージャで VARCHAR (19) を DATETIME に変換する方法です。SET @dateObject = CONVERT(VARCHAR(19),@dateString,120)

サンプルのストアド プロシージャを次に示します。

CREATE PROCEDURE [dbo].[WorkingWithDateObjects] 
-- Add the parameters for the stored procedure here

@dateString [varchar] (19) = null, -- ex: '2009-07-01 00:00:00.000'
@dateObject [datetime] = null -- computed in sp from @dateString

AS

BEGIN
SET NOCOUNT ON;
SET @dateObject = CONVERT(VARCHAR(19),@dateString,120)

    SELECT *

    FROM SomeTable

    WHERE DateField >= @dateObject

  END
于 2012-07-26T13:56:35.503 に答える