Imam jedan prilicno cudan problem vezan za prozivanje mssql procedura.
Sve procedure proziva preko jedne funkcije , ona prima ime procedure i parametre, u obliku niza.
Primjer poziva jedne jednostavnije procedure je:
Code:
$parametri = array();
$parametri['FieldLista|SQLVARCHAR'] = " ID,Ime,Prezime ";
$parametri['FilterLista|SQLVARCHAR'] = " 1 = 1 ";
call_proc("_Get_korisnici_PHP",$parametri);
$parametri = array();
$parametri['FieldLista|SQLVARCHAR'] = " ID,Ime,Prezime ";
$parametri['FilterLista|SQLVARCHAR'] = " 1 = 1 ";
call_proc("_Get_korisnici_PHP",$parametri);
znaci procedura koju prozivam zove se "_Get_korisnici_PHP", prima dva parametra
FieldLista (SQLVARCHAR) (dodijelim vrijednost *)
i FieldLista (SQLVARCHAR) (dodijelim vrijednost 1 = 1)
sama procedura sluzi kao selekt iz jedne tabele, i izgleda ovako (nije ni bitna, ali eto)
Code:
CREATE PROCEDURE [dbo].[_Get_korisnici_PHP]
@FieldLista varchar(255),@FilterLista varchar(255)
AS SET NOCOUNT ON EXEC ('SELECT ' + @FieldLista + ' FROM dbo.PHP_Korisnici WHERE ' + @FilterLista + '')
CREATE PROCEDURE [dbo].[_Get_korisnici_PHP]
@FieldLista varchar(255),@FilterLista varchar(255)
AS SET NOCOUNT ON EXEC ('SELECT ' + @FieldLista + ' FROM dbo.PHP_Korisnici WHERE ' + @FilterLista + '')
eh sada func...
Code:
function call_proc($procname,$parametri)
{
if(!isset($this->c)) $this->connect();
$stmt=mssql_init($procname, $this->c);
foreach ($parametri as $key => $value)
{
//cisto da vidim jel dobro parsira parametre
echo $key." => ".$value."<br>";
//razdvojim tip i naziv varijable
$parametar = explode("|", $key);
if($parametar[1] == "SQLVARCHAR")
mssql_bind($stmt, "@".$parametar[0], $value, SQLVARCHAR, FALSE);
if($parametar[1] == "SQLINT4")
mssql_bind($stmt, "@".$parametar[0], $value, SQLINT4, FALSE);
if($parametar[1] == "SQLTEXT")
mssql_bind($stmt, "@".$parametar[0], $value, SQLTEXT, FALSE);
}
$result = mssql_execute($stmt);
....
function call_proc($procname,$parametri)
{
if(!isset($this->c)) $this->connect();
$stmt=mssql_init($procname, $this->c);
foreach ($parametri as $key => $value)
{
//cisto da vidim jel dobro parsira parametre
echo $key." => ".$value."<br>";
//razdvojim tip i naziv varijable
$parametar = explode("|", $key);
if($parametar[1] == "SQLVARCHAR")
mssql_bind($stmt, "@".$parametar[0], $value, SQLVARCHAR, FALSE);
if($parametar[1] == "SQLINT4")
mssql_bind($stmt, "@".$parametar[0], $value, SQLINT4, FALSE);
if($parametar[1] == "SQLTEXT")
mssql_bind($stmt, "@".$parametar[0], $value, SQLTEXT, FALSE);
}
$result = mssql_execute($stmt);
....
Procedura se ne izvrsi, padne uz error Warning: mssql_execute(): message: Invalid column name '?Uf?'. (severity 16)
A u sql profileru vidim
exec _Get_korisnici_PHP @FieldLista = 'üUf· ', @FilterLista = ' 1 = 1 '
Ako probam da rucno bind parametara uradim, tj ovako
$val1=" ID,Ime,Prezime ";
mssql_bind($stmt, "@FieldLista", $val1, SQLVARCHAR, FALSE);
$val2=" 1 = 1 ";
mssql_bind($stmt, "@FilterLista", $val2, SQLVARCHAR, FALSE);
Onda se procedura regularno izvrsi. Ovaj problem imam samo kada se PHP vrti na Linuxu, dok na windows serveru radi bez problema.
Ideje?
FreeTds
[MSSERVER]
host = xxxxxxxxxxxxxxx
port = 1433
tds version = 7.0
SQL server je 2000, ovo mi se desavalo i na 2005