Мне нужно портировать проект на основе LAMP, который использует PHP-MSSQL для подключения к базе данных SQL Server. Он должен быть перенесен на компьютер на основе WAMP, который использует PHP-SQLSRV для подключения к базе данных SQL Server.
Я могу получить / установить данные, выполнив хранимые процедуры. Кажется, что большинство типов входных переменных довольно просто начать работать. Но я не могу заставить работать входные параметры типа bit
.
Я пытался использовать различные значения в PHP, которые являются «правдивыми» или «ложными», но ни одно из них не поможет мне избежать ошибки:
«правдивые» вещи, которые не работали:
«ложные» вещи, которые не работали:
Я пытался использовать различные способы добавления элемента в массив $params
, в том числе опуская необязательные аргументы, а также определяя типы данных PHP и SQL. Ничего не работает.
Мое сообщение об ошибке от SQL Server (преобразованное в объект JSON):
[{
"0":"42000",
"SQLSTATE":"42000",
"1":8114,
"code":8114,
"2":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit.",
"message":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit."
}]
Чтобы сгенерировать это сообщение об ошибке, я передал значение 0
или 1
, ни одно из которых не является varchar
или даже строкой.
Для обеспечения максимальной совместимости я не хочу изменять хранимую процедуру для преобразования / преобразования данных на SQL Server. Я хочу, чтобы это работало из PHP, сохраняя хранимую процедуру без изменений.
PHP код:
<?php
$link = sqlsrv_connect($host,Array("Database"=>$database,"UID"=>$username,"PWD"=>$password));
$sql = " { call StoredProcedureName ( @input_param_of_bit_type=? ) } ";
$param1 = 1;
$params = Array(
Array(&$param1, SQLSRV_PARAM_IN)
);
$stmt = sqlsrv_prepare($link,$sql,$params);
if ($stmt===false) {
// handle error
print_r(sqlsrv_errors,true);
} else {
if (sqlsrv_execute($stmt)===false) {
// handle error. This is where the error happens
print_r(sqlsrv_errors,true);
} else {
// success! It never gets here, though.
}
}
?>