ユーザーが入力したデータを渡す 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