[PHP / ODBC] Output uit Stored Procedure krijgen

Pagina: 1
Acties:
  • 109 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig een webapplicatie te ontwikkelen die door middel van odbc communiceert met een MS SQL 2000 database.Hierin staan een aantal Stored Procedures die ik aan wil roepen via PHP. Dit is allemaal geen probleem, wat niet lukt is wanneer ik een SP aanroep die een waarde output, deze weer te gebruiken in php.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Stukje van Stored procedure
CREATE PROCEDURE [Bepaal_Ordernummer_Code]
    (@Input1    Char(2),
     @Input2    Int,
     @Output1   varchar(10) Output
    )
.........


//PHP code aanroepen van Storeprocedure
$sql = "{ CALL Bepaal_Ordernummer_Code('".$input1."', '".$input2."', '".$output1."') }"; 
// 1e parameter zijn input, laatste is de output parameter.
        
$result = odbc_exec($connectDB->sqlconnect, $sql);

 while(odbc_fetch_row($result))
  {
    $returnvalue = odbc_result($result, 1);
    echo ' $returnvalue;
 }


Nu krijg ik constant na het aanroepen van odbc_fetch_row, de melding:
code:
1
2
[Warning: odbc_fetch_row() [function.odbc-fetch-row]: 
No tuples available at this result index in C:\Inetpub\wwwroot\........


Ook wanneer het probeer op te lossen met fetch_array of odbc_result_all, krijg ik deze warning.
Ik kan op Got & Google geen oplossing hiervoor vinden. Wanneer ik odbc_num_rows doe krijg ik wel de waarde 1 terug, dus ik krijg blijkbaar wel iets terug. 8)7

[ Voor 40% gewijzigd door Verwijderd op 08-06-2006 16:27 ]


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Geen antwoord op je vraag, maar waarom maak je gebruik van odbc i.p.v. de mssql_ functies ?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Klopt het dat je gewoon 1 waarde terug hoort te krijgen? Dan kun je die hele while loop weglaten en gewoon direct odbc_result gebruiken. Die combinatie lijkt me overigens sowieso vreemd.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik heb zelf nog niet gewerkt met php icm procedures op mssql, maar ik vermoed dat het komt omdat je je parameters 'byref' meegeeft en vervolgens verwacht dat php of odbc zelf uit kan vogelen dat je je 3e parameter terug zou willen hebben. Dat is natuurlijk redelijk onmogelijk.

Waarschijnlijk is het handiger om niet een procedure, maar een function te maken die de waarde terug geeft. Deze kun je vast wel als result fetchen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op vrijdag 09 juni 2006 @ 08:34:
Klopt het dat je gewoon 1 waarde terug hoort te krijgen? Dan kun je die hele while loop weglaten en gewoon direct odbc_result gebruiken. Die combinatie lijkt me overigens sowieso vreemd.
Ja dat klopt inderdaad dat de hele while loop weggelaten kan worden, maar ik had deze in eerste instantie geschreven om vanuit een andere stored procedure meedere waarden te krijgen.
Wanneer ik deze direct odbc_result($result, 1); gebruik, krijg ik nog steeds dezelfde melding "No tuples available at this result index in "

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
TheRookie schreef op vrijdag 09 juni 2006 @ 08:10:
Geen antwoord op je vraag, maar waarom maak je gebruik van odbc i.p.v. de mssql_ functies ?
Hiervoor is enige tijd geleden voor gekozen, de sql server is namelijk redelijk dicht getimmerd en alleen via odbc te communiceren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op vrijdag 09 juni 2006 @ 09:44:
Ik heb zelf nog niet gewerkt met php icm procedures op mssql, maar ik vermoed dat het komt omdat je je parameters 'byref' meegeeft en vervolgens verwacht dat php of odbc zelf uit kan vogelen dat je je 3e parameter terug zou willen hebben. Dat is natuurlijk redelijk onmogelijk.

Waarschijnlijk is het handiger om niet een procedure, maar een function te maken die de waarde terug geeft. Deze kun je vast wel als result fetchen.
Ik maak een webapplicatie om een bestaande sql server heen waar een windows softwarepakket op draait en heb daarom geen mogelijkheid om aanpassingen binnen sql zoals nieuwe functies te schrijven. Een oplossing zoeken voor dit probleem, is in dit geval sneller dan de applicatie bouwer nieuwe sql functies voor alle stored procedures te laten schrijven.

Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Probeer het eens op onderstaande manier
code:
1
2
3
4
5
6
7
8
DECLARE @MyVariable varchar (10)

EXEC [Bepaal_Ordernummer_Code]
    @Input1 = 'AA',
    @Input2 = 1,
    @Output1 = @MyVariable OUTPUT

SELECT @MyVariable AS Result

Hierdoor krijg je een resultset met een record die je op de normale manier uit kunt lezen.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik denk dat het voorstel van cameodski de enigste oplossing is. Het probleem is dat de stored procedures geen resultsets returnen. Er valt dus helemaal niks uit te lezen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
cameodski schreef op woensdag 14 juni 2006 @ 10:12:
Probeer het eens op onderstaande manier
code:
1
2
3
4
5
6
7
8
DECLARE @MyVariable varchar (10)

