Wer mittels NMHTTP aus dem Weblesen und als itn speichern



  • Hi,

    ich habe eine Internetseite, die mir lediglich eine zahl ausgibt. nur ein integer zahl, ohen formatierung und ohne zeilenumbrüche. galt einfach ne zahl 🙂

    ich hatte es zuerst mit den indy komponenten probiert und danach mit dem netmnasters. jeweils das gleiche probleme.

    das einlesen der zahl klappt wunderbar. ich lasse mir das testweise via showmessage anzeigen und dann sehe ich einen string aus 6 zahlen. müsste also eine länge von 6 haben. allerdings sagt length(), das es eine länge von 8 hat.

    deswegen scheitert auch das strtoint. ich habe keine ahnung wo das problem ist.

    int __fastcall GetLastProductsID()
    {
       TMemoryStream *strm = new TMemoryStream;
       TStrings *val = new TStringList();
       String pid;
       try
       {
          Form1->HTTP->Tag = 1;
          Form1->HTTP->Port = 80;
          String theurl = Form1->ini->ReadString("PATHS","scripts","") + "last_pid.php";
          Form1->HTTP->Get(theurl);
          val->Text = Form1->HTTP->Body;
          pid = val->Text;
          ShowMessage(pid.Length());
          ShowMessage(pid);
       }
       catch(...)
       {
          delete strm;
          delete val;
          return 0;
       }
    
       delete strm;
       delete val;
       return StrToInt(pid);
    }
    

    kai



  • String hat ein abschliessendes '\0'



  • Da werden sich Leerzeichen und/oder ein Zeilenumbruch eingeschlichen haben, die sieht man bei einem ShowMessage natürlich schlecht. 😉

    Kontrolliere nochmal die Ausgabe deines PHP-Scriptes.

    BigNeal:
    AnsiString hat kein abschliessendes /0. Zumindest keines, das in der Length-Methode mitgezählt würde.



  • Hi,

    ich habe doch gesagt das die ausgabe im html richtig ist:

    <?
    // Datenbankverbindung herstellen
    include "config.inc.php";
    
    // leztes produkt ermitteln
    $res = mysql_db_query($db_name, "SELECT SQL_NO_CACHE products_id FROM products order by products_id desc");
    
    $data = mysql_fetch_array($res);
    
    if (mysql_num_rows($res) > 0)
       echo $data[products_id];
    else
       echo "1";
    ?>
    

    Habe keine Ahnung wieso das nicht geht. voll blöde.

    kai



  • Kai Müller schrieb:

    ich habe doch gesagt das die ausgabe im html richtig ist

    Das hast du behauptet bzw. hoffst du, ein Beweis ist aber auch der gezeigte PHP-Code nicht. 😉

    Wie sieht denn ein ShowMessage("X" + pid + "X"); optisch aus?



  • Hi,

    ich habe nun diese beiden zeilen zwischeneingebaut:

    ShowMessage(pid.Length());
    ShowMessage("X" + pid + "X");

    Die erste Message gibt 8 aus, die andere:

    X348734
    X

    Da ist also ein zeilenumbruch drinnen. nur weswegen?

    kai



  • Vermutlich, weil er schon in der der DB mit drinsteht. Die Frage, wie er dort hineinkommt, hat mit dem BCB aber nichts mehr zu tun.

    Als Workaround könntest du mittels StringReplace o.ä. den Zeilenumbruch durch "", also 'nichts' ersetzen.



  • Hi jansen,

    das mit dem zeilenumbruch kann nicht sein:

    if (mysql_num_rows($res) > 0)
       echo $data[products_id] . "bumsen";
    else
       echo "1";
    

    das wort bumsen zeigt er direkt hinter der zahl an, daher kann da kein zeilenumbruch sein 🙂

    kai



  • Tatsache bleibt, dass ein Zeilenumbruch mitgeliefert wird. Er wird nicht von den HTTP-Komponenten angehängt, wie du durch Auslesen eines einfachen echo "blabla" überprüfen kannst.
    Also nichts, was sich auf der C++-Seite beeinflussen liesse.



  • hi,

    habe das problem nun so gelöst das ich nicht val->Text auslese, sondern val->Strings[0] und damit funktioniert mein code.

    somit komme ich erstmal weiter, um meine software zu proggen, immerhin spart mich die software 50.000 euros 🙂

    kai



  • hast du die ausgabe des PHP Scripts im browser angeschaut?

    Beim anzeigen von HTML werden \n's im HTML Quelltext nicht interpretiert.. also vielleicht mal in den quelltext schaun.



  • Kai Müller schrieb:

    habe das problem nun so gelöst das ich nicht val->Text auslese, sondern val->Strings[0]

    Oh, das Laden in die StringList habe ich ja völlig ignoriert. 😮 Da ist es natürlich logisch, dass beim Auslesen von Text ein Zeilenumbruch angehängt wird (also doch die C++-Seite).
    Wozu lädst du das überhaupt erst in eine StringList, anstatt direkt in pid? Offensichtlich wird doch ohnehin nicht mehr als dieser eine String übertragen!?


Anmelden zum Antworten