1

I am trying to run an mssql stored procedure which passes in some user entered data. I run the stored procedure directly and it works fine but when I try to run it using the attached code I get no error and nothing updates. I think it is something to do with the date being passed in. The date field in the database is defined as 'datetime'. It might be something else but other stored procedures run the same way on this system are working fine.

//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); 

When I run as above with the field set as 'SQLDATETIME' I get a php warning

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

IF I run it with the field set as 'SQLVARCHAR' I get no error but no update in the database occurs

I have pasted in the stored procedure that is run below:

    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

I have pasted the full error in below, the first line is the values that are getting passed into the stored procedure just displayed as a string to check they are all there.

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
Zhorov
  • 28,486
  • 6
  • 27
  • 52
Steve Smith
  • 734
  • 6
  • 14
  • 29

3 Answers3

1

Believe it or not, setting the DATETIME field to VARCHAR then passing in a datetime format 'Y-m-d H:i:s' is the correct way to do it. You also just have to make sure the field after it ( @Installed_To_Standards) has a capital "T" when you pass it through as it's case sensitive.

Steve Smith
  • 734
  • 6
  • 14
  • 29
0

I hate dealing with date objects in SQL Server. What I have done to work around this is to have 2 params for each date input in the stored procedure.

Basically, one is a VARCHAR (19), just a date string. The other is a real DATETIME object that is set to NULL by default.

I have a check to see the the DATETIME object is NULL; if it is, I convert the VARCHAR (19) param to a DATETIME object.

This is what I use to convert a PHP timestamp to a formatted string for the VARCHAR (19) param:date("Y-m-d H:i:s",$timestamp);

This is how to convert a VARCHAR (19) to a DATETIME in the stored procedure: SET @dateObject = CONVERT(VARCHAR(19),@dateString,120)

Here is a sample Stored Procedure:

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
Teddy
  • 18,357
  • 2
  • 30
  • 42
  • ok, I don't ahve access to modify the stored procedure, I just have the stored procedure defined as that and have to pass in the required information – Steve Smith Jul 26 '12 at 14:12
0

You are using 12-hour format with h. You need H for 24 hour format. Might not be your only problem. But it's one of them.

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

I believe the root problem is using SQLFLT8 as the date params type. It should reflect datetime data.

Jason McCreary
  • 71,546
  • 23
  • 135
  • 174