EXEC [Bepaal_Ordernummer_Code]
    @Input1 = 'AA',
    @Input2 = 1,
    @Output1 = @MyVariable OUTPUT

SELECT @MyVariable AS Result

Hierdoor krijg je een resultset met een record die je op de normale manier uit kunt lezen.
Ik was zelf momenteel ook bezig op dezelfde manier, via de SQL Query analyzer krijg ik netjes een waarde terug vanuit sql, maar niet wanneer ik het vervolgens vanuit mijn script uitvoer.
code:
1
2
3
4
5
6
7
8
9
10
$sql  = "BEGIN ";
$sql .= "  declare @Soort char (2) ";
$sql .= "  declare @Ordernummer varchar (10) ";
$sql .= "  Set @Soort = '".$Soort."' ";     
$sql .= "  execute Bepaal_Ordernummer @Soort, @Ordernummer output ";
$sql .= "  SELECT @Ordernummer as Ordernummer ";
$sql .= "END ";

$result = odbc_exec($connectDB->sqlconnect, $sql);
echo odbc_result($result,"Ordernummer");

Warning: odbc_result() [function.odbc-result]: No tuples available at this result index in......... :(

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Probeer ook eens de foutmelding van de query zelf te achterhalen ipv enkel de foutmelding van het fetchen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik denk dat je de output parameter niet goed meegeeft. Kijk anders nog eens naar mijn voorbeeldje.

[ Voor 19% gewijzigd door cameodski op 14-06-2006 11:33 ]

Never underestimate the power of


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op woensdag 14 juni 2006 @ 11:13:
Probeer ook eens de foutmelding van de query zelf te achterhalen ipv enkel de foutmelding van het fetchen.
Ehm hoe bedoel je precies? De query zelf geeft geen foutmelding, wanneer ik deze handmatig uitvoer in SQL Query analyser.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
cameodski schreef op woensdag 14 juni 2006 @ 11:33:
Ik denk dat je de output parameter niet goed meegeeft. Kijk anders nog eens naar mijn voorbeeldje.
Ik heb het nu op dezelfde manier gedaan zoals je hebt aangegeven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
$sql  = "BEGIN ";
$sql .= "  declare @Soort char (2) ";
$sql .= "  declare @Ordernummer varchar (10) ";
$sql .= "  declare @MyVariable varchar (10) ";
$sql .= "  Set @Soort = '".$Soort."' ";     
$sql .= "  execute Bepaal_Ordernummer @Soort, @Ordernummer = @MyVariable OUTPUT  ";
$sql .= "  SELECT @MyVariable AS Result  ";
$sql .= "END ";
        
echo $sql;
$result = odbc_exec($connectDB->sqlconnect, $sql);
odbc_result_all($result);


Maar helaas........weer gezeur over No tuples.......

Wanneer ik het volgende toevoeg:
code:
1
 echo odbc_num_rows($result);
krijg ik de waarde 1 terug, dus er staat een waarde in het resultaat van de query.

[ Voor 17% gewijzigd door Verwijderd op 14-06-2006 12:21 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op woensdag 14 juni 2006 @ 12:10:
[...]


Ehm hoe bedoel je precies? De query zelf geeft geen foutmelding, wanneer ik deze handmatig uitvoer in SQL Query analyser.
precies zoals ook in onze faq beschreven staat bij mysql verbindingen. Je controleert nergens of je query in php uberhaupt wel goed gaan. Waarschijnlijk heeft php wel 1 of andere odbc_error_msg achtige functie.

-na edit hierboven
Als odbc_num_rows wel een juist resultaat opleverd dan heb je iig uitgesloten dat de query mislukt is. Probeer het resultaat eens te fetchen middels odbc_fetch_row?

[ Voor 18% gewijzigd door Janoz op 14-06-2006 12:24 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Fetchen door middel van odbc_fetch_row daar was ik in 1e instantie mee begonnen, totdat ik de foutmelding kreeg. Uitvoeren van de code:
code:
1
2
3
4
$row = odbc_fetch_row($result);
echo $row->Result;

Warning: odbc_fetch_row() [function.odbc-fetch-row]: No tuples available at this result index in
geeft nog steeds dezelfde melding, redelijk frustrerend is het inmiddels

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Heb je al geprobeerd om die foutmelding eens door google heen te gooien? Ikzelf kom dan enkele dingen tegen van bugs in php tot special gebruik van de sql. In de source van php is te zien dat deze foutmelding optreed wanneer er geen kolommen in de resultset zitten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op woensdag 14 juni 2006 @ 13:02:
Heb je al geprobeerd om die foutmelding eens door google heen te gooien? Ikzelf kom dan enkele dingen tegen van bugs in php tot special gebruik van de sql. In de source van php is te zien dat deze foutmelding optreed wanneer er geen kolommen in de resultset zitten.
Het enige wat ik de afgelopen tijd ben tegen gekomen is het toevoegen van SQL_CUR_USE_ODBC in de odbc_connect string. Maar ook dit maakt niks uit.
code:
1
odbc_connect( $connection_dsn, '*****', '*****', 'SQL_CUR_USE_ODBC' );


Is er niet iemand die een zelfde oplossing wel draaiende heeft en eventueel een voorbeeld kan geven?
Pagina: 1