MSSQL PHP Ошибка: неверное значение точности hy104 - PullRequest
1 голос
/ 02 августа 2011

Пытались отлаживать это часами и безрезультатно.Пожалуйста помоги.Среда: PHP5.3 общается с MSSQL2005 / 8 с помощью Microsoft MSSQL Driver для PHP SQL Query:

INSERT INTO [dbo].[Enquiry] ([FullName], [FirstName],  [Surname], [ContactPhone], 
[WorkPhone], [ContactMobile], [EmailAddress],  [Callwhen], [LoanType],  [EnquiryDate],      
[Suburb], [State],  [PostCode], [HiddenField], [CFIssue01], [CFIssue02], [CFIssue03], 
[CFIssue04], [ProductID]) VALUES ('asdf asdf','asdf','asdf','03 12312312','02 12312312',
'','','10:12 AM 02/08/11','CF','2011-08-02 10:12:45',
'asdf','NSW','1231','245678','asdfasdf1222','','','','CF')

Если я запускаю этот запрос с sqlsrv_query(), и он работает хорошо.

Чтобы предотвратить SQL-инъекцию, я предпочитаю использовать подготовленные операторы sqlsrv_prepare() и sqlsrv_execute().

. Для создания подготовленного оператора у меня есть:

INSERT INTO [dbo].[Enquiry] ([FullName], [FirstName], [Surname], [ContactPhone],     
[WorkPhone], [ContactMobile], [EmailAddress], [Callwhen], [LoanType], [EnquiryDate], 
[Suburb], [State], [PostCode], [HiddenField], [CFIssue01], [CFIssue02], [CFIssue03], 
[CFIssue04], [ProductID]) VALUES "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,)"

Тогда яесть параметры:

$params = array( &$mm_fullname, &$mm_firstname,  &$mm_surname,  &$mm_contactphone, 
&$mm_workphone,  &$mm_contactmobile,  &$mm_emailaddress,  &$mm_callwhen,  &$mm_loantype,    
&$mm_enquirydate,  &$mm_suburb,  &$mm_state, &$mm_postcode,  &$mm_hiddenfield,  
&$mm_cfissue01,  &$mm_cfissue02,  &$mm_cfissue03, &$mm_cfissue04, &$mm_productid );

Затем подготовьте оператор:

$stmt = sqlsrv_prepare( $conn, $tsql, $params))

Затем выполните оператор: sqlsrv_execute( $stmt) ......... ban!ошибка здесь:

[0] => HY104
[SQLSTATE] => HY104
[1] => 0
[code] => 0
[2] => [Microsoft][SQL Server Native Client 10.0]Invalid precision value
[message] => [Microsoft][SQL Server Native Client 10.0]Invalid precision value

Не уверен, что я делаю неправильно ..

Обновление № 1: преобразовать все параметры в строку - та же ошибка:

/* Assign parameter values. */
                $mm_fullname = strval($firstname . " " . $lastname);
                $mm_firstname = strval($firstname);
                $mm_surname = strval($lastname);
                $mm_contactphone = strval($homenumber);
                $mm_workphone = strval($worknumber);
                $mm_contactmobile = strval($mobilenumber);
                $mm_emailaddress = strval($email);
                $mm_callwhen = strval(date('h:i A d/m/y'));
                $mm_loantype = strval("CF");
                $mm_enquirydate = strval(date('Y-m-d H:i:s'));
                $mm_suburb = strval($suburb);
                $mm_state = strval($state);
                $mm_postcode = strval($postcode);
                $mm_hiddenfield = strval("245678");
                $mm_cfissue01 = strval($creditissue1);
                $mm_cfissue02 = strval($creditissue2);
                $mm_cfissue03 = strval($creditissue3);
                $mm_cfissue04 = strval($creditissue4);
                $mm_productid = strval("CF");

                $params = array( &$mm_fullname, 
                                 &$mm_firstname, 
                                 &$mm_surname, 
                                 &$mm_contactphone,
                                 &$mm_workphone, 
                                 &$mm_contactmobile, 
                                 &$mm_emailaddress, 
                                 &$mm_callwhen, 
                                 &$mm_loantype, 
                                 &$mm_enquirydate, 
                                 &$mm_suburb, 
                                 &$mm_state, 
                                 &$mm_postcode, 
                                 &$mm_hiddenfield, 
                                 &$mm_cfissue01, 
                                 &$mm_cfissue02, 
                                 &$mm_cfissue03, 
                                 &$mm_cfissue04, 
                                 &$mm_productid );

1 Ответ

2 голосов
/ 02 августа 2011

OK.Спасибо Виккену.Ваши комментарии сработали!

С этой страницы я нашел, как определить SQLSRV_SQLTYPE_ * для каждого параметра.

Теперь я обновил свой код:

$params = array(
    array(&$mm_fullname, null, null, SQLSRV_SQLTYPE_VARCHAR(200)),
    array(&$mm_firstname, null, null, SQLSRV_SQLTYPE_VARCHAR(100)),
    array(&$mm_surname, null, null, SQLSRV_SQLTYPE_VARCHAR(100)),
    array(&$mm_contactphone, null, null, SQLSRV_SQLTYPE_VARCHAR(50)),
    array(&$mm_workphone, null, null, SQLSRV_SQLTYPE_VARCHAR(50)),
    array(&$mm_contactmobile, null, null, SQLSRV_SQLTYPE_VARCHAR(50)),
    array(&$mm_emailaddress, null, null, SQLSRV_SQLTYPE_VARCHAR(150)),
    array(&$mm_callwhen, null, null, SQLSRV_SQLTYPE_VARCHAR(50)),
    array(&$mm_loantype, null, null, SQLSRV_SQLTYPE_VARCHAR(50)),
    array(&$mm_enquirydate, null, null, SQLSRV_SQLTYPE_DATETIME),
    array(&$mm_suburb, null, null, SQLSRV_SQLTYPE_VARCHAR(100)),
    array(&$mm_state, null, null, SQLSRV_SQLTYPE_VARCHAR(50)),
    array(&$mm_postcode, null, null, SQLSRV_SQLTYPE_VARCHAR(20)),
    array(&$mm_hiddenfield, null, null, SQLSRV_SQLTYPE_VARCHAR(2000)),
    array(&$mm_cfissue01, null, null, SQLSRV_SQLTYPE_VARCHAR(2000)),
    array(&$mm_cfissue02, null, null, SQLSRV_SQLTYPE_VARCHAR(2000)),
    array(&$mm_cfissue03, null, null, SQLSRV_SQLTYPE_VARCHAR(2000)),
    array(&$mm_cfissue04, null, null, SQLSRV_SQLTYPE_VARCHAR(2000)),
    array(&$mm_productid, null, null, SQLSRV_SQLTYPE_VARCHAR(50))
);

Отлично работает без ошибок!

...