Aktuelle Zeit: 01.10.2020 09:25

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 31.07.2020 21:06 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Moin zusammen,

nun ist es soweit, ich bin stolzer Besitzer von SpiderBasic und frickel an meinem ersten Projekt herum.

Bei der Kommunikation mit einem PHP Modul stoße ich auf ein Problem bzgl. des JSON Formats.
Ich kodiere in einem PHP Modul Userdaten zu einem JSON-String. Diesen JSON String soll SpiderBasic in eine Liste extrahieren.

Offenbar weichen die Formatierungen hier aber ab, wenn ich mir den JSON-String aus der Spider-Hilfe ansehe:
Code:
"[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " +
             "{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " +
             "{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]

und den JSON String, den mir PHP codiert:

Code:
[{"users_id":"1011","accesslevel":"0","firstname":"Hans","lastname":"Wurst","email":"grillwurst@meika.de"},{"users_id":"1012","accesslevel":"1","firstname":"Hans2","lastname":"Wurst2","email":"grillwurst2@meika.de"}]

Jedenfalls bekomme ich den String mit folgendem Programmschnipsel nicht dekodiert.
Ihr müsst dazu den JSON String in eine lokale Textdatei kopieren. Das Testprogramm lädt diese dann per FileRequester() ein.

Code:
Structure User
   Userid.s
   Accesslevel.s
   Firstname.s
   Lastname.s
   Email.s
EndStructure

Global Input.s

Procedure ReadCallback(Status, Filename$, File, Size)
   If Status = #PB_Status_Loaded
      Debug "File: " + Filename$ + " - Size: " + Size + " bytes"
      
      Input = ReadString(0, #PB_File_IgnoreEOL)           
      CloseFile(0)
      
   ElseIf Status = #PB_Status_Error
      Debug "Error when loading the file: " + Filename$
   EndIf
EndProcedure

Procedure OpenFileRequesterCallback()
   If NextSelectedFile()
      ReadFile(0, SelectedFileID(), @ReadCallback(), #PB_LocalFile)
   EndIf
EndProcedure

Procedure ChooseFileEvent()
   OpenFileRequester("*.txt", @OpenFileRequesterCallback())
EndProcedure

Procedure ExtractJSON()
   Debug Input
   NewList Users.User()
   
   ParseJSON(0, Input)
   ExtractJSONList(JSONValue(0), Users())
   
   ForEach Users()
      Debug Users()\Userid + ", " + Users()\Accesslevel + ", " + Users()\Firstname + ", " + Users()\Lastname + ", " + Users()\Email
   Next
EndProcedure

OpenWindow(0, 0, 0, 300, 100, "Read file example", #PB_Window_ScreenCentered)
ButtonGadget(0, 10, 10, 280, 30, "Choose a file...")
ButtonGadget(1, 10, 60, 280, 30, "Extract JSON")
BindGadgetEvent(0, @ChooseFileEvent())
BindGadgetEvent(1, @ExtractJSON())


Kann man da irgendwas machen ohne den ganzen JSON String auf das "SpiderBasic-Format" umformatieren zu müssen?

Gruß
Kurzer

_________________
"Never run a changing system!"
PB 5.72 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 52.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 31.07.2020 23:00 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Krass! Ich habe die Ursache gefunden.

Die Strukturfelder der Liste müssen zwingend genau so heißen wie die Elemente in dem JSON String. Inkl. Groß-/Kleinschreibung.

Code:
[{"users_id":"1011","accesslevel":"0","firstname":"Hans","lastname":"Wurst","email":"grillwurst@meika.de"},{"users_id":"1012","accesslevel":"1","firstname":"Hans2","lastname":"Wurst2","email":"grillwurst2@meika.de"}]

Code:
Structure User
   users_id.s
   accesslevel.s
   firstname.s
   lastname.s
   email.s
EndStructure

[...]

   ForEach Users()
      Debug Users()\users_id + ", " + Users()\accesslevel + ", " + Users()\firstname + ", " + Users()\lastname + ", " + Users()\email
   Next

Das habe ich so nicht erwartet und sollte in der Hilfe evtl. ein bisschen eindeutiger formuliert werden.
Dort steht nur, dass der Typ der JSON Elemente und der Liste übereinstimmen müssen.

SpiderBasic Hilfe hat geschrieben:
If the JSON value contains any elements that do not have the proper type to match the List(), they will be ignored and the corresponsing list element will be left empty.


Kurzer

_________________
"Never run a changing system!"
PB 5.72 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 52.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 31.07.2020 23:01 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Ich habe keine Spiderbasic, aber JSON ist JSON. Da kann es höchstes falsche Implementierungen geben.
Ein Wert kann demnach null, eine Ganzzahl, Fließkommazahl, ein boolscher Wert (true, false) oder ein String sein.

Der unmöglich kompliziert geschrieben JSON-String aus der Spiderbasic-Hilfe scheint Ganzzahlen zu beinhalten, während PHP ausnahmslos Strings nutzt. Vielleicht liegt das Problem eher daran?
Hier noch der Vollständigkeit halber die besser formatierte Version des Beispiels aus der Hilfe:
Code:
Debug ~"[ {\"x\": 10, \"y\": 20}, {\"x\": 30, \"y\": 50}, {\"x\": -5, \"y\": 100} ]"

Wo siehst du eigentlich genau den Unterschied zwischen PHP- und Spiderbasic-JSON?

Edit:
Ups, da war ich etwas spät. Aber die Lösung ergibt Sinn. Danach hab ich gar nicht geschaut. Ich meine in Javascript ist Groß- und Kleinschreibung ja auch wichtig.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 31.07.2020 23:33 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Moin Nic,

um noch kurz Deine Frage zu beantworten.
Ja, als vermeintliche Unterschiede sah ich z.B., dass PHP alle Werte in Hochkommas einschließt. Das SB Beispiel jedoch nicht.

Code:
 SB: Chr(34) + ": 10, " + Chr(34)
PHP: users_id":"1011",

Aber wie du schon richtig erklärt hast, sieht PHP alle values als String an und verpackt sie dann auch entsprechend als String im JSON String.

_________________
"Never run a changing system!"
PB 5.72 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 52.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 31.07.2020 23:45 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Also PHP macht nicht aus allem einen String. Das wäre auch falsch. Dieser Beispielcode von hier interpretiert Zahlen korrekt:
Code:
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

echo json_encode($arr);

Das Ergebnis davon ist:
Code:
{"a":1,"b":2,"c":3,"d":4,"e":5}

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 01.08.2020 17:34 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Hmm, interessant.

Mir wäre es eigentlich auch lieber, wenn PHP aus den Datensätzen in der Datenbanktabelle einen numerischen Wert macht, wenn die betreffende Spalte ein INT Datentyp ist.
In meinem Fall sind die beiden Spalten users_id und accesslevel INT Datentypen.

Code:
      $statement = $this->connection->prepare('
        SELECT users_id, accesslevel, firstname, lastname, email
        FROM users
        ' . $where);

      $statement->execute();

      $result = $statement->fetchAll(PDO::FETCH_ASSOC);

Der Code da oben gibt mir ein Array zurück, welches ich dann einfach per json_encode() in JSON kodieren lasse.
Leider alle Werte dann als String. :|

Code:
$users = new Users();
  $allusers = $users->getAllUsers(false);
  if ($allusers != false) {
    echo json_encode($allusers);
[...]

_________________
"Never run a changing system!"
PB 5.72 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 52.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 01.08.2020 22:30 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Hier ist prinzipiell die Lösung für das Problem mit den Integers, die zu Strings werden: https://stackoverflow.com/a/16129496
Es hat damit zu tun, dass z.B. MySQL größere Zahlen speichern kann als PHP. Leider funktioniert genau dieser Parameter mit MySQL nicht. Jetzt, wo ich das sehe, finde ich das höchste bescheuert. In meinem letzten PHP-Projekt nutze ich aber auch kein PDO, sondern mysqli. Ich habe lange geforscht, was von beidem besser ist, und es hat sich wohl herausgestellt, dass mysqli vorzuziehen ist. Die Gründe weiß ich aber nicht mehr. :lol:
Also falls du das umbauen willst, hier siehst du wie ich es gemacht habe: https://github.com/NicolasGoeddel/weath ... tabase.php

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 01.08.2020 22:43 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
NicTheQuick hat geschrieben:
Hier ist prinzipiell die Lösung für das Problem mit den Integers, die zu Strings werden: https://stackoverflow.com/a/16129496

Danke für den Tipp!
Bei UserIDs und Zugriffsleveln wird der Wertebereich nicht höher werden, als es PHP handlen kann.
PHP Hilfe hat geschrieben:
JSON_NUMERIC_CHECK (integer) Kodiert numerische Zeichenketten als Zahlen. Verfügbar von PHP 5.3.3 an.

Hmm, welche Version hat der Kundenserver?
PHP-Version: 5.6.22-2

Hervorragend! :allright:

PS: Schade, dass du die Gründe nicht mehr weißt warum mysqli dem PDO vorzuziehen ist.

_________________
"Never run a changing system!"
PB 5.72 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 52.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 01.08.2020 23:00 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Kurzer hat geschrieben:
Hmm, welche Version hat der Kundenserver?
PHP-Version: 5.6.22-2

Wie bitte? 5.6.x gehört schon lange auf den Müll. Das ist schon 2019 ausgestorben. Heutzutage sollte man mindestens mit PHP 7.1.31+ arbeiten, oder besser gleich mit PHP 7.4.x. Wo wird denn noch PHP 5.6 angeboten?

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: PHP JSON != SpiderBasic JSON?
BeitragVerfasst: 02.08.2020 11:15 
Offline
Benutzeravatar

Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg
Bei timmehosting.de

Aber es hat eher mit dem Webshop zu tun, der da auch noch läuft. Ich glaube der setzt eine bestimmte Range der PHP Version voraus (Vermutung).

Timme bietet aber auch aktuelle PHP Versionen an:
Timme Webseite hat geschrieben:
7.0 bis 7.4, 5.3 bis 5.6

_________________
"Never run a changing system!"
PB 5.72 x64, OS: Windows 7 Pro x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Ich bin Baujahr 1968, also aktuell 52.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye