Textabfrage

strolch_007

Mitglied
Hallo,

ich habe habe in mysql ein Textfeld "blumen" angelegt in diesem sind jetzt z.B Rosen,Tulpen,Nelken (genau so ohne Freizeichen nach dem Komma) abgespeichert..
Jetzt möchte ich nach z.B. nur Tulpen abfragen.
Diese DB-Abfrage --->

PHP:
<?php
.
.
.
$sql = "SELECT blumen FROM datei
              Where id = '".$_SESSION['UserID']."'
             AND blumen= '".mysql_real_escape_string(trim($_POST['blumen']))."'
";

funktioniert nur insoweit, als dass logischerweise nur ein richtiges Ergebnis ausgegeben wird, wenn nur eine Blumenart z.B: Rosen abgespeichert wurde. Wie frage ich nun nach explizit nur einer Blumenart ab, egal wieviele Blumen im Feld stehen.
Ist hier evtl. substr, strlen, like oder eine Kombination von den ersten beiden mein Freund? Mir fehlt da irgendwie so der richtige Plan für die Anwendung im SELECT. Handbuch Mysql ist bekannt hilft mir aber irgendwie nicht so richtig weiter. Bei google hab ich so lustig ne stunde lang rum gesucht. Sowas sucht aber scheinbar keiner. Wer kann mir einen kleinen Denkanstoss (gegen ne fertige Lösung wehre ich mich auch nicht :-) ) geben?

Gruss
strolch_007
 
Zuletzt bearbeitet:
In einem Feld solltest du besser nicht mehrere Werte abspeichern, wenn du die Datenbank nach diesen Werten durchsuchen willst, das macht das Datenbankkonzept etwas kaputt.
Wie funktioniert dein Konzept denn genau?
Nehmen wir an du magst zu jedem Benutzer verschiedene und beliebig viele Blumen abspeichern, dann solltest du so vorgehen:
Eine Tabelle mit den Benutzern:
ID, Name, Passwort, etc...
1 Fritz pwd
2 Peter blume
Dann legst du als nächstes eine Tabelle mit den Blumen an
id Name Eigenschaft Größe, etc
1 Tulpe gelb 1,7m
2 Rose rot 20cm
Und schlussendlich eine Tabelle mit den Zuordnungen
userID blumenID
1 1
1 2
2 2
Dann hast du die Möglichkeit mit JOIN Anweisungen nach allem zu fragen was du willst.
Du kannst: blumen und eigenschaften abfragen, userdaten abfragen, user die eine bestimmte blume haben, alle user einer Blume, alle Blumen eines Users,....
Das müsstest du dann mit JOIN Anweisungen lösen, die solltest du in dem Buch auch finden.
Bin mir nciht sicher, ob es genau das ist was du machen willst.

Viele Grüße
 
Hallo Marius Heil,

das mit dem join ist mir bekannt, aber auf meine "Geschichte" soweit ich weiß nicht anwendbar. Bei mir alles in EINER Tabelle! Natürlich habe ich auch id, Name usw. vergeben. Wollte nur den Rahmen hier nicht sprengen und setze das einfach mal als gegeben voraus.

Ich mach mal ein anschauliches Beispiel:

Fritz mag Rosen, Tulpen und Nelken. Also gibt Fritz in das entsprechende Feld (input) die 3 Begriffe ein und speichert sie ab. In der Datenbank finden wir nun im Feld "blumen" Rosen,Tulpen,Nelken.

Peter mag nur Tulpen. Nach der entsprechenden Eingabe und Abspeicherung finden wir nun in der Datenbank bei "blumen" "Tulpen".

Und jetzt kommt Elfriede auf die Seite und sucht Menschen die Tulpen mögen (vollkommen egal ob männlich oder weiblich). Also gibt sie in das entsprechende Suchfeld (input ) "Tulpen" ein.

Elfriede findet aber nur Peter als Tulpenliebhaber (Suchergebnis = 1), was ja falsch ist, weil bei Fritz ja auch Tulpen in der DB steht.

Es geht also darum wie ich an eine Abfrage per SELECT komme, wenn mehr als ein Begriff in einem DB-Feld steht, wobei die Reihenfolge der Einträge beliebig ist und auch ständig wechseln kann. Peter kann sich ja z. B: ab Morgen entscheiden noch Veilchen zu seinen Lieblingsblumen einzutragen. - Darum auch Textfeld in der DB wegen der evtl. Größe (Menge der Einträge).

Gruss

strolch_007
 
Zuletzt bearbeitet:
Um es kurz zu fassen: das was Marius Hell dir vorgeschlagen hat, ist genau das, was du suchst.

Nach seinem Beispiel sehen die drei Tabellen in etwa so aus:
dat_nutzer
Code:
 id | Nutzername
----|------------
 01 | Fritz
 02 | Peter
 03 | Elfriede

dat_blumen
Code:
 id | Blumenart
----|-----------
 01 | Rosen
 02 | Tulpen
 03 | Nelken
 04 | Veilchen

rel_nutzer_blumen
Code:
 id_nutzer | id_blumen
-----------|-----------
 01        | 01
 01        | 02
 01        | 03
 02        | 02
 01        | 04

Das würde dein Beispiel wunderbar darstellen. Ich hoffe, dass meine Tabellennamen verständlich sind, denn so benenne ich meine immer. Der Suffix dat ist für Tabellen, welche "Daten" enthalten, und der Suffix rel steht für Relationen zwischen Tabellen.
 
