Verkrüppelte Datenausgabe (Zugriff auf MySQL mit vb über php)

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

    Verkrüppelte Datenausgabe (Zugriff auf MySQL mit vb über php)

    Hallo Community,

    Nach langer Zeit komme ich mal wieder mit einem Problem daher...
    Und zwar möchte ich Daten aus einer MySQL-DB in meiner VB-Anwendung ausgeben. Nur dabei kommt es zu irgendeinem Ausgabeproblem... vielleicht irgendwas wegen einer Zeichenkodierung?!

    Jedenfalls habe ich die MySQL-Tabelle und die benötigten php-Dateien testweise auf zwei verschiedenen Servern liegen, einmal auf einem Root von Hetzner (wo es am Ende laufen soll) und einmal auf einem Strato-Webspace.
    Wenn ich die Daten von dem Stratoserver abrufe, werden sie fehlerfrei in der VB-Anwendung ausgegeben. Wenn ich sie aber vom Hetzner-Server abrufen lasse, gibt der Rückgabewert jedesmal soetwas aus: �

    VB.NET-Quellcode

    1. 'Verbindung aufbauen und Daten holen/übergeben
    2. Dim Rückgabewert As String = Verbindung.Zugriff(myCollection, "abfrage.php", False)
    3. Debug.WriteLine(Rückgabewert)


    In der ListView wird dann logischerweise auch nichts angezeigt und Fehlermeldungen kommen auch keine!
    Wo liegt da das Problem bzw. was kann man da machen?

    Die PHP-Scripte sind auf beiden Servern (bis auf den db-login etc.) 100% identisch. Auch die Tabellen wurden inklusive der Daten-Inserts mit dem selben SQL-Befehl erstellt. Also auch die Zeichen-Kollation ist die selbe...

    Wenn ich das PHP-Script mit den gleichen Parametern im Browser aufrufe, werden mir die Daten auch so ausgegeben, wie sie für die VB-Anwendung vorbereitet werden sollen. Also liegt es auch nicht an falschen Logindaten etc.

    Ich habe die Anwendung und die Scripts nach dem Tutorial von T1g0r erstellt (nur nach der älteren Version mit NetFramework 3.5 und der passenden HttpPostRequest.dll von Dodo).


    Ich danke schonmal für jede Hilfe :)
    Schon mal schrittweise durch die Sub "Zugriff" gegangen, und geguckt, ob sich alles, wie geplant verhält? Ich würde jetzt mal grob schätzen, dass etwas an dem php Script nicht stimmt, bzw. der Hetzner-Server Probleme damit hat... Guck erstmal, ob du dich nicht irgendwo verschrieben/vertippt hast. Manchmal liegt es an recht winzigen Vertipperein.
    Die PHP-Scripts sind fehlerfrei und 1:1 gleichzeitig auf beide Server hochgeladen (auch gleiche Verzeichnisstruktur und Dateiberechtigungen).
    Ich ändere im Programmm nur jedesmal den Dateipfad auf den jeweilgen Server um:

    VB.NET-Quellcode

    1. Dim Ergebnis As String = myrequest.Create(IO.Path.Combine("http://www.strato-domain.de/scriptordner", File), vPostCollection)
    2. 'bzw:
    3. Dim Ergebnis As String = myrequest.Create(IO.Path.Combine("http://www.hetzner-domain.de/scriptordner", File), vPostCollection)


    Dort liegt auch nicht der Fehler, denn wenn ich da testweise was falsches angebe, kommt wie vorgesehen, eine fette Fehlermeldung.

    Ich hab die php-Datei auch schon einmal "Unicode"-kodiert und einmal "UTF-8"-kodiert gespeichert und hochgeladen. In der Unicode-Variante erhält das Programm dann auch vom Strato nur ein < Zeichen...

    Also es wird schon wahrscheinlich an der PHP-Konfiguration des Roots liegen... hab auch mal auf beiden Servern die Werte von default_charset abgefragt, was aber bei beiden nichts ausgibt, sprich nicht definiert ist.

    VB.NET-Quellcode

    1. <?php echo "default_charset: " . ini_get("default_charset"); ?>


    Ich werd jetzt aber nochmal versuchen, den default_charset auf UTF-8 umzustellen, vielleicht hilft das ja. Immerhin bringt Google immer Problembehandlungen bzgl. UTF-8-Fehlern, wenn ich dieses komische �-Zeichen eingebe.

    Edit: Das Ändern des dafault_charset hat auch nichts bewirkt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MA-Maddin“ ()

    Das geht leider alles nicht -.-

    Habs jetzt mit

    PHP-Quellcode

    1. ini_set("default_charset", "UTF-8");
    2. // und
    3. header('Content-Type: text/xml; charset=UTF-8');


    probiert... es kommt immer das komische Zeichen.

    Im Browser wird es ja wie gesagt richtig angezeigt. Also der scheint es richtig zu verarbeiten. Nur vb hat Probleme...
    Ich muss evtl. versuchen, dem Programm zu sagen, dass der die Ausgabe anders verarbeiten soll. Fragt sich nur, wie man das machen kann. Und vorallem: ob das was bringt. Weil an wirklich allen Punkten im Programm (schon seit der erste Stelle, wenn das PHP-Result ins Programm gelangt) wird nur dieses Zeichen angezeigt. -.-

    Was ich noch dazu nicht verstehe: auf dem Strato ist die leere Ausgabe (wenn keine Parameter übergeben werden) 6 Byte, auf dem anderen 23 Byte groß.
    Kann man sich vielleicht irgendwo ALLE Informationen, die vom Server übertragen werden anzeigen lassen? Irgendwas musst da ja noch vom Server kommen wenn von beiden Servern 6 bzw. 23 Byte Dateigröße im Browser angezeigt werden...


    Hab jetzt die PHP Datei einfach mal irgendwas ohne Bedingung ausgeben lassen... also ohne MySQL-Abfrage. Auch da kommt nur das Krüppelzeichen in VB an -.-

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MA-Maddin“ ()

    System.Text.Encoding.?

    schieb ma n bissi code rüber so von deinem request und nicht nur eine zeile ^^


    ja kann man, mit zB Fiddler <3 nettes http-debugging tool
    Gut, hier ein bisschen Code:

    Anwendung:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. 'Select ausführen
    3. 'Verbindung definieren
    4. Dim Verbindung As cls_Datenbankzugriff
    5. Verbindung = New cls_Datenbankzugriff
    6. Dim myCollection As Net.PostCollection = New Net.PostCollection
    7. 'Parameter für das PHP-Script
    8. myCollection.Add("SQLQuery", "select_alle")
    9. 'Verbindung aufbauen und Daten holen/übergeben
    10. Dim Rückgabewert As String = Verbindung.Zugriff(myCollection, "app_hackinformer.php", False)
    11. '''''''''' Rückgabewert beinhaltet beim Hetzner: �
    12. '''''''''' [...] Code zum Splitten des Rückgabewerts [...]
    13. End Sub
    14. Public Class cls_Datenbankzugriff
    15. Public Function Zugriff(ByVal vPostCollection As Net.PostCollection, ByVal File As String, Optional ByVal Fehlerausgabe As Boolean = True)
    16. Try
    17. Dim myrequest As Net.HTTPPostRequest = New Net.HTTPPostRequest
    18. Dim Ergebnis As String = myrequest.Create(IO.Path.Combine("http://www.universal-alliance.de/app_hackinformer", File), vPostCollection)
    19. '''''''''' Ergebnis beinhaltet beim Hetzner: �
    20. Return Ergebnis
    21. Catch ex As Exception
    22. If Fehlerausgabe = True Then 'Wenn Fehlerausgabe aktiv, den Fehler Ausgeben
    23. MessageBox.Show("Folgender Fehler ist aufgetreten: " & vbNewLine & ex.Message, "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error)
    24. End If
    25. Return "Verbindungsfehler"
    26. End Try
    27. End Function
    28. End Class

    PHP:
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. include("db_connect.php");
    3. include("function_inc.php");
    4. //SQL-Abfrage wählen
    5. switch ($_POST['SQLQuery'])
    6. {
    7. case "select_alle": //Alle Einträge holen
    8. $abfrage = "SELECT * FROM reports";
    9. $ergebnis = dbAbfrage($abfrage);
    10. if($ergebnis == FALSE) //Ist ein Fehler aufgetreten?
    11. {
    12. echo mysql_error(); //Den Fehler ausgeben
    13. }
    14. elseif (is_resource($ergebnis)) //SQL-Befehl ist SELECT...
    15. {
    16. if (mysql_num_rows($ergebnis) == 0)
    17. {
    18. echo "Keine passenden Einträge vorhanden."; //Wenn keine Zeile vorhanden, 0 zurückgeben
    19. }
    20. else
    21. {
    22. while($row = mysql_fetch_assoc($ergebnis)) //Jede Reihe durchlaufen
    23. {
    24. echo (implode("ΛΜΝ", $row)) . "ΡΣΤ"; //hier wird das Array $row implodiert mit , als seperator - ΡΣΤ wird zur Zeilentrennung, ΛΜΝ wird zur Spaltentrennung genutzt
    25. }
    26. }
    27. }
    28. break;
    29. }
    30. ?>

    function_inc.php
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. //Funktion zum Abfragen ob ein Fehler aufgetreten ist
    3. function dbAbfrage($abfrage)
    4. {
    5. $ergebnis = mysql_query($abfrage);
    6. if(!$ergebnis) //Ist ein Fehler aufgetreten?
    7. {
    8. echo mysql_error(); //Den Fehler ausgeben
    9. }
    10. return $ergebnis;
    11. }
    12. ?>


    Der PHP-Teil müsste ja wie gesagt richtig sein. Weil wenn ich den Link mit ?SQLQuery=select_alle im Browser aufrufe (und den Parameter über $_GET abfrage), wird der Tabelleninhalt wie gewünscht mit den Seperatoren als String ausgegeben...
    ok "Net.HTTPPostRequest" stammt aus einer nicht MS lib? i find des iwie gerade nicht ...


    vll klappt das ja, habs nich getestet (habs von c# übersetzt)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function PostYourQuery(ByVal PathToSrvFile As String, ByVal SQLQuery As String)
    2. Dim postdata As String
    3. Dim request As HttpWebRequest
    4. Dim response As HttpWebResponse
    5. Dim str, str2 As IO.Stream
    6. Dim buffer As String
    7. Dim data As Byte()
    8. postdata = "password=" & SQLQuery
    9. data = System.Text.Encoding.UTF8.GetBytes(postdata)
    10. ' CType ist soweit ich weiß aber böse und sollte man eig nich verwenden, mir viel gerade nichts besseres ein xD
    11. request = CType(WebRequest.Create(PathToSrvFile), HttpWebRequest)
    12. request.Method = "POST"
    13. request.ContentType = "application/x-www-form-urlencoded"
    14. request.ContentLength = data.Length
    15. str2 = request.GetRequestStream()
    16. str2.Write(data, 0, data.Length)
    17. str2.Close()
    18. response = request.GetResponse
    19. str = response.GetResponseStream()
    20. buffer = New IO.StreamReader(str, System.Text.Encoding.UTF8).ReadToEnd
    21. Return buffer
    22. End Function

    nebenbei würde ich dir eine andere art der übertragung empfehlen, zB als xml, csv o.ä.
    hast du die php file als UTF-8 gespeichert und im binary mode mit FTP übertragen?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „slice“ ()

    Jop Net.HTTPPostRequest kommt aus der .dll von Dodo (siehe oben). Und ja, die PHP ist als UTF-8 gespeichert und wird im Binary-Modus übertragen.
    Ich versuch jetzt mal deinen Code einzuarbeiten...
    Und wie ich das mit xml bzw csv machen könnte, weiß ich nicht... hab bei beidem kaum Plan :whistling:
    wenns nich klappt werf n blick hier rein ...
    [VB 2010] MySQL verbinden/bearbeiten/auslesen/warten *Greenhorn*

    csv is relativ einfach

    Quellcode

    1. echo (implode(";", $row)) . "\n";
    VIELEN DANK! Es funktioniert! :thumbsup:

    Also mit deinem aus C# übersetzten Code ;)
    Versteh ich das richtig, dass die Parameter bei deinem Code UTF-8-encodiert an das Script übergeben werden und es evtl. daran lag?!
    Ich hab die Verwendung von System.Text.Encoding noch nicht richtig durchschaut und wüsste deßhalb auch nicht wie ich es evtl. in meinem zuvor verwendeten Code anwenden und ausprobieren könnte. :|

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MA-Maddin“ ()

    ja der inhalt von "postdata" wird ebenfalls in UTF-8 kodiert un denne als bytearray gespeichert aber das sollte eher weniger auswirkungen aufs result in dem fall haben, wichtiger ist der untere part "buffer = New IO.StreamReader(str, System.Text.Encoding.UTF8).ReadToEnd" wenn du dort aus UTF8 ein ASCII machst müsstest du in "buffer" fragezeichen haben anstelle von deinen trennzeichen haben...


    €dit (25.07.2012): zum charset hätte ich hier vll noch was sofern das ding auf nem debian läuft :)

    oli schrieb:

    Wie oft hab ich mich schon über die lästige Apache Variable AddDefaultCharset aufgeregt.

    Klar durch ein einfaches löschen der Datei /etc/apache2/charset ist das Problem immer behoben, denn alle besseren Webapplikationen haben ja im Header den Charset stehen… wieso kann das nur wieder Debian mit Ihren Packages nicht gleich auslassen, damit es immer selbstständig vergeben wird?

    Wir armen sysadmins müssen die Schlamperei dann wieder ausbaden…

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „slice“ ()

    Sooooo,

    Ich hab mir jetzt mit dem Programm "WireShark" den Datenfluss zwischen Anwendung und Server angeschaut und festgestellt, dass der Root (Debian) alle Daten GZip-komprimiert ausliefert (die von Webbrowsern automatisch wieder dekomprimiert werden). Aber damit kann meine Anwendung ja mal garnichts anfangen :P

    Die Komprimierung kann man zwar deaktivieren (dann klappts auch in der Anwendung), aber wegen Webseite etc. sollte sie eigentlich aktiv bleiben...

    Jetzt such ich nach einer Lösung, den GZip-String wieder zu dekomprimieren. Hab da auch schon einen Code hier im Forum gefunden, aber bei diesem wird ein Base64String erwartet. :S

    Ist es nicht irgendwie möglich, den String direkt zu dekomprimieren, also ohne Base64 dazwischen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MA-Maddin“ ()

    Füge bei deinem webrequest einfach ma folgendes im Header als accept-encoding ein

    Quellcode

    1. gzip;q=0,deflate;q=0