Sqlite Zeile Ansprechen
Me
- php
0 Pete0 Alex0 Me0 dedlfix0 Me0 Vinzenz Mai0 Me0 Vinzenz Mai0 Me
0 dedlfix
Hi,
ich schreibe gerade an einer Art PHPMYADMIN für SQLite (mit definitv weniger funktionen^^). Das Programm ist derzeit soweit, dass es bis jetzt jede von mir getestete SQLite-db wie folgt ausgibt:
Jetzt gibt es das Problem: Wie lösche ich einen Eintrag?
Das ganze Programm ist natürlich so Allgemein wie möglich gehalten, d.h. ich kann jetzt nicht nach dem Schema gehen: Suche nach ID-Eintrag X und lösche/editiere Zeile mit ID eintrag = X.
Meine Datenbanken enthalten zwar IMMER eine ID, dennoch würde ich es gerne so handhaben, dass ich nicht vorrausetzen muss, dass eine ID vorhanden sein muss, da ich das Programm auch dazu nutzen will, andere SQLite-Tabellen zu Analysieren. Und vllt benutze der Ersteller der Tabellen nicht ID-Einträge.
Hoffe ich konnte mein Problem klar machen und hoffe auch (wie ich es von dem Forum gewohnt bin ;-) ) auf schnelle & konstruktive Antwort.
Hi,
ich schreibe gerade an einer Art PHPMYADMIN für SQLite (mit definitv weniger funktionen^^).
warum das Rad neu erfinden?
http://www.hotscripts.com/Detailed/33986.html
Nur eine einzige Datei, klasse Hilfsmittel.
Versteh immer noch nicht warum das so wenig bekannt ist.Leider.
Ich hatte selbst mal die gleiche Idee wie du und fand dann aber durch sehr mühsames Suchen und vielen schlechten Tools das hier. Hier konnte ich sehr effektiv draus lernen und entsprechend meinen Bedürfnissen anpassen.
Pete
Hallo,
ich schreibe gerade an einer Art PHPMYADMIN für SQLite
Bevor Du das Rad neu erfindest: schau Dir mal SQLiteManager an.
Alex
ähm, mir ist klar das es soetwas gibt. Habe es jetzt (noch) nicht heruntergeladen. Zudem hatte ich schon 2 Sqlite-administrier-programme, die beide Script-fehler enthielten (fatale! sie waren nicht ausführbar).
Und dann beantwortet das immernoch nicht meine Frage =( . Auch wenn es dafür schon etwas gibt, will ich mein Projekt dennoch fertig stellen
ähm, mir ist klar das es soetwas gibt. Habe es jetzt (noch) nicht heruntergeladen. Zudem hatte ich schon 2 Sqlite-administrier-programme, die beide Script-fehler enthielten (fatale! sie waren nicht ausführbar).
Und dann beantwortet das immernoch nicht meine Frage =( . Auch wenn es dafür schon etwas gibt, will ich mein Projekt dennoch fertig stellen
Nochmals Hi,
du hast meine Intention nicht richtig verstanden.
Du hast schon 2 programme getestet und dich geärgert weil die nicht richtig funktionieren. Ging mir genau so und wollte es dann partout selbst machen.
Dem steht aber auch nichts im Wege, ich habe dich nur auf das programm hingewiesen, weil du sehr schnell daraus lernen kannst um deines anzufertigen oder entsprechend das heruntergeladene anzupassen.
Deine letzte Frage https://forum.selfhtml.org/?t=177605&m=1170153 hatte ich auch und gelöst hatte ich seher schnell mit dem Code des Programms. Also sehr lehrreich. So findest in diesem Code Beispiel für fast alle Fragen die du hier noch stellen würdest.
Nun zu deiner eigentlichen Frage. Wie soll man die denn beantworten wenn die Frage nicht mal richtig klar ist, ein konkretes Beispiel wäre nicht schlecht. Du willst allso Einträge löschen ohne vorhandene ID? Ja getreu SQL-Syntax sqlite>DELETE FROM music WHERE Title LIKE 'Heino%';
Oder verstehe ich deine Frage falsch?
Pete
Nun zu deiner eigentlichen Frage. Wie soll man die denn beantworten wenn die Frage nicht mal richtig klar ist
Ok, also ich wills nochmal neu versuchen zu erklären.
stell dir vor ich schau mir eine Fremde SQLite-DB an und die hat z.B. folgende Felder:
NAME
INHALT
DATUM
dann steht in der Übersicht z.B.
NAME | INHALT | DATUM (<-- Also das hier sind die Felder)
-----|-----------|-------
karl |Hallo du da| Heute (<-- Und das die Einträge)
-----|-----------|------
heinz|Moin | Heute (<-- Und das auch die Einträge)
So.
jetzt will ich z.B. die erste Zeile löschen. Klar: jetzt könnte ich beim SQLite-Syntax:
DELETE * FROM XYZ WHERE NAME='karl';
schreiben, oder ich schreiben
DELETE * FROM XYZ WHERE DATUM='Heute';
klar. 2teres ist unlogisch wenn man folgendes nicht beachtet: Ich weis bei meiner Allgemeinen folge NICHT was später in den Feldern steht. Das heist mein Algorythmus könnte eventuell genau das Feld DATUM auswählen. Und genau dann hab ich ein Problem, denn er löscht mir ja dann alle Felder mit DATUM=HEUTE.
Also muss ich irgendwie die Zeile anders auswählen. Und ich dachte, man kann ja mittels sqlite_seek() zu einer Zeile springen...also müsste man diese doch auch iwie bestimmen können?!
Hallo,
Und dann beantwortet das immernoch nicht meine Frage =( . Auch wenn es dafür schon etwas gibt, will ich mein Projekt dennoch fertig stellen
Schau doch mal, wie phpMyAdmin das macht: wenn eine Spalte mit Primärschlüssel vorhanden ist, nimmt es diese zur Identifikation (DELETE FROM ... WHERE db.table.ID = ... LIMIT 1), wenn nicht, werden alle Werte angegeben: DELETE FROM ... WHERE db.table.column1 = 'foo' AND db.table.column2 = 'bar' AND db.table.column3 = 'foobar' And ... ... LIMIT 1
Alex
Schau doch mal, wie phpMyAdmin das macht:(...) wenn nicht, werden alle Werte angegeben: DELETE FROM ... WHERE db.table.column1 = 'foo' AND db.table.column2 = 'bar' AND db.table.column3 = 'foobar' And ... ... LIMIT 1
keine schlechte Idee, werde mal versuchen das in mein Script einzubauen.
echo $begrüßung;
Jetzt gibt es das Problem: Wie lösche ich einen Eintrag?
Mit DELETE, wie üblich. Die Frage sollte wohl eher lauten: Wie identifiziere ich einen Datensatz eindeutig?
Meine Datenbanken enthalten zwar IMMER eine ID, dennoch würde ich es gerne so handhaben, dass ich nicht vorrausetzen muss, dass eine ID vorhanden sein muss, da ich das Programm auch dazu nutzen will, andere SQLite-Tabellen zu Analysieren. Und vllt benutze der Ersteller der Tabellen nicht ID-Einträge.
Er setzt auf seine Spalte(n) mit dem Primärschlüssel, egal wie er sie nennt, den Primary Key Index. Ermittle diese Spalte(n), dann ist der Datensatz eindeutig identifizierbar. Ansonsten mach es wie der phpMyAdmin in dem Fall: Nimm alle Feldinhalte in die WHERE-Klausel und limitiere den Löschvorgang auf einen Datensatz. Hmm — scheint nicht vorgesehen zu sein, dass man bei DELETE ein LIMIT angeben kann. In dem Fall hat der Anwender Pech gehabt, denn wenn er keinen PK definiert, hat er das gleiche Problem beim Löschen wie du in deinem Admin-Tool.
echo "$verabschiedung $name";
ok?
Jetzt gibt es das Problem: Wie lösche ich einen Eintrag?
war eine Zusammenfassung des vorher dargestellten Problemes.
Und insgesamt kann ich eigentl. nur sagen: du hast hier nur wiederholt was entweder vorher mal gesagt wurde ODER was ich als Problem angegeben habe ;-) aber trotzdem danke für die Mühe. Und der Anwender letzendl. bin ich und ich will aber kein Pech haben
Hallo,
Und insgesamt kann ich eigentl. nur sagen: du hast hier nur wiederholt was entweder vorher mal gesagt wurde ODER was ich als Problem angegeben habe ;-) aber trotzdem danke für die Mühe. Und der Anwender letzendl. bin ich und ich will aber kein Pech haben
Beantworte Dir bitte ein paar Fragen:
Wenn ein Datensatz nicht eindeutig identifizierbar ist, hast Du ein Problem.
Wieviele solcher Datensätze musst Du infolgedessen übrig behalten?
Kannst Du es derzeit in SQLite mit DELETE allein lösen?
Mit welchem Workaround kämst Du dennoch zum Ziel?
Fragende Grüße
Vinzenz
Beantworte Dir bitte ein paar Fragen:
Wenn ein Datensatz nicht eindeutig identifizierbar ist, hast Du ein Problem.
deswegen hab ich mich ja hier an das Forum gewandt
Kannst Du es derzeit in SQLite mit DELETE allein lösen?
Hab das Problem jetzt gelöst, indem ich jeden Datensatz in WHERE schreibe
Hallo,
Wenn ein Datensatz nicht eindeutig identifizierbar ist, hast Du ein Problem.
deswegen hab ich mich ja hier an das Forum gewandtKannst Du es derzeit in SQLite mit DELETE allein lösen?
Hab das Problem jetzt gelöst, indem ich jeden Datensatz in WHERE schreibe
Wenn es nun zwei gleiche Datensätze gibt? Dann sind beide weg ...
Wieviele müssen jedoch übrig bleiben?
Wie wäre es bei 10 gleichen Datensätzen?
Ich frage daher nochmals:
Kannst Du dies mit DELETE allein lösen?
Freundliche Grüße
Vinzenz
Wenn es nun zwei gleiche Datensätze gibt? Dann sind beide weg ...
Wieviele müssen jedoch übrig bleiben?
Wie wäre es bei 10 gleichen Datensätzen?
9 sollten dann noch übrig bleiben
Ich frage daher nochmals:
Kannst Du dies mit DELETE allein lösen?
Theoretisch ja. Es habert nur leicht an der Idendifaktion der Zeilen. Habe es jetzt damit gemacht, dass ich alle Felder mit Inhalt angebe, welche ich Löschen will(ist halt nur problematisch, wenn 2 einträge zufällig gleiche einträge haben). Ich hatte gehoft, jmd hier im Forum könnte mir sagen, SQLite für jeden Eintrag eine Konstante beifügt(also sowas wie ein PK), welche immer gleich ist und über diese ich dann Einträge idendifizieren könnte.
Hallo,
Theoretisch ja. Es habert nur leicht an der Idendifaktion der Zeilen.
warum liest Du nicht das Handbuch?
Freundliche Grüße
Vinzenz
echo $begrüßung;
Und insgesamt kann ich eigentl. nur sagen: du hast hier nur wiederholt was entweder vorher mal gesagt wurde ODER was ich als Problem angegeben habe ;-) aber trotzdem danke für die Mühe.
Worauf ich hinaus wollte: Der Primary Key ist zwar oftmals "ID" benannt, aber das muss ja nicht so sein. Ermittle den Namen der Primary-Key-Spalten aus der von SQLite zur Verfügung gestellten Schema-Information. Dazu kann man die spezielle Tabelle sqlite_manager abfragen. Leider gibt es die Schema-Information nur in Form eines CREATE-TABLE-Kommando-Strings. Den müsstest du parsen, um daraus den PK-Namen zu erhalten. Was bei SQLite auch nicht geht, und ich vorher falsch annahm ist, den PK über mehr als eine Spalte zu legen.
Und der Anwender letzendl. bin ich und ich will aber kein Pech haben
Tja, ohne PK gibt es als eindeutigen Anfasser nur noch ... Unique-Keys, wenn einer gesetzt ist, wollt ich grad schreiben, aber gut dass Vinzenz lesen kann :-) und auf ROWID verwies. Besser gehts ja gar nicht.
echo "$verabschiedung $name";