C++ Php Script aufrufen via C++

hubertus1990

Lt. Commander
Registriert
Sep. 2005
Beiträge
1.384
Hi Leute.

Und zwar habe ich folgendes Problem:
Ich habe eine MySQL Datenbank, und ein .php Script das Daten aus dieser DB ausliest (via SELECT) und sie als JSON string zurückgibt.

Nun möchte ich in einer C++ Anwendung dieses .php Script aufrufen, und die ausgelesenen Daten in meiner Anwendung anzeigen.

WICHTIG: Ich will mich nicht direkt zur DB verbinden, die ganze Sache müss über das .php Script laufen!

In einem Java Programm mache ich genau das gleiche, und es funktioniert einwandfrei:

Code:
		String result = "";
		InputStream is2 = null;
		 
		//http post, sending a request to the SQL database, via php
		try{			        
                                HttpClient httpclient = new DefaultHttpClient();
		        
			        HttpPost httppost = new HttpPost("http://mydomain.com/getdata.php"); // php script that accesses the SQL database

			        HttpResponse response = httpclient.execute(httppost); // execute the request
			        
			        HttpEntity entity = response.getEntity(); // receive response
			        
			        is2 = entity.getContent(); // the input stream now contains the data sent from the SQL database
			}catch(Exception e){
			        Log.e("log_tag", "Error in http connection "+e.toString());
			}
			//convert response to string
			try{
				
		        BufferedReader reader = new BufferedReader(new InputStreamReader(is2,"iso-8859-1"),8);
		        StringBuilder sb = new StringBuilder();
		        String line = null;
		        while ((line = reader.readLine()) != null) {
		                sb.append(line + "\n");
		        }
		        if(is2 != null) is2.close();
			 
			        result=sb.toString();
			}catch(Exception e){
			        Log.e("log_tag", "Error converting result "+e.toString());
			}

// do something with the received data...


Nun würde ich den oben gezeigten Code Ausschnitt gerne in C++ realisieren, habe aber keine Ahnung wie das in dieser Sprache funktioniert. Bitte um Hilfe!
 
Ich hab mich eigentlich noch auf garnichts festgelegt.

Ich bitte um Vorschläge wie man die ganze Sache so einfach wie möglich lösen kann :)
Evtl. ein Tutorial oder Code Snippet wäre auch nicht schlecht :)

EDIT: gegoogelt hab ich eig. schon den ganzen Nachmittag, hab nichts gefunden das genau mein Problem behandelt.
 
Zuletzt bearbeitet:
Ok, hab das jetzt mal downgeloaded (libCurl), hab aber keine Ahnung, wie ich diese libraries auch verwenden kann. Arbeite erst seit kurzem mit Visual Studio.
 
Wenn du dich auf nichts festgelegt hast, warum dann auf C++?
Und mit Plattform meine ich auch Betriebssystem...

Visual Studio deutet wohl auf Windows hin, dann findest du bereits im zweiten Treffer meiner Google-Anfrage oben nen Beispiel-Quellcode (gaaanz unten):
http://stackoverflow.com/questions/1011339/how-do-you-make-a-http-request-with-c

Ok, sorry, es macht nicht exakt was du willst. Die URL ist ne andere und es geht nur auf die Standardausgabe und nicht direkt in eine Datei. Vielleicht liegt es daran, dass man beim Programmieren meist nie "genau das selbe Problem hat", sondern dass Probleme häufig eine Kombination aus verschiedenen Teilproblemen sind, bei dir z.B.:
- HTTP Request
- Schreiben in Datei
 
Zuletzt bearbeitet:
1. Mit festlegen habe ich mich auf die Libraries bezogen - ich hatte mich zum obigen Zeitpunkt noch auf keine festgelegt, mittlerweile tendiere ich zu libcurl.

2. Ich möchte nicht in eine Textdatei schreiben, kA wo das aus meinem Text hervorgeht.

3. C++ ist fix, und ja ich programmiere unter Windows, VS2012

4. Wie kann ich die Libraries in mein Projekt einbinden?
- So wie im auf Stackoverflow gezeigten Fall funktioniert es nicht, da ich die Libraries ja noch nicht einmal zu meinem Projekt hinzugefügt habe. Meine Frage daher, wie geht das?