hallo,

In einem Feld solltest du besser nicht mehrere Werte abspeichern, wenn du die Datenbank nach diesen Werten durchsuchen willst, das macht das Datenbankkonzept etwas kaputt.

Verstehe ich nicht. Was macht das kaputt? ich benutze Textfomrat in der DB. Kannst mir das mal etwas konkreter erläutern?

Wie funktioniert dein Konzept denn genau?

Hier mal mein Konzept:

PHP:
        	// 2. Tabelle: BlumenCheckboxen
		echo $tabstart . "\"tab002_interests\"" . $tab001;
		
		echo $tr001;
		echo $tdclass ."\"td001_interests\">" . $input_check . "name=\"blumen[]\" ";
		if (is_array($blumen) && in_array('Rosen', $blumen) ) echo $checked_01;
		echo "value=\"Rosen\" />" . $td002;
		echo $tdclass . "\"td002_interests\"Rosen" . $td002;
.

Ich habe mich jetzt aus verschiedenen Gründen für Checkboxen entschieden.
Da es sich um eine größere Tabelle handelt arbeite ich mit Platzhaltern.

Das Update der DB sieht folgendermaßen aus.

PHP:
    	if(isset($_POST['submit']) AND trim($_POST['submit']) == 'Blumen ändern'){ 
        	if ( isset($_POST['blumen']) ? 1 : 0) {
	
			$blumen= $_POST['blumen'];
		
			$blumen= implode(",",$blumen);
	
			$sql = "UPDATE xxxxxxxx  
                                      SET blumen='".mysql_real_escape_string($blumen)."'
			              WHERE  id = '".$_SESSION['UserID']."'
                   "; 
				   
     mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error()); 	
  		
	}
    }

Ausgelesen wird das Ganze dann mit einfachem SELECT und explode.

Die Abfrage (Suchfunktion) sieht dann wie folgt aus:

PHP:
                          $sql = " SELECT blumen FROM xxxxxx
                           WHERE  id = '".$_SESSION['UserID']."'
                           AND blumen LIKE '%".$_POST['blumen']."%'
                      ";

Der Vorschlag mit den 3 Tabellen in der DB incl. JOIN ist auch sehr gut, aber ich hofffe mit meinem auch etwas auf Gegenliebe zu stoßen. Wie gesagt benutze ich für all das nur 1 DB-Feld, nämlich blumen (spare somit 2 Tabellen). Ich finde diese (meine) Lösung auch etwas kürzer, bin allerdings für Kritik offen. Insbesondere falls ich was wichtiges übersehen habe.

Gruss
strolch_007

PS: Die kleinen Verschiebungen im Quelltext möge man mir nachsehen, komm nicht so ganz mit dem Editor hier zu Schusse:-)
 
Zuletzt bearbeitet:
Angesichts der Tatsache, dass ich mal ein Problem auf gleiche Weise lösen wollte und dann doch überzeugt wurde, kann ich dir nur den Hinweis geben, den mir damals kuddeldaddeldu gab: normalisieren
 
Zuletzt bearbeitet:
@strolch: Mit kaputt machen meine ich, dass du damit am Datenbankkonzept vorbeiarbeitest, der Link von crack könnte da weiterhelfen. Da ich nie Fachbücher über SQL gelesen habe kann ich jetzt gerade nicht mich Fachbegriffen um mich werfen. Dafür habe ich ein komplettes Browserspiel programmiert, das sollte mir einiges an Erfahrung verschafft haben ;-)
Datenbanken sind auf bestimmte Datenstrukturen optimiert. Wenn eine Datenbank weiß, dass du in jedem Feld nur einen Integer mit 8 Byte länge speicherst kann die Datenbank in null komma nichts anhand der ID eines Feldes zu dem gewünschten Ergebnis springen. Für andere Spalten kann ein Index angelegt werden. Das heißt: Die Datenbank legt sich beispielsweise ein alphabetisches Inhaltsverzeichnis aller Namen ab, jeweils mit den korrekten Addressen wie zu dieser Reihe gesprungen werden kann.
Wenn du für jede Person zB Rosen abspeicherst kommt es bei deinem Konzept zu einer Verfielfachung der Informationen. Du musst immer sagen: Rosen, Rosen, Rosen, nochmal Rosen,...
Wenn du hingegen in einer Blumentabelle die Rosen abspeicherst musst du immer nur sagen: id2, id2, id2,... Außerdem hast du dann die Möglichkeit zb eine Farbe für die Rosen anzugeben ohne diese jedes mal mit abzuspeichern.
Eventuell ist das hier leichter Erklärt: http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
Die Artikel haben blöderweise meist die Angewohnheit ein sehr einfaches Konzept mit vielen unnötig verkomplizierten Fachwörtern zu umschreiben, also nicht abschrecken lassen ;-)
 
Hallo,

also ich hab jmir jetzt da meine Gedanken zu gemacht und bin zu dem klaren Schluß gekommen das ihr beide wohl recht habt und ich mein ganzes DB-gedöns einfach umbauen werde. Leuchtet mir alles ein was ihr geschrieben habt und ist sicher (bei meiner "schönen Version") auch ein extremer Geschwindigkeitsverlust (bei größeren DB'en). Eigentlich schade, weil ich mir das doch sooo schön ausgedacht habe.
Danke euch beiden das ihr euch mit mir beschäftigt habt.

Gruss
strolch_007
 
Zurück