Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Javascript: WebSql

Mitglied: internet2107

internet2107 (Level 1) - Jetzt verbinden

16.12.2018, aktualisiert 11:06 Uhr, 2679 Aufrufe, 17 Kommentare

Guten Morgen zusammen,

zunächst einmal einen schönen dritten Advent.

Ich habe ein Problem mit Javascript und WebSQL. Bisher habe ich folgende Dinge immer im local Storage abgelegt, gespeichert und bei Bedarf wieder abgerufen.
Ich würde das gerne etwas "moderner" machen und die Daten in WebSQL ablegen.
Das Ablegen der Daten klappt. Nur die Abfrage und das Rückschreiben nicht.

Folgender Code wird für local Storage verwendet.
01.
//Speichern der Daten:
02.
$('#button_save_profil1').on('click', function(){
03.
$('input[type="text"]').each(function(){    
04.
var name_save_txt_p1 = ('profil1_' + $(this).attr('name') );
05.
var id_save_txt_p1 = ('profil1_' + $(this).attr('id') );
06.
var value_save_txt_p1 = $(this).val();
07.
localStorage.setItem(name_save_txt_p1, value_save_txt_p1);
08.

09.
//erweitert, Daten werden zus. per WebSQL gespeichert
10.
db_gehalt.transaction(function (tx) {tx.executeSql("INSERT INTO Profil1 (Bezeichnung,value) VALUES (?, ?)", [name_save_txt_p1, value_save_txt_p1], null); }); 
11.
});  
12.
});
Ab hier wird die Abfrage gemacht, die Daten wieder aus dem local Storage geholt, bzw. soll auch WebSQL gelesen werden.
Anschließend werden die Werte auch jeweils wieder in die Felder geschrieben (bei local Storage)

01.
$('#button_load_profil1').on('click', function(){
02.
$('input[type="text"]').each(function(){    
03.
var name_load_txt_p1 = 'profil1_' +  $(this).attr('name');
04.
// var value_load_txt_p1 = localStorage.getItem(name_load_txt_p1); //Abfrage von local Storage wegen WebSQL ausgeklammert. 
05.

06.
// Datenbank auslesen
07.
var value_load_txt_p1 = db_gehalt.transaction(function(tx) {
08.
	tx.executeSql('SELECT Wert1 FROM Profil1', [], function(tx, rs) {
09.
		var len = rs.rows.length;
10.
	  for (var i = 0; i < len; i++) { 
11.
		var rowid1 = rs.rows.item(i). Wert1;
12.
		console.log(rowid1);
13.
	}
14.
	});
15.
  });
16.
// Datenbank auslesen ende
17.

18.
$(this).val(value_load_txt_p1);
19.
}); 
20.

21.
});
Mein Problem ist, dass die Abfrage der Tabelle irgendwo falsch ist. Vielleicht habe ich auch große Knöpfe auf den Augen und sehe den Fehler nicht.
Klicke ich den Button zum "laden" der Daten, läuft das in eine Endlosschleife und der Browser hängt sich auf.

Was ist daran falsch?
Mitglied: yamaha0815
16.12.2018 um 10:25 Uhr
Kann sein, dass ich jetzt Unfug schreibe, jedoch ist "value" meist ein Schlüsselwort und könnte auch so interpretiert werden, d.h. es wird nicht als Variablenparameter interpretiert sondern eben als Schlüsselwort und damit schafft man sich eben Probleme.
Nenn also die Spalte in der DB um, sofern diese "value" heißt und ändere dahingehend auch dein INSERT und dein SELECT um. Es sollten hier keine möglichen Schlüsselwörter der nachfolgend verwendeten Programmier- und Abfragesprache Anwendung finden.

Hast du auch mal geprüft, ob die Daten auch korrekt in der Datenbank stehen (externer Datenbrowser)?
Bitte warten ..
Mitglied: internet2107
16.12.2018 um 11:09 Uhr
Ich habe es mal geändert, also von "value" nach "Wert1" und es macht keinen Unterschied.

Ja, die Daten kommen einwandfrei in der Tabelle an.
Sieht so aus, Beispiel:

01.
rowid         Bezeichnung               Wert1
02.
1             profil1_beispiel1         0.00
03.
2             profil1_beispiel2         0.50
04.
Bitte warten ..
Mitglied: yamaha0815
16.12.2018, aktualisiert um 11:22 Uhr
Hast du dies auch in deiner SELECT Abfrage angepasst oder steht da noch irgendwas von "value" drin?