Eine Anleitung wie ich die libcurl libraries zu meinem Projekt hinzufügen kann, wäre toll!
Hab jetzt schon alle möglichen Arten ausprobiert die libs hinzuzufügen, aber der gesamte Code wie er auch im gezeigten Stackoverflow beispiel steht ist immer noch rot unterwellt.
 
Zuletzt bearbeitet:
Ups, das mit der Textdatei lag wohl an einem Problem eines Freundes, der gestern ebenfalls was mit nem HTTP-Request machen musste ;-)

Du bekommst aber sicher auch eine Fehlermeldung, oder?

Ich hab den Stack-Overflow-Code bei mir in ein leeres Win32-Console-Project kopiert und keine Probleme... welchen Code hast du denn genommen?

Und ansonsten muss ich mich schon fragen, ob es wirklich schwer ist, selbst mal Google an zu werfen...
https://www.google.de/search?q=libcurl+visual+studio
da findet man dann ohne große Mühen sowas: http://curl.haxx.se/libcurl/c/visual_studio.pdf
 
Zuletzt bearbeitet:
Dieser Code passt perfekt auf mein Problem denke ich, aber alles ist rot:
Gleich die 1. Antwort.

http://stackoverflow.com/questions/1011339/how-do-you-make-a-http-request-with-c

Die gesamten #includes sind rot unterwellt, und demnach natürlich auch im Code alles.
Das ist kein wunder, da ich die libraries ja noch nicht eingebunden habe, in diesem Punkt raufe ich mir schon seit Stunden die Haare.

