Zur Navigation

Web SQL nutzen [2]

11 Kokarde

Oh :)

Und was mache ich mit diesen ganzen Werten?
Weil ich will ja nicht "tbl_name" sondern die ganze DB und die Tabellen in dieser DB auflisten.

Wäre das dann hier so richtig?

db.transaction(
    
    function(tx) {
        
    tx.executeSql("SELECT * from DATENBANK WHERE type = 'table'"), [],
        
        function(tx, results) {
        
      var len = results.rows.length;
      var i;
      for(i=0; i<len; i++) {
          
        //Set values coming from the database
        alert(results.rows.item(i));
          
      }  
        
    }
    
    }

);

Jedenfalls gibt der Debugger keinen Fehler mehr aus.
Aber es wird auch nix angezeigt.

21.09.2016 16:53 | geändert: 21.09.2016 16:56

12 Jörg Kruse

Und was mache ich mit diesen ganzen Werten?
Weil ich will ja nicht "tbl_name" sondern die ganze DB und die Tabellen in dieser DB auflisten.

Ja, und zu den Tabellen gehört in aller erster Linie der Name - andernfalls kannst du den zugehörigen Code gar nicht zuordnen

Wäre das dann hier so richtig?

    tx.executeSql("SELECT * from DATENBANK WHERE type = 'table'"), [],

Ist das gleiche, außer dass dir neben tbl_name und sql weitere Felder ausgegeben werden, falls vorhanden

Aber es wird auch nix angezeigt.

Ja, weil results.rows.item(i) ein Array ist. Analog zum Code in Beitrag 12 solltest du die einzelnene Felder so ausgeben können:

alert(results.rows.item(i).tbl_name);
alert(results.rows.item(i).sql);

... wobei ich die Ergebnisse eher in die Konsole ausgeben lassen würde:

console.log(results.rows.item(i).tbl_name);
console.log(results.rows.item(i).sql);

... dann musst du nicht die vielen Dialog-Fenster wegklicken...

21.09.2016 17:59 | geändert: 21.09.2016 18:03

13 Kokarde

Guten Morgen

So langsam werde ich wirre im Kopf :)

Ich habe es mal Zeile für Zeile und Stück für Stück probiert, immer so, das ich in der Console sehen konnte was passiert.
Der Fehler ist jetzt weg, aber es kommt auch keine Ausgabe.

Die DB nennt sich "DATENBANK" und die Tabellen nennen sich "TABELLE1", "TABELLE2".

Doch es kommt keinerlei Ausgabe :(

Eigentlich hätte ich jetzt eine Ausgabe auf der Webseite erwartet in der mir die beiden Tabellen-Namen angezeigt werden.

          <script>   
              
var db = openDatabase('DATENBANK', '1.0', 'myDatenbank', 2 * 1024 * 1024);
          
db.transaction(
    
    function(tx) {
        
    tx.executeSql("SELECT * from DATENBANK WHERE type = 'table'"), [],
        
      function (tx, results) {
        
        var len = results.rows.length, i;
        
        alert(results.rows.item(i).tbl_name);
        alert(results.rows.item(i).sql);
        
        
        }
        
         });	
      
      </script>

22.09.2016 07:41

14 Jörg Kruse

Da fehlt die Schleife, in welcher die Ergebniszeilen durchlaufen werden:

db.transaction(
  function(tx) {
    tx.executeSql("SELECT tbl_name, sql from DATENBANK WHERE type = 'table'"), [],
    function(tx, results) {
      var len = results.rows.length;
      var i;
      for (i=0; i<len; i++) {
        alert(results.rows.item(i).tbl_name);
        alert(results.rows.item(i).sql);
      }
    }
  }
);

Zur Sicherheit würde ich zudem in der Abfrage die Felder explizit benennen, statt die Wildcard * zu verwenden

---

Habe gerade übrigens geschaut, wie es mit dem Browser-Support von Web SQL steht - Firefox und der IE unterstützen dieses Feature nicht:

http://caniuse.com/sql-storage

... und werden es wohl auch nicht implementieren, da es nicht als W3C-Standard verabschiedet wurde

22.09.2016 09:21

15 Kokarde

Hi,

ja die Infos zum Browsersupport hatte ich zuvor alle gelesen.
Ich nutze in diesem Falle Chrome und Safari, wobei es später nur mit Chrome genutzt werden soll.

Leider funktioniert es dennoch nicht :(
Egal ob mit * oder mit der Benennung der Spalten.

Komisch ist, das in der Console auch kein Fehler kommt.
Aber halt auch keine Ausgabe.
Es passiert einfach nix.

Habe das Gefühl dass man mit WebSQL halt einfach keine Tabellen einer DB anzeigen lassen kann.

Auch komisch ist dass ich bei Austausch der Anführungszeichen gegen Hochkomma, so wie es doch eigentlich sein müsste, sofort den Fehler erhalte das wieder so ein ")" fehlt.

Ich denke, ich gebe an dieser Stelle auf.

Auch wenn ich gerade das bekommen habe, musst Du dir rein ziehen:

https://codepen.io/anon/pen/bwggkp

22.09.2016 11:59 | geändert: 22.09.2016 12:22

16 Kokarde

Zitat von Kokarde
Hi,

Auch wenn ich gerade das bekommen habe, musst Du dir rein ziehen:

https://codepen.io/anon/pen/bwggkp

Ich habe es getestet und es funktioniert, aber nur mit zuvor einer leeren Datenbank. Leider erzeugt das Skript auch nur die Ausgabe der Tabellen-Inhalte. Also die Überschriften und deren Inhalte.

Somit zwar sehr cool, aber immer noch nicht das was ich brauch.
Ich brauche ja die Tabellen-Namen der Datenbank die da enthalten sind.

Das Skript wäre aber perfekt für eine Summary-Übersicht.
Also alle Inhalte aller Tabellen.

So, wir sind also wieder fast am Anfang :)

Merkwürdig ist, dass die Option tbl_name nicht das liefert was diese soll.

22.09.2016 13:18

17 Kokarde

Und falls Du zufällig hier den Fehler erkennst und mir sagen kannst wie ich es umstellen müsste, wäre das sehr nett.

<script>
          
               // Setzen der Variablen url und hinschreiben des aktuellen Strings der vom Formular kommt 
      
    var url = window.location.href; 

     // zerschneiden der Stringübergabe vom Formular, für jedes Feld im Formular nötig! 
    
      var id = Date();

      var KISTE = /formmunitionskiste=([^&]+)/.exec(url)[1]; 
      var HERSTELLER = /formhersteller=([^&]+)/.exec(url)[1]; 
      var STUECKZAHL = /formstueckzahl=([^&]+)/.exec(url)[1]; 
      var KALIBER = /formkaliber=([^&]+)/.exec(url)[1]; 

alert("Es wird die folgende Munition eingetragen: " + KISTE + HERSTELLER + " mit " + STUECKZAHL + " Stück, vom Kaliber " + KALIBER);
      
      
var db = openDatabase('MUNITION', '1.0', 'Munitionsübersicht', 2 * 1024 * 1024);
          
             db.transaction(function (tx) {
    
 tx.executeSql('INSERT INTO' + KISTE +  '(id,hersteller,stueckzahl,kaliber) VALUES (?,?,?,?)'),[id, HERSTELLER,STUECKZAHL,KALIBER];         
                 
    alert("OK! Munition in " + KISTE + " eingefügt!");
    
});
      

     
      </script>

Ich habe schon einiges ausprobiert, aber in der Tabelle kommen keine Inhalte an.

Die alert liefern den korrekten Wert.

22.09.2016 14:35

18 Jörg Kruse

Die Query ist fehlerhaft:

    tx.executeSql("SELECT tbl_name, sql from DATENBANK WHERE type = 'table'"), [],

Hinter dem from kommt der Tabellenname, nicht der Datenbankname! und die Tabelle, in der die Meta-Daten der anderen Tabellen stehen, heisst sqlite_master

    tx.executeSql("SELECT tbl_name, sql from sqlite_master WHERE type = 'table'"), [],

22.09.2016 15:04 | geändert: 22.09.2016 15:04

19 Jörg Kruse

Hier fehlen wieder die Leerzeichen vor und hinter dem Hochkomma:

tx.executeSql('INSERT INTO ' + KISTE +  ' (id,hersteller,stueckzahl,kaliber) VALUES (?,?,?,?)'),[id, HERSTELLER,STUECKZAHL,KALIBER];

22.09.2016 15:07

20 Kokarde

Hi Jörg

War bissle offline.

Antwort zu 26:

Jetzt hab ich das mit sqlite_master verstanden.
Darin stehen die Tabelleninfos, man braucht also überhaupt nicht die DB direkt anzusprechen, wie z. B. in MySQL. Danke!

Und ich kann den * nutzen um dann alle Inhalte anzusprechen?

Da wo vor dem Eintragen eine Ausgabe der Vorhanden Tabellen kommen soll, die ich ja vorher wissen muss, sieht es jetzt so aus:

CODE

<script>
          
              var db = openDatabase('MUNITION', '1.0', 'Munitionsübersicht', 2 * 1024 * 1024);
              
          db.transaction(
  function(tx) {
   tx.executeSql("SELECT *, sql from sqlite_master WHERE type = 'table'"), [],
    function(tx, results) {
      var len = results.rows.length;
      var i;
      for (i=0; i<len; i++) {
        alert(results.rows.item(i).tbl_name);
        alert(results.rows.item(i).sql);
      }
    }
  }
);
          
          
          </script>   

Ich habe im Moment eine Datenbank = MUNITION
Darin enthalten, durch ein funktionierendes Insert = eine Tabelle = KISTE1

Eigentlich müsste jetzt das auch so ausgegeben werden, oder?

Ich erhalte aber keine Ausgabe und auch keine Fehlermeldung in der Console!

Idee?

26.09.2016 15:19