PS.. OK siehe Script oben. Alles klar.

Was steht denn in der Variable zur Zeilenanzahl? Diese soltte ja auf 2 Elemente hindeuten. Im übrigen ist "len" auch oftmals ein Schlüsselwort.
Bitte warten ..
Mitglied: internet2107
16.12.2018 um 12:16 Uhr
wie gesagt. Lässt man das Script oben so laufen, hängt sich der Browser auf.
Da das console.log eingeschaltet ist, sieht man ja, dass es eine Dauerschleife ist und nicht endet.

Kurz: Wie ich es drehe und wende, ich finde den Fehler leider nicht.
Bitte warten ..
Mitglied: yamaha0815
16.12.2018 um 13:14 Uhr
...und was steht nun in der Variale "len"? Diese setzt sclhußendlich die Abbruchbedingung der Schleife, Kann diese überhaupt erreicht werden und was passiert innerhalb der Schleife? Debugger?

Wo hängt das Ding denn überhaupt?
Bitte warten ..
Mitglied: internet2107
16.12.2018 um 14:45 Uhr
Hallo,

sieht man doch oben im Code?

Hier nochmal der Ausschnitt.
01.
var len = rs.rows.length;
Es ändert aber nichts an der Tatsache, dass es nicht klappt. Egal wie man sie nennt. Selbst wenn ich da nun "var len1 = rs.rows.length;" draus mache.

Das Ding hängt nicht, sondern es ist eine Endlosschleife und ich sehe nicht den Fehler warum.

Nochmal zum Verständnis. Exakt dieselben Werte stehen so auch in "local Storage". Beim Auslesen des local Storage und zurückschreiben in die jeweiligen Felder klappt alles ohne Probleme. Genauso wie das Umschalten einer z.B. Checkbox.

Das alles soll nun von local Storage auf WebSQL geändert werden, sprich der local Storage soll abgeschaltet werden.
Das Schreiben in die SQL_DB klappt ja ohne Fehler. Nur das Auslesen und zurückschreiben aus der DB klappt nicht.
Ich habe wahrscheinlich ein riesen Brett vor dem Kopf und sehe den Fehler nicht
Bitte warten ..
Mitglied: yamaha0815
16.12.2018, aktualisiert um 15:07 Uhr
Alles gut Kollege, ich will dir ja nix böses.

Was spuckt die Konsole denn aus?
Hast du schon mal den Wert deiner Stopbedingung geprüft, also was steht denn nun in "len" drinn? Lies diesen Wert doch einfach mal aus und lass dir diesen auf der Konsole anzeigen.
Prüf nochmal deine {} und () ob das alles passt und vor allem an der richtigen Stelle sitzt.

Wenn das in eine Endlosschleife geht, dann wird entweder die Abbruchbedingung nicht erreicht oder diese ist gar nicht vorhanden.
Bitte warten ..
Mitglied: internet2107
16.12.2018, aktualisiert um 15:25 Uhr
auch alles gut
Ich weiß, ich sehe das auch nicht als "Böse".

Ich habe mal ein Console.log auf das "len" gesetzt". Er Spuckt "1458" aus, was wiederum genau die Anzahl der Reihen in der DB beträgt.
Bitte warten ..
Mitglied: yamaha0815
16.12.2018 um 15:39 Uhr
Du meinst wohl Zeilen in der DB, oder?

Fütter die DB doch mal nur mit 5 wohl definierten Zeilen und versuch diese auszulesen.

In "len" müsste dann 5 stehen.
Gib auch mal die Laufvariable i mit aus, damit man sieht wie diese incrementiert wird.

Evtl. auch mal len um 1 vor der Schleife incrementieren und als Abbruchbedingung != setzen. Sobald i = len ist sollte die Schleife der logik nach ja abrrechen, weil eben die Abbruchbedingung erreicht ist.
Bitte warten ..
Mitglied: 137846
16.12.2018, aktualisiert um 18:03 Uhr
var rowid1 = rs.rows.item(i). Wert1
Tippfehler (Leerzeichen zwischen . und Property)!
'SELECT Wert1 FROM Profil1'
Du weist aber schon wie Selects funktionieren?
Normalerweise sieht dieser ja meist so aus wenn man einen bestimmten Eintrag holen möchte:
01.
SELECT Name,Wert FROM TABELLE WHERE Name = 'feldXYZ'
Und überhaupt, wieso setzt du auf ein totes Pferd WebSQL??

Gruß A.
Bitte warten ..
Mitglied: yamaha0815
16.12.2018, aktualisiert um 18:15 Uhr
Also bei einem Tippfehler würde sich der Interpreter beschweren und anscheinend wird die Variable trotzdem irgendwie bedient. Deswegen drängte ich ja auch drauf, dass man den Wert hier auch mal mit den Zeilen in der DB verifiziert.

Eine where clause ist nicht norwendig, sofern man keine Einschränkungen macht. Hier wird eben einfach der gesamte Tabelleninhalt bzw. alle Zeilen zurück gegeben. Daran soll es nicht liegen.

Da die Frage nun den Status gelöst hat.. was war es denn?
Bitte warten ..
Mitglied: 137846
16.12.2018, aktualisiert um 18:28 Uhr
Zitat von yamaha0815:
Eine where clause ist nicht norwendig, sofern man keine Einschränkungen macht. Hier wird eben einfach der gesamte Tabelleninhalt bzw. alle Zeilen zurück gegeben. Daran soll es nicht liegen.
Macht dann aber bei der Zeile:
$(this).val(value_load_txt_p1);
wenig Sinn . Ich denke er will ja die Felder alle wieder mit Ihrem Inhalt bestücken. Und bei jedem Feld alle Einträge der DB zu durchlaufen ist auch nicht sinnvoll.
Vermutlich entspricht das was da oben steht schon lange nicht mehr dem tatsächlichen Stand seines jetzigen Codes.

Da die Frage nun den Status gelöst hat.. was war es denn?
Vermutlich wieder nur verklickt, wie immer ...
Bitte warten ..
Mitglied: yamaha0815
16.12.2018 um 19:35 Uhr
Naja, wer weiß was da in this drin steht. Wir wissen es ja nicht.
Ist ja auch nicht weiter relevant, wenn der Code in einer Endlosschleife hängt, oder?

Fragen wir doch den TS bzw. geben ihm Zeit zu antworten.
Bitte warten ..
Mitglied: internet2107
17.12.2018, aktualisiert um 11:16 Uhr
Guten Morgen.

Ja, aus Versehen verklickt. Demnach noch nicht gelöst, leider.

Die Zeile "$(this).val(value_load_txt_p1);" bedeutet, dass hier immer der Wert zurückgeschrieben wird, werden soll.
"this" ist in diesem Moment das "<input value="hier_kommt_der_Wert_hinein">"

Der "Tippfehler" ist beim hineinkopieren hier im Textfeld passiert. Im Original gibt es keine Leerzeile "var rowid1 = rs.rows.item(i).Wert1"
Aber auch mit "Tippfehler = Leerzeile" läuft das ohne Probleme durch..


Ich sehe das Problem an einer anderen Stelle, weiß aber nicht, wie ich es umsetzen soll.
Denn nochmal: Mit dem local Storage klappt es seit Jahren fehlerfrei.

Das Problem sehe ich persönlich in der doppelten Schleife.
Ausschnitt aus Code oben:

01.
 // Hier beginnt Schleife 1
02.
$('input[type="text"]').each(function(){   
Und hier beginnt Abfrage der DB
01.
 // Hier beginnt Schleife 2
02.
	  for (var i = 0; i < len; i++) {  
Hier nochmal zum Verständnis und besseren Überblick der Code, wie er eigentlich logisch sein sollte. Eigentlich.
01.
$('#button_load_profil1').on('click', function(){
02.
$('input[type="text"]').each(function(){    
03.
 db_gehalt.transaction(function(tx) {
04.
	var value_load_txt_p1 = tx.executeSql('SELECT Wert1 FROM Profil1 where Bezeichnung like "profil1_text_%" ')
05.
$(this).val(value_load_txt_p1 );
06.
 });
07.
  });
08.
}); 
Klickt man also den Button, rennt die erste Schleife los und soll aus der Tabelle aus jeder Zeile den Wert aus der Spalte "Wert1" nehmen, wenn in der Spalte "Bezeichnung" die Vorgabe "profil1_text%" gegeben ist.
Mache ich es so, passiert nichts.

Erst wenn ich diese zweite Schleife der DB selbst einbaue, macht er die Abfrage. Dann aber rennt sich das Ganze tot.

01.
$('#button_load_profil1').on('click', function(){
02.
$('input[type="text"]').each(function(){    
03.
var value_load_txt_p1 = db_gehalt.transaction(function(tx) {
04.
	tx.executeSql('SELECT Wert1 FROM Profil1 where Bezeichnung like "profil1_text_%" ', [], function(tx, rs) {
05.
		var len = rs.rows.length;
06.
	  for (var i = 0; i < len; i++) { 
07.
		var rowid1 = rs.rows.item(i). Wert1;
08.
		console.log(rowid1);	}
09.
	});
10.
  });
11.
$(this).val(value_load_txt_p1);
12.
}); 
13.
});
Darum belasse ich es einfach beim local Storage und verwerfe die Idee mit der DB.
In jedem Fall einen schönen Tag.
Bitte warten ..
Mitglied: 137846
17.12.2018, aktualisiert um 12:12 Uhr
Zitat von internet2107:
Die Zeile "$(this).val(value_load_txt_p1);" bedeutet, dass hier immer der Wert zurückgeschrieben wird, werden soll.
Wissen wir.
Ich sehe das Problem an einer anderen Stelle, weiß aber nicht, wie ich es umsetzen soll.
Denn nochmal: Mit dem local Storage klappt es seit Jahren fehlerfrei.
Hat ja auch nichts mit WebSQL zu tun.

Das Problem sehe ich persönlich in der doppelten Schleife.
Ausschnitt aus Code oben:

Hier nochmal zum Verständnis und besseren Überblick der Code, wie er eigentlich logisch sein sollte. Eigentlich.
01.
> $('#button_load_profil1').on('click', function(){
02.
> $('input[type="text"]').each(function(){    
03.
>  db_gehalt.transaction(function(tx) {
04.
> 	var value_load_txt_p1 = tx.executeSql('SELECT Wert1 FROM Profil1 where Bezeichnung like "profil1_text_%" ')
05.
> $(this).val(value_load_txt_p1 );
06.
>  });
07.
>   });
08.
> }); 
09.
> 
Klickt man also den Button, rennt die erste Schleife los und soll aus der Tabelle aus jeder Zeile den Wert aus der Spalte "Wert1" nehmen, wenn in der Spalte "Bezeichnung" die Vorgabe "profil1_text%" gegeben ist.
Mache ich es so, passiert nichts.
Ist ja auch logisch denn tx.executeSql gibt ja auch nichts zurück, also ist die Variable value_load_txt_p1 leer!

Nö, hier ein simples Beispiel, das rennt in Chrome testweise einwandfrei:

01.
// db öffnen
02.
var db = window.openDatabase("myDB","1.0","my database",5*1024*1024);
03.
db.transaction(function(tx){
04.
    // Tabelle erstellen wenn es sie noch nicht gibt
05.
    tx.executeSql("SELECT name from sqlite_master WHERE type='table' AND name='mysettings'",[],function(tx,results){
06.
        if(results.rows.length == 0){
07.
            // Tabelle erstellen
08.
            console.log("Creating table with demo entries.");
09.
            tx.executeSql("CREATE TABLE mysettings (name,val)");
10.
            // Demo-Daten erstellen
11.
            tx.executeSql("INSERT INTO mysettings (name,val) VALUES (?,?)",['Setting1','Value1']);
12.
            tx.executeSql("INSERT INTO mysettings (name,val) VALUES (?,?)",['Setting2','Value2']);
13.
        }
14.
        console.log("Showing all entries in table mysettings:");
15.
        tx.executeSql("SELECT * FROM mysettings",[],function(tx,results){
16.
            for (i = 0; i < results.rows.length; i++){
17.
                console.log(results.rows.item(i).name + " : " + results.rows.item(i).val);
18.
            }
19.
        });
20.
    });
21.
});
Darum belasse ich es einfach beim local Storage und verwerfe die Idee mit der DB.
Wenn db dann IndexedDB, WebSQL ist tot ...

Gruß A.

p.s. Den Status einer Frage kann man zurücksetzen! Lese dazu https://administrator.de/faq/32
Status der Frage zurücksetzen
Wurde ein Beitrag aus Versehen als "gelöst" markiert, kann dies durch Klicken auf "Bearbeiten" im Ursprungs-Beitrag, und dann durch Entfernen des Hakens bei "Diese Frage gilt als gelöst" in der rechten Navigation unter Optionen, wieder zurückgenommen werden.
Bitte warten ..
Mitglied: internet2107
17.12.2018 um 13:24 Uhr
Danke für die Antwort und den Code.
Nur: Was bringt es? Soweit war und bin ich auch und habe es auch schon geschrieben, dass die einfache Abfrage läuft, Ausgabe in die Console.
Dort sehe ich alle Werte. Es bringt aber nichts, weil nichtsdestotrotz nichts in die jeweiligen Felder zurückgeschrieben wird.
Einzig darum geht es.

Nun ja, egal. Ich begrabe das Thema.
Bitte warten ..
Mitglied: 137846
17.12.2018, aktualisiert um 13:41 Uhr
Nun du schreibst in deinem zweiten Beispiel ja gar nichts in die Variable value_load_txt_p1 also kann dort dann auch nichts landen und auch nichts im Feld landen.
Und das hier
var value_load_txt_p1 = db_gehalt.transaction(function(tx)
geht ja nun überhaupt nicht weil die Funktion nichts zurückliefert! Du musst die Daten im Callback zuweisen und dort ins Feld schreiben, nicht außerhalb. Bedenke das sind asynchrone Funktionen!

Das berühmte Brett vorm Kopf ...

p.s. Gerade aktuell:
https://www.golem.de/news/datenbank-fehler-in-sqlite-ermoeglichte-codeau ...
Noch ein Grund die Finger davon zu lassen.
Bitte warten ..
Ähnliche Inhalte
JavaScript
Javascript Funktionen
gelöst Frage von agowa338JavaScript5 Kommentare

Hallo, habe gerade mehrere schönen Javascripte per mail bekommen und frage mich gerade, was eigentlich folgendes in einem Javascript ...

JavaScript
JavaScript Map
Frage von tobmesJavaScript7 Kommentare

Hi, ich bins mal wider :). Ich spiele immernoch mit JavaScript herum und hänge jetzt mal wieder. Ich habe ...

JavaScript
JavaScript hochladen
gelöst Frage von Patrick-ITJavaScript12 Kommentare

Hallo zusammen, ich bin auf der Suche nach einer Seite, wo ich meine JavaScript Datei hochladen kann und die ...

JavaScript
Javascript Array
gelöst Frage von internet2107JavaScript2 Kommentare

Ich habe folgendes Problem. Ersetze ich die folgenden Zahlen gegen Variablenwerte, bekomme ich nicht das Ergebnis, wie mit festen ...

Neue Wissensbeiträge
LAN, WAN, Wireless
OPNsense Captive Portal mit vordefnierten Voucher
Tipp von Crusher79 vor 7 StundenLAN, WAN, Wireless

Hallo, Ziel war es vorhandene Klienten-Daten (Nummer im System) und Kennwörter anzulegen. Voucher werden durch externes Programm in Papierform ...

Administrator.de Feedback
Entwicklertagebuch: Die nächste Version
Information von admtech vor 1 TagAdministrator.de Feedback6 Kommentare

Hallo Administrator User, vielleicht haben es einige User schon mitbekommen: Wir arbeiten aktuell an einer komplett neuen Version von ...

Windows Server

Active Directory ESE Version Store Changes in Server 2019

Information von Dani vor 4 TagenWindows Server

Moin, Last month at Microsoft Ignite, many exciting new features rolling out in Server 2019 were talked about. But ...

Exchange Server

Microsoft Extending End of Support for Exchange Server 2010

Information von Dani vor 4 TagenExchange Server5 Kommentare

Moin, After investigating and analyzing the deployment state of an extensive number of Exchange customers we have decided to ...

Heiß diskutierte Inhalte
Netzwerkgrundlagen
Zukunftsicheres Heimnetzwerk aufbauen
Frage von CRO-WarriorNetzwerkgrundlagen16 Kommentare

Hallo Leute. Ich bin dabei das Haus in Kroatien zu renovieren. Da hab ich jetzt die Möglichkeit alles so ...

Router & Routing
Anmeldung am Router von einer ext. IP?
Frage von BigSnakeyeRouter & Routing14 Kommentare

Hallo, ich habe gerade seltsames in meiner Fritzbox entdeckt. Plötzlich war die Verbindung unterbrochen - kein Internet. Also habe ...

Windows Server
Windows Domäne, SBS 2011, Anmeldung als Admin nicht mehr möglich
Frage von big-dummyWindows Server14 Kommentare

Hallo, vorab: ich habe nun leider keine Grundruhe mehr - die Folgen wären katastrophal. Was ist das Problem: Ich ...

KVM
Performance Verlust durch Virtualisierung
Frage von RalleoniusKVM12 Kommentare

Hallo zusammen, ich überlege meinen Server mit Debian, der als Webserver dient zu virtualisieren um eine 2te Maschine auf ...