Welchen Code konntest du bei dir kompilieren`?

EDIT: Danke, auf das von dir gezeigte .pdf bin ich auch schon gestoßen, es ist mehr als 10 Jahre alt und ich habe die dortigen Schritte probiert, erfolglos.

Manchmal kommt es mir hier so vor, als würden die User schon im Vorhinein mit der Einstellung einen Thread einsehen, dass sowieso nur blöde Fragen gestellt werden.
Und das mit "google doch mal" kannst du dir sparen, damit ist mir nicht geholfen. Ich google schon 2 Tage, und wenn du dir das .pdf auch nur ein bisschen länger als 2 Sekunden angesehen hättest wäre auch dir aufgefallen dass es uralt ist und du hättest mich nicht als Idioten darstellen müssen.
 
Zuletzt bearbeitet:
Wo ganz unten?
Stackoverflow?

Der gezeigte Code verwendet widerum keine libcurl libraries.
Ich dachte mir es wäre am sinnvollsten (so wie von den meisten Usern geraten) libcurl einzusetzen?

Ich werden den unten gezeigten Code mal ausprobieren, aber ich wusste nicht dass man HttpRequests und der gleichen auch über Sockets machen kann.
 
Zuletzt bearbeitet:
HttpRequests und der gleichen auch über Sockets machen kann
Was heißt da "auch über Sockets"? Eine Library wie libcurl schafft es, den ganzen Socket-Mechanismus zu abstrahieren, um den HTTP-Request einfacher zu gestalten. Aber jeder HTTP-Request basiert auf Sockets...

Edit:
Und unabhängig vom Alter sind die Informationen da nicht unbedingt falsch...
du brauchst die lib, du brauchst die dll, und du brauchst die Header-Dateien...

Wenn du mal hier die aktuelle Version gezogen hättest ( http://curl.haxx.se/download.html ) und reingschaut hättest, wäre dir vielleicht aufgefallen, dass sich da sogar ein Visual-Studio-Workspace befindet, über den sich DLL und LIB erzeugen lassen... wie die Dateien dann in ein VS-Projekt integriert werden können, steht ja in der PDF...
 
Zuletzt bearbeitet:
Alles klar, denke mal ich komme weiter.

Folgender Code kompiliert:
Code:
	 WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        cout << "WSAStartup failed.\n";
        system("pause");
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    host = gethostbyname("www.mydomain.com");
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    cout << "Connecting...\n";
    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
        cout << "Could not connect";
        system("pause");
    }
    cout << "Connected.\n";

	const char* reqstring = "GET / HTTP/1.1\r\nHost: www.mydomain.com/stuff/getdata.php\r\nConnection: close\r\n\r\n";

    send(Socket, reqstring, strlen(reqstring), 0);
    char buffer[10000];
    int nDataLength;
    while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){        
        int i = 0;
        while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
            cout << buffer[i];
            i += 1;
        }
    }

Allerdings ist das Ergebnis ein anderes (siehe Anhang)
Habe ich die Zeile mit dem "const char * reqstring = "...."" richtig formuliert?

Mein .php Script sieht so aus:
Code:
  <?php


    $dbhost = 'myhostname';
    $dbuser = 'user';
    $dbpass = 'pw';
   $dbname = 'mydbname';

     $con = mysql_connect("$dbhost", "$dbuser", "$dbpass");
     if(!$con)
     {
        echo 'Not connected';

     }else
     {
     echo 'Connection Established';
     }

     $db = mysql_select_db("$dbname");
     if(!$db)
     {
        echo 'No database selected';
     }else
     {
        echo 'Database selected';
     }
     
     $sql = mysql_query("SELECT loc_longitude,loc_latitude FROM user_locations");

     $output = array();

     while($row=mysql_fetch_assoc($sql))
     $output[]=$row;
     print(json_encode($output));

      mysql_close();

 ?>


Eigentlich müsste doch dann der JSON String auf meiner Console ausgegeben werden, oder nicht?
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    11,9 KB · Aufrufe: 258
Probier mal
Code:
const char* reqstring = "GET /stuff/getdata.php HTTP/1.1\r\nHost: www.mydomain.com\r\nConnection: close\r\n\r\n";

(Siehe hier: http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol)

Weil Host meint wirklich nur den Host und nicht die URL. Die zum Host relative URL ist hinter dem GET einzutragen.

(dass es nicht am PHP-Script liegt sieht man übrigens auch an der Antwort - "Bad Request")
 
Zuletzt bearbeitet:
Geil, geht :)
Vielen Dank für die Hilfe!
Sry dass ich etwas mürrisch geworden bin vorhin, aber ich war wirklich schon am Verzweifeln.

Ein gutes Tutorial zum JSON verarbeiten hast du nicht zufällig parat?
Wenn nicht macht auch nichts, dann werf ich einfach mal google an :)

Ach ja und noch was:
Das ganze sieht jetzt so aus:
Irgend eine Ahnung warum die Sache 2x dasteht?
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    51,7 KB · Aufrufe: 253
Hmm ka, wobei auf den ersten Blick ein Fehler in dem Beispiel ist...
es wird nie geprüft, ob die Laufvariable i über das gelesene Ende hinausgeht... zumindest habe ich das gefühl...
also evtl mal die Zeile probieren:
Code:
while ((i < nDataLength) && (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r')) {

Ob das mit deinem Fehler zusammenhängt, kann ich allerdings nicht sagen...
Auffällig ist übrigens, dass beim zweiten mal das "HTTP/" fehlt... und davor noch eine 0 ausgegeben wird, gehört die da hin?



Edit: Das müsste es gewesen sein.
Ich finde das Beispiel an sich, was den Code angeht, auch alles andere als gut ;-)


Edit2: Für C++ ohne .NET würde ich mir wohl beim Thema JSON http://jsoncpp.sourceforge.net/ anschauen.
 
Zuletzt bearbeitet:
Ja genau danke, das wars :)
Danke vielmals.

Rein Interesse halber, was bedeutet das 5ff vor dem Json String?
 
sieht nach eine hexadezimalen Zahl aus und könnte sich auf die Länge beziehen (1535 dezimal). Bei 17 Zeilen à 80 Zeichen + paar Zeichen sind wir zwar erst bei etwas über 1360, aber eventuell werden einige Steuerzeichen gar nicht angezeigt...

vielleicht könntest die Schleife ja mal etwas umschreiben:
Code:
while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){        
    for (int i = 0; i < nDataLength; i++) {
      if (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
        cout << buffer[i];
      } else {
        cout << ".";
      }
    }
}

und dann posten...
aber 100% sicher bin ich mir jetzt auch nicht ^^

Edit: oder versuch mal was anderes zurückzuliefern (in der Länge verschieden) um zu sehen was passiert...
 
Zuletzt bearbeitet:
Ok das mit den 5ff ist mir klar, ist dezimal wie du schon gesagt hast 1535.
Ich hab aber die Fenstergröße der Commandline auf 90 verändert, 90x17 = 1530 :)

Gibt es eigentlich irgendeine einfachere Methode die gesamten Zeichen bis dorthin wo der JSON String anfängt abzuschneiden als wie die zeichen zu zählen?
 
Zurück
Oben