Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

Verbinden met database op andere server

Pagina: 1
Acties:
  • 1.572 views

  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
Hallo,

Ik wil een verbinding maken vanaf mijn site naar een sqlbase database van m'n werk. Er moet connectie worden gemaakt met een dsn via odbc.

Dit is hoe ik nu een verbinding maak op lokale pc d.m.v. php met een odbc connectie.
PHP:
1
2
3
4
5
$odbc=odbc_connect('dsn','user','pass');
    if (!$odbc)
    {
    exit("Connection Failed: " . $odbc);
    }


Hoe kan ik verbinding maken met een database d.m.v. dsn? Moet er een ipadres voor? Dus zoiets als dit?
PHP:
1
2
3
4
5
$odbc=odbc_connect('http://192.168.1.50/dsn','user','pass');
    if (!$odbc)
    {
    exit("Connection Failed: " . $odbc);
    }


Hoe kan ik het volgende het beste doen?

Ik neem aan dat ik poort 2155tcp moet openen (dit is de poort van de sqlbase database) in de firewall van de server van m'n werk en ook de poort van de website op de host? Of alleen de poort van m'n werk?

Ik hoop dat iemand me kan helpen.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Je kan een dsn aanmaken en die laten verbinden met de sqlbase op je werk. Weet je hoe je een ODBC dsn aanmaakt onder Windows?

ODBC verbindt vervolgens via de normale weg met de sqlbase database. Wat normaal is, is afhankelijk van sqlbase. Firewall poorten moeten daarvoor opengezet worden.

Enig zoekwerk onder odbc connect op de php site leverde dit op:
http://www.connectionstrings.com/

  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
Bedankt voor je reactie.

Ik weet hoe ik een dsn kan aanmaken. Het werkt nu ook allemaal op een testmachine (webserver en sqlbase op zelfde pc). Dus de connectie maken opzich is geen probleem.

Hoe moet ik dit uitleggen: Als ik op host a zit met een webserver en de webserver moet de sqlbase op host b bereiken. Dan moet hij behalve een dsn toch ook iets met een ipadres doen? anders weet hij toch niet op welke pc hij moet gaan kijken voor die dsn? Of kan ik dit aangeven bij het aanmaken van een dsn?

Hoop dat dit een beetje duidelijk is

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Een ODBC DSN moet op de lokale host (a dus) zijn gedefinieerd.
Die ODBC op a mag natuurlijk prima verwijzen naar een andere server (b dus)!

Als je de ODBC DSN echt op een andere server wilt definiëren zul je een middleware-oplossing als IDS Server moeten gebruiken (al weet ik niet of die ook onder PHP ondersteunt wordt).

Het is bij mijn weten niet mogelijk om direct (zonder middleware) een DSN op een andere host te benaderen, en dat is eigenlijk ook niet nodig.

[ Voor 10% gewijzigd door Remus op 23-07-2008 15:46 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:12

Robtimus

me Robtimus no like you

damen18 schreef op woensdag 23 juli 2008 @ 15:37:
Hoe moet ik dit uitleggen: Als ik op host a zit met een webserver en de webserver moet de sqlbase op host b bereiken. Dan moet hij behalve een dsn toch ook iets met een ipadres doen? anders weet hij toch niet op welke pc hij moet gaan kijken voor die dsn? Of kan ik dit aangeven bij het aanmaken van een dsn?
Zoals Remus ook al zei, de DSN weet met welke server hij een verbinding moet maken. Zie het als een shortcut naar de server toe.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
ok....dus als ik de database niet normaal kan benaderen met een dsn vanaf host a naar host b dan heb ik dus een probleem?

Het gaat namelijk hierom: ik ben bezig om een site te maken zodat klanten producten kunnen bestellen. Maar ze hebben dus al een site op host a en ze willen actuele gegevens van host b (server van het bedrijf met de sqlbase database) Lokaal heb ik alles al werkend maar ik wil dus dat het gaat werken tussen host a en host b.

ik zie 3 oplossingen waarvan de 2e (voorlopig) niet mogelijk is:
1. Dat wat Remi zei met een middleware oplossing (wat dus waarschijnlijk niet met php werkt, dus ook eigenlijk geen oplossing)
2. Een webserver installeren op de server van het bedrijf. De reden waarom dit momenteel niet mogelijk is omdat het de server op het moment niet heel veel capaciteit meer heeft, maar er komt een nieuwe server aan.
3. Of kan ik een dsn-less connectie maken?

Weten jullie nog wat anders? Om eerlijk te zijn zag ik dit van te voren niet aankomen omdat ik dacht dat je probleemloos verbinding kon maken.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:12

Robtimus

me Robtimus no like you

Als de database server geen externe verbindingen aankan dan heb je inderdaad een probleem.

Stap 1 is contact opnemen met je sysadmins om te kijken of er een verbinding tussen de web server en database server mogelijk is. Je hebt het alleen steeds over "mijn site"; als dat een prive site is zou ik hier niet op rekenen, tenzij je sysadmins totaal incompetent zijn. Ik ken weinig bedrijven die hun productie servers zouden inzetten voor de prive site van een werknemer.

Als stap 1 niet lukt dan gaat een web server op die database server installeren waarschijnlijk ook niet lukken.


Wat ik zou proberen, in combinatie met je sysadmins, is het volgende:
Creeer op jullie eigen web server een web service die de database interactie afhandelt. Die site roept dan die web service aan, en gebruikt de resultaten. Onderzoek SOAP en/of AJAX eens gronding in dat geval.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
damen18 schreef op woensdag 23 juli 2008 @ 16:26:
...
3. Of kan ik een dsn-less connectie maken?
...
Als ik de voorbeelden mag geloven op php.net, dan kun je dsn-less connecties formuleren met odbc_connect. Dus een "gewone" connection string, zie daarvoor de link in mijn eerdere reactie.

Probeer eerst eens een dsn-loze verbinding te maken tussen jouw lokale server en de externe database. Als dat kan, dan zou het in feite ook op de webserver moeten kunnen.

  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
Bedankt voor het meedenken..

het is mijn site omdat ik hem gebouwd heb, maar er kunnen producten besteld worden dus dat is voor het bedrijf. Maar die wordt dus ergens anders gehost en niet op hun server. De poort staat iig al open. Maar dat wordt nog redelijk lastig dan......


Als je een dsn-less connection wil maken dan moet je ook een driver aangeven? Kan iemand daar een voorbeeld voor geven voor Gupta SQLBase die ik met php kan gebruiken?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:37

Janoz

Moderator Devschuur®

!litemod

Zorg je wel dat je heel goed weet waar je mee bezig bent voordat je de database op server b publiekelijk beschikbaar maakt?

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


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
damen18 schreef op donderdag 24 juli 2008 @ 11:59:
Bedankt voor het meedenken..

het is mijn site omdat ik hem gebouwd heb, maar er kunnen producten besteld worden dus dat is voor het bedrijf. Maar die wordt dus ergens anders gehost en niet op hun server. De poort staat iig al open. Maar dat wordt nog redelijk lastig dan......


Als je een dsn-less connection wil maken dan moet je ook een driver aangeven? Kan iemand daar een voorbeeld voor geven voor Gupta SQLBase die ik met php kan gebruiken?
Ik denk graag mee, maar dan verwacht ik wel dat er ook iets met mijn moeite gedaan wordt. Ik heb nu al 2x de link aangegeven van http://www.connectionstrings.com/. Deze site heeft zijn voorbeelden ingedeeld naar database soort. sqlbase staat daar ook bij.

  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
bigbeng schreef op donderdag 24 juli 2008 @ 12:13:
[...]

Ik denk graag mee, maar dan verwacht ik wel dat er ook iets met mijn moeite gedaan wordt. Ik heb nu al 2x de link aangegeven van http://www.connectionstrings.com/. Deze site heeft zijn voorbeelden ingedeeld naar database soort. sqlbase staat daar ook bij.
mijn fout, ik heb niet aangegeven dat ik dus geen OLE DB gebruik. Ik gebruik de driver van SQLBase zelf en dat is geen OLE DB. Ik zag net dat php ook met OLE DB werkt. klopt dat?

Dus ik zal ff op onderzoek uit moeten gaan hoe het met OLE DB gaat.

[ Voor 6% gewijzigd door damen18 op 24-07-2008 12:38 ]


  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
Ik zie nu trouwens dat de SQLBASEOLEDB.dll op mn computer staat. Dus die driver heb ik. Heeft iemand enig idee hoe dat nu verder? Moet ik die dan toevoegen bij: "configuratiescherm", "Systeem", "systeembeheer", "Gegevens bronnen (ODBC) ?

Er staat er namelijk al 1 maar dat is de odbc driver.

[ Voor 17% gewijzigd door damen18 op 24-07-2008 12:56 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
De OLEDB driver connection string kun je gewoon van connectionstrings afplukken. Als het goed is kun je alle gegevens die in de connection string aanpassen naar je eigen waardes, omdat je die ook al bij het maken van een DSN hebt opgegeven. Probeer het gewoon eens uit.

[ Voor 3% gewijzigd door bigbeng op 24-07-2008 14:53 ]


  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
ok, dus als ik dit:

PHP:
1
Provider=SQLBaseOLEDB;Data source=myServerAddress;Location=myDataBase;User Id=myUsername;Password=myPassword;


Heeft hij dan gelijk al verbinding?

of moet het zoiets zijn als dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$HOST = "server";
$USER = "user";
$PASS = "pwd";
$DB = "database";

$dsn = "Provider=SQLOLEDB;Data Source=$HOST;User
Id=$USER;Password=$PASS;Initial Catalog=$DB";
$charPage = CP_UTF8;

$db = new COM("ADODB.Connection", NULL, $charPage);
$db->Open($dsn);


Zit ik zo in de goede richting?

[ Voor 3% gewijzigd door damen18 op 24-07-2008 22:56 ]


  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
zo...hier ben ik weer en ik heb niet stil gezeten. Inmiddels heb ik verbinding kunnen maken d.m.v. OLEDB.

PHP:
1
2
3
4
<?php 
$conn = new COM("ADODB.Connection") or die("Cannot start ADO");

//$conn->Open("Provider=SQLBaseOLEDB; Data Source=MVL00003;User ID=test; Password=test");


Maar nu lukt het me niet om een verbinding te krijgen met een externe database (die dus niet op mijn pc staat)

Dit is wat ik nu heb om een externe verbinding te maken. Hij zoekt nog steeds verbinding met de lokale database maar geeft verder geen fouten meer.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

error_reporting(E_ALL);
$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
    
    $conn->Open("Provider=SQLBASEOLEDB.1;Server=192.168.11.3; Password=test;Persist Security Info=False;User ID=test;Data Source=MVL00003");

    $recordSet = $conn->Execute("select CDARTIKEL, VVHOOFDGROEP, VVSUBGROEPA, OMSCHR, EENHEID, OPWEB 
from SYSADM.ARTIKEL ARTIKEL 
where (OMSCHR Like '%RVS%') AND (VVHOOFDGROEP Like 'RVS') AND (VVSUBGROEPA Like 'Rond') AND VVOPWEB = 'Ja'
GROUP BY OMSCHR, CDARTIKEL, VVOPWEB, VVHOOFDGROEP, VVSUBGROEPA, EENHEID, OPWEB
ORDER BY CDARTIKEL ASC, OMSCHR ASC, VVOPWEB ASC");
    if (!$recordSet) {
        print $conn->ErrorMsg();
    } else{

    
    echo"<table><tr><td>artikel</td><td>Hoofdgroep</td><td>subgroep</td><td>omschr</td><td>eenheid</td><td>opweb</td></tr>"; 
    
    while (!$recordSet->EOF) { 
    $artikel=$recordSet->fields["CDARTIKEL"];
    $vvhoofdgroep=$recordSet->fields["VVHOOFDGROEP"];
    $vvsubgroepa=$recordSet->fields["VVSUBGROEPA"];
    $omschr=$recordSet->fields["OMSCHR"];
    $eenheid=$recordSet->fields["EENHEID"];
    $opweb=$recordSet->fields["OPWEB"];
        echo "<tr>";
        echo "<td>".$artikel."</td><td>".$vvhoofdgroep."</td><td>".$vvsubgroepa."</td><td>".$omschr."</td><td>".$eenheid."</td><td>".$opweb."</td>";
        echo "</tr>";
        $recordSet->MoveNext();
    }
    echo "</table>";
    }
    $recordSet->Close(); 
    $conn->Close(); 
    $recordSet=null; 
    $conn=null;
?>


Om eerlijk te zijn weet ik niet wat ik verder nog moet doen en ik hoop dat jullie me hierbij nog willen helpen

[ Voor 8% gewijzigd door damen18 op 14-08-2008 14:02 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
En ik ben net op tijd terug van vakantie om je op te vangen ;)

Kun je eens kijken wat je ziet als je de source html output opvraagt? Want een blanco pagina kan van alles betekenen.
Dit valt ook in de categorie debuggen. Je zou eens kunnen proberen om zelf wat output naar de client te versturen om te achterhalen tot hoever je code komt. En met php kun je ook error reporting aanzetten, iets met E_ALL, dan wordt er veel meer informatie getoond.

  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
bigbeng schreef op donderdag 14 augustus 2008 @ 14:05:
En ik ben net op tijd terug van vakantie om je op te vangen ;)

Kun je eens kijken wat je ziet als je de source html output opvraagt? Want een blanco pagina kan van alles betekenen.
Dit valt ook in de categorie debuggen. Je zou eens kunnen proberen om zelf wat output naar de client te versturen om te achterhalen tot hoever je code komt. En met php kun je ook error reporting aanzetten, iets met E_ALL, dan wordt er veel meer informatie getoond.
Ha, goed om te horen! Goede vakantie gehad?

Ok, ik ben gister uiteraard nog verder gegaan (want ik moet dit werkend hebben). :)

Ok, Gister heb ik op een andere pc in het netwerk een webserver geinstalleerd en nog wat code aangepast van wat ik hierboven hebt neergezet. En wat blijkt? Van die pc werkt het wel. :) Hier is de nieuwe code
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

error_reporting(E_ALL);
$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
    

    $conn->Open("Provider=SQLBASEOLEDB.1;Server=192.168.11.3; Password=test;Persist Security Info=False;User ID=test;Data Source=MVL00003");


    $recordSet = $conn->Execute("select CDARTIKEL, VVHOOFDGROEP, VVSUBGROEP, OMSCHR, EENHEID, OPWEB 
from SYSADM.ARTIKEL ARTIKEL 
where (OMSCHR Like '%RVS%') AND (VVHOOFDGROEP Like 'RVS') AND (VVSUBGROEP Like 'Rond') AND VVOPWEB = 'Ja'
GROUP BY OMSCHR, CDARTIKEL, OPWEB, VVHOOFDGROEP, VVSUBGROEP, EENHEID, OPWEB
ORDER BY CDARTIKEL ASC, OMSCHR ASC, OPWEB ASC");
    if (!$recordSet) {
        print $conn->ErrorMsg();
    } else{

    
    echo"<table><tr><td>artikel</td><td>Hoofdgroep</td><td>subgroep</td><td>omschr</td><td>eenheid</td><td>opweb</td></tr>"; 
    
    while (!$recordSet->EOF) { 
    $artikel=$recordSet->fields["CDARTIKEL"];
    $vvhoofdgroep=$recordSet->fields["VVHOOFDGROEP"];
    $vvsubgroepa=$recordSet->fields["VVSUBGROEP"];
    $omschr=$recordSet->fields["OMSCHR"];
    $eenheid=$recordSet->fields["EENHEID"];
    $opweb=$recordSet->fields["OPWEB"];
        echo "<tr>";
        echo "<td>".$artikel."</td><td>".$vvhoofdgroep."</td><td>".$vvsubgroepa."</td><td>".$omschr."</td><td>".$eenheid."</td><td>".$opweb."</td>";
        echo "</tr>";
        $recordSet->MoveNext();
    }
    echo "</table>";
    }
    $recordSet->Close(); 
    $conn->Close();
    $recordSet=null; 
    $conn=null; 
?>

Hij gaf eerst bij output alleen maar een tabel in met daarin de titels en dan sloot hij hem af. Overigens had ik error_reporting al aan staan. Waar het probleem aan ligt durf ik eigenlijk niet te zeggen. Ik dacht dat het te maken had met sql.ini maar dat is dus blijkbaar ook niet zo. Heb dat ook op mn testserver geprobeerd, maar dat werkte dus niet. Ook zit er dezelfde sqlbaseoledb driver op. Nu weet ik iig dat de code goed is alleen rest mij nog een vraag alhoewel dit niet met proggen te maken heeft.

Op welke php host kan je zelf een oledb driver installeren? Of is dit niet nodig? SQLBaseOLEDB driver is namelijk niet standaard geinstalleerd. Kun je op sommige hosts ook zelf de sql.ini aanpassen?

Oh ja....en de COM functions moet ook werken. (wat een eisen he?)

  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
Ok, ik ben erachter dat dit niet gaat werken aangezien er te veel moet gebeuren op de hosting provider. Dat laten ze waarschijnlijk niet toe. Dus ben ik aan de slag gegaan met SOAP.

Poe....dat ziet er eenvoudig uit, maar toch werkt het niet. Ik heb een voorbeeld genomen en aanpast naar mijn instellingen. Zie hieronder:

Dit is de foutmelding:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://localhost/soap/server.php' in C:\wamp\www\soap\client.php:7 Stack trace: #0 C:\wamp\www\soap\client.php(7): SoapClient->SoapClient('http://localhos...') #1 {main} thrown in C:\wamp\www\soap\client.php on line 7


Client
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"
"http://www.w3.org/MarkUp/Wilbur/HTML32.dtd">
<html>
<body>
<?php
require_once('../lib/nusoap.php');
$soapclient = new soapclient('http://localhost/soap/server.php');
// $soapclient->debug_flag=true; //turn on debugging
$courses = $soapclient->call('getcourses');
// echo $soapclient->request; // shows XML of SOAP request
// echo $soapclient->response; //shows XML of SOAP response

foreach ($courses as $c) {
// The array is nested so this has the same recursions as there are courses
foreach ($c as $info) {
// this only loops once, but you need it anyway. (the array is 3d even
// though there are only 2d of intended structure)
echo "Name: ";
echo $info["name"];
echo " Number: ";
echo $info["number"];
echo " Seats: ";
echo $info["seats"];
}
echo "<hr />";
}
?>
</body>
</html>


Server
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

require_once('../lib/nusoap.php');
$s = new soap_server;
$s->register('getcourses');

function getcourses(){
$course = new EXAMPLE;
return $course->ListCourses();
}
$s->service($HTTP_RAW_POST_DATA);

class EXAMPLE {

function ListCourses(){
//mysql_connect('server','user','pass');
    //mysql_select_db('test');
    $prod_conn=odbc_connect("Nfsupplies","user","pass","");
    if (!$prod_conn)
    {
    exit("<font color='#FF0000'>Kan geen verbinding maken:</font> " . $prod_conn);
    } 
    $query = "select CDARTIKEL FROM ARTIKEL WHERE (VVSUBGROEPA Like '%$symbol%') AND VVOPWEB = 'Ja'";
    
    $result = odbc_exec($prod_conn, $query);

$cnt=0;
while ($course = odbc_fetch_assoc($result)){
$courses[$cnt] = array('name' => $course["CDARTIKEL"], 'number' => $course["OMSCHR"], 'seats' => $course["VVHOOFDGROEP"]);
$cnt = $cnt + 1;
}
return $courses;

}
}
?>


Graag zou ik nog een keer gebruik willen maken van jullie hulp.

[ Voor 7% gewijzigd door damen18 op 18-08-2008 11:27 ]


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Zoals de foutmelding al aangeeft: Via http://localhost/soap/server.php kan geen WSDL file geladen worden. Nu neem ik gemakshalve aan dat NuSOAP deze automatisch moet genereren, maar dit gebeurt schijnbaar niet.

Aangezien dit SOAP basics zijn verwacht ik dat de handleiding van NuSOAP je hier wel mee kan helpen, dus heb je daar al naar gekeken?

-- edit
Ik zie dat er niet echt een handleiding voor is, maar ik vond wel dit: http://www.scottnichol.com/nusoapprogwsdl.htm
Zo te zien moet je wat extra calls aan je server.php toevoegen, en het http adres wat de client gebruikt wat aanpassen.

[ Voor 26% gewijzigd door B-Man op 18-08-2008 12:40 ]


  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
Bedankt voor je reactie.

Die link die je geeft heb ik ook gevonden en heb alle voorbeelden gebruikt, maar ze werken niet. Weet jij toevallig een goed werkend voorbeeld van soap? Thanx

  • B-Man
  • Registratie: Februari 2000
  • Niet online
damen18 schreef op maandag 18 augustus 2008 @ 13:59:
Bedankt voor je reactie.

Die link die je geeft heb ik ook gevonden en heb alle voorbeelden gebruikt, maar ze werken niet. Weet jij toevallig een goed werkend voorbeeld van soap? Thanx
Aangezien je nu bezig bent met NuSOAP lijkt het me slim om te vermelden wat je precies geprobeert hebt, wat er niet werkte en welke foutmelding(en) je kreeg.

Er zijn verschillende SOAP implementaties, bijvoorbeeld de native PHP SOAP code (moet wel ingeschakeld zijn bij installeren/compileren van PHP): http://nl3.php.net/manual/en/book.soap.php
Die code heb ik zelf veelvuldig gebruikt, maar zonder Zend Studio moet je zelf je WSDL schrijven.

  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
B-Man schreef op maandag 18 augustus 2008 @ 14:35:
[...]

Aangezien je nu bezig bent met NuSOAP lijkt het me slim om te vermelden wat je precies geprobeert hebt, wat er niet werkte en welke foutmelding(en) je kreeg.

Er zijn verschillende SOAP implementaties, bijvoorbeeld de native PHP SOAP code (moet wel ingeschakeld zijn bij installeren/compileren van PHP): http://nl3.php.net/manual/en/book.soap.php
Die code heb ik zelf veelvuldig gebruikt, maar zonder Zend Studio moet je zelf je WSDL schrijven.
Ik heb de extensie in wampserver aangevinkt voor soap. Qua code heb ik inmiddels al zoveel geprobeerd dat ik het eigenlijk niet meer weet. Ik word er eigenlijk een beetje gek van. Aangezien jij zoveel ervaring hebt met php soap, zou jij dan een code willen plaatsen die echt werkt? Zo kunnen we checken of het uberhaupt wel werkt op mijn systeem. Zijn er nog meer extensies of andere instellingen die ik moet wijzigen/aanvinken om met soap te kunnen werken?

Ik heb ook nog een ander voorbeeld. Die geeft geen foutmelding alleen een wit scherm.

Client
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(E_ALL);
require_once('lib/nusoap.php');

$wsdl="http://localhost:80/stockserver.php?wsdl"; 
$c = new nusoap_client("http://localhost/stockserver.php?wsdl", true);

$stockprice = $c->call('getStockQuote', array('Symbol' => 'Rond'));

echo "The stock price for 'ABC' is $stockprice.";

?>


Server
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
error_reporting(E_ALL);
function getStockQuote($symbol) {


    $prod_conn=odbc_connect("Nfsupplies","test","test","");
    if (!$prod_conn)
    {
    exit("<font color='#FF0000'>Kan geen verbinding maken:</font> " . $prod_conn);
    } 
    $query = "select CDARTIKEL FROM ARTIKEL WHERE (VVSUBGROEPA Like '%$symbol%') AND VVOPWEB = 'Ja'";
    
    $result = odbc_exec($prod_conn, $query);
    

    $row = odbc_fetch_assoc($result);
    return $row['CDARTIKEL'];
}

require('lib/nusoap.php');

$server = new soap_server();

$server->configureWSDL('stockserver', 'urn:stockquote');

$server->register("getStockQuote",
                array('VVSUBGROEPA' => 'xsd:string'),
                array('return' => 'xsd:string'),
                'urn:stockquote',
                'urn:stockquote#getStockQuote');

$server->service(file_get_contents ('php://input'));
?>


Dit is een simpel voorbeeld. Ik snap wat er staat, maar toch werkt het niet. Deze geeft dus geen waarde weer van $stockprice van stockclient.php en geeft verder geen foutmelding. Zoals je misschien wel zult begrijpen begin ik een beetje wanhopig te worden aangezien ik hier al 3,5 week mee bezig ben om een remote connectie te maken. Op het moment ben ik blij met elke hulp die ik kan krijgen.
Thanx

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Wat zie je als je de URL van de WSDL (http://localhost/stockserver.php?wsdl) aanroept?
Je zegt dat je een wit scherm ziet als je de client aanroept, wat betekent dat er ergens iets niet werkt zoals het hoort. Je hebt error_reporting wel op het hoogste niveau gezet, maar vergeet niet dat je via php.ini kan instellen dat errors nooit naar de client gegooid worden. Ze verschijnen dan enkel in de error_log file.

Kortom: kijk eens in de error_log van php. Kijk verder dus eens (via een phpinfo() of door direct in php.ini te kijken) wat de waarden zijn van "display_errors" en "error_log". Ik verwacht dat je "display_errors" uit hebt staan, en error_log naar een bestand wijst waar je de foutmeldingen in terugvindt.

  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
B-Man schreef op dinsdag 19 augustus 2008 @ 00:06:
Wat zie je als je de URL van de WSDL (http://localhost/stockserver.php?wsdl) aanroept?
Je zegt dat je een wit scherm ziet als je de client aanroept, wat betekent dat er ergens iets niet werkt zoals het hoort. Je hebt error_reporting wel op het hoogste niveau gezet, maar vergeet niet dat je via php.ini kan instellen dat errors nooit naar de client gegooid worden. Ze verschijnen dan enkel in de error_log file.

Kortom: kijk eens in de error_log van php. Kijk verder dus eens (via een phpinfo() of door direct in php.ini te kijken) wat de waarden zijn van "display_errors" en "error_log". Ik verwacht dat je "display_errors" uit hebt staan, en error_log naar een bestand wijst waar je de foutmeldingen in terugvindt.
Gisteravond uiteraard nog verder gegaan en heb het opgelost. Ik heb SOAPUI gedownload. Een goed programma. Dan krijg je foutmeldingen te zien. Ik had wat in de sql.ini veranderd waardoor de database connectie niet meer werkte, maar die foutmelding werd niet doorgegeven in mijn scherm. Met SOAPUI werd dit wel weergegeven.

Zit nu alleen wel met het volgende en ik hoop dat dit mijn laatste vragen zijn.

Hij geeft maar 1 item weer terwijl het er meer moeten zijn. En hoe kan ik nog meer attributen weergeven uit de database? Nu geeft hij alleen CDARTIKEL weer. En als ik dan meer attributen heb hoe moet ik dit dan splitsen van een array?

Dit is nu de code:

client
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(E_ALL);
require_once('lib/nusoap.php');

$wsdl="http://localhost:80/stockserver.php?wsdl"; 
$c = new nusoap_client("http://localhost/stockserver.php?wsdl", true);
$proxy = $c->getProxy();
$artikel = $proxy->call('getStockQuote', array('VVSUBGROEPA' => 'Rond', 'VVHOOFDGROEP' => 'RVS'));

echo "Artikel 'RVS' 'Rond' is $artikel.";

?>


server
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
error_reporting(E_ALL);
function getStockQuote($symbol, $vvhoofdgroep) {

    //mysql_connect('server','user','pass');
    //mysql_select_db('test');
    $prod_conn=odbc_connect("Nfsupplies","test","test","");
    if (!$prod_conn)
    {
    exit("<font color='#FF0000'>Kan geen verbinding maken:</font> " . $prod_conn);
    } 
    $query = "select CDARTIKEL FROM ARTIKEL WHERE (VVSUBGROEPA Like '$symbol') AND (VVHOOFDGROEP Like '$vvhoofdgroep') AND VVOPWEB = 'Ja'";
    //SELECT stock_price FROM stockprices "           . "WHERE stock_symbol = '$symbol'";
    if (!$query)
    {
    exit("<font color='#FF0000'>fout in sql:</font> " . $query);
    } 
    $result = odbc_exec($prod_conn, $query);
    //mysql_query($query);

    while ($row = odbc_fetch_array($result)){
    return $row['CDARTIKEL'];
    }
}

require('lib/nusoap.php');

$server = new soap_server();

$server->configureWSDL('stockserver', 'urn:stockquote');

$server->register("getStockQuote",
                array('VVSUBGROEPA' => 'xsd:string', 'VVHOOFDGROEP' => 'xsd:string'),
                array('return' => 'xsd:string', 'return' => 'xsd:string'),
                'urn:stockquote',
                'urn:stockquote#getStockQuote');
//$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
//$server->service($HTTP_RAW_POST_DATA);
$server->service(file_get_contents ('php://input'));
?>


Wat ik geprobeerd heb:
client
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(E_ALL);
require_once('lib/nusoap.php');

$wsdl="http://localhost:80/stockserver.php?wsdl"; 
$c = new nusoap_client("http://localhost/stockserver.php?wsdl", true);
$proxy = $c->getProxy();
$artikel = $proxy->call('getStockQuote', array('VVSUBGROEPA' => 'Rond', 'VVHOOFDGROEP' => 'RVS'));


foreach ($artikel as $a) {
echo "Artikel 'RVS' 'Rond' is $a.";
}
?>


Nu krijg ik een foutmelding.
Warning: Invalid argument supplied for foreach() in C:\wamp\www\stockclient.php on line 11

Het schijnt dat er dan 2 opties zijn. Of het is geen array of de waarde is 0 (integer). CDARTIKEL zijn idd nummers, maar het is geen integer. Hoe moet ik dit dan oplossen?

Ik hoop dat je me nog een keer wilt helpen.

[ Voor 9% gewijzigd door damen18 op 19-08-2008 11:15 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:37

Janoz

Moderator Devschuur®

!litemod

PHP:
1
2
3
    while ($row = odbc_fetch_array($result)){
    return $row['CDARTIKEL'];
    }
Wat denk je zelf dat hier gebeurt?

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


  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
ik dacht: elk item die aan de query voldoet. Door de while. Maar dat zal wel niet het geval zijn dan?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:37

Janoz

Moderator Devschuur®

!litemod

RTFM, dan hoef je niet te 'denken', maar kun je 'zeker weten'.

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


  • damen18
  • Registratie: Mei 2004
  • Laatst online: 21-11-2023
server
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
error_reporting(E_ALL);
function getStockQuote($symbol, $vvhoofdgroep) {

    //mysql_connect('server','user','pass');
    //mysql_select_db('test');
    $prod_conn=odbc_connect("Nfsupplies","ODBC","odbc","");
    if (!$prod_conn)
    {
    exit("<font color='#FF0000'>Kan geen verbinding maken:</font> " . $prod_conn);
    } 
    $query = "select CDARTIKEL FROM ARTIKEL WHERE (VVSUBGROEPA Like '$symbol') AND (VVHOOFDGROEP Like '$vvhoofdgroep') AND VVOPWEB = 'Ja'";
    //SELECT stock_price FROM stockprices "           . "WHERE stock_symbol = '$symbol'";
    if (!$query)
    {
    exit("<font color='#FF0000'>fout in sql:</font> " . $query);
    } 
    $result = odbc_exec($prod_conn, $query);
    //mysql_query($query);
$cnt = 0;
    while ($row = odbc_fetch_array($result)){
    $rows[$cnt] = $row['CDARTIKEL'];
    $cnt = $cnt + 1;
    }
    return $rows;
}

require('lib/nusoap.php');

$server = new soap_server();

$server->configureWSDL('stockserver', 'urn:stockquote');

$server->register("getStockQuote",
                array('VVSUBGROEPA' => 'xsd:string', 'VVHOOFDGROEP' => 'xsd:string'),
                array('return' => 'xsd:string', 'return' => 'xsd:string'),
                'urn:stockquote',
                'urn:stockquote#getStockQuote');
//$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
//$server->service($HTTP_RAW_POST_DATA);
$server->service(file_get_contents ('php://input'));
?>


client
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(E_ALL);
require_once('lib/nusoap.php');

//$wsdl="http://localhost:80/stockserver.php?wsdl"; 
$c = new nusoap_client("http://localhost/stockserver.php?wsdl", true);
$proxy = $c->getProxy();
$rows = $proxy->call('getStockQuote', array('VVSUBGROEPA' => 'Rond', 'VVHOOFDGROEP' => 'RVS'));

echo "Artikel 'RVS' 'Rond' is $rows.";

?>


Nu krijg ik als output: Artikel 'RVS' 'Rond' is Array. Terwijl array mn waarde moet zijn :?

[ Voor 7% gewijzigd door damen18 op 19-08-2008 11:21 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 16-11 14:26

Creepy

Tactical Espionage Splatterer

Niet om het 1 of ander, maar elke keer dump je je code, geef je aan wat er mis gaat, en that's it. Het lijkt erop alsof we hier je hand moeten vasthouden bij elke stap die je neemt. Hier op GoT verwachten we meer. Je foutmelding dumpen en hopen wij het voor je gaan oplossen is echt niet de bedoeling. In Programming Beleid - De Quickstart staat prima uitgelegd welke zaken we graag terug willen zien. Dat geld voor nagenoeg elke vraag die je stelt.

Ga gewoon nu echt zelf eens goed aan de slag door te controleren wat er gebeurd, debuggen etc. Als je er echt niet uitkomt dan kan je een nieuw topic openen maar let daarbij dus op de net genoemde quickstart zodat je genoeg informatie geeft.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.