Formular und Datenbank

maba

Angesehenes Mitglied
Hallo und Guten Tag!

Ich war nun schon länger nicht mehr hier. Aber endlich bin ich dazugekommen etwas zu programmieren und schon sind wieder Probleme aufgetaucht... Ich hoffe, hier ist alles beim Alten und ich erhalte so kompetente Hilfe wie früher! ;-)

Folge zwei Fragen:
1. Ich habe ein Formular um Einträge in eine Datenbank zu machen. Nun möchte ich eigentlich, dass die eingefüllten Daten im Formular bleiben, wenn es nicht vollständig ausgefüllt ist und trotzdem abgesendet wird. Dies funktioniert auch. Doch nun habe ich eine Liste mit Radio-Buttons für die Wahl aller Kantone. Muss ich nun für alle 26 Kantone eine if-Abfrage machen, ob es cheched ist? Oder gibt es eine elegantere Lösung?

2. Die Kantone werden mit anderen Stichworten, durch Leerschläge getrennt, als Tags gespeichert. Frage ich nun den Kanton Uri ab, so werden mir auch die Einträge zu Zürich angezeigt. Hat jemand einen Vorschlag, wie man dies lösen könnte? Vielleicht gibt es eine schönere Lösung als Zuerich mit ue zu schreiben.
CODE $abfrage = "SELECT `id`, `usw` FROM tabelle WHERE `tags` LIKE '%STICHWORT%' ORDER BY `id` DESC";


So, ich hoffe, ich habe mich klar genug ausgedrückt. Ich Danke schon mal für jegliche Hilfe. Und Ihr wisst ja, das schönste an Zürich ist das Üri!!!
biggrin.gif
 
QUOTE Muss ich nun für alle 26 Kantone eine if-Abfrage machen, ob es cheched ist? Oder gibt es eine elegantere Lösung?


Wenn Du die Kantone in einer Datenbank speicherst und dynamisch ausliest, ja. Ansonsten: nein.


QUOTE Frage ich nun den Kanton Uri ab, so werden mir auch die Einträge zu Zürich angezeigt. Hat jemand einen Vorschlag, wie man dies lösen könnte?


Berücksichtige auch das Trennzeichen in dem Statement.


CODE $abfrage = "SELECT `id`, `usw` FROM tabelle WHERE `tags` LIKE '% STICHWORT %' ORDER BY `id` DESC";
 
Zu 1:

Ja gibt es, mal als Beispiel, ich würde natürlich immer dazu raten eher Templates zu nutzen, statt direkte Ausgabe. Der Vorteil sollte wohl eigentlich auf der Hand liegen, aber hier wird klar mit einer Schleife gearbeitet was eleganter, als wenn man einzelne IF-Abfragen schreibt, aber viel wichtiger ist die Whitelist-Filterung der Eingabevariable.

CODE /* Liste der Katone */
$katone = array(
  'katon1',
  'katon2',
  'katon3'
);


/* Whitelist-Validierung */
if ( !is_string($_POST['katon']) || !in_array($_POST['katon'], $katone) )
{
  exit('parameter manipulation entdeckt');
}


/* Vorbereitung der Ausgabe */
$output = '';
for ( $i = 0; $i < count($katone); $i++ )
{
  $output .= '<input type="radio" name="katon" value="' . $katone[$i] . '"';
  if ( $katone[$i] === $_POST['katon'] )
  {
     $output .= ' checked="checked"';
  }
  $output .= ' /><br />' . "\n";
}


/* Ausgabe */
echo $output;



Zu 2:
Für mich hört sich das eher nach einen Fehler im Datenbankdesign an, ich würde eher anders vorgehen bei der Speicherung von Tags.
 
QUOTE (maba @ Mo 10.05.2010, 19:50) 2. Die Kantone werden mit anderen Stichworten, durch Leerschläge getrennt, als Tags gespeichert. Frage ich nun den Kanton Uri ab, so werden mir auch die Einträge zu Zürich angezeigt. Hat jemand einen Vorschlag, wie man dies lösen könnte? Vielleicht gibt es eine schönere Lösung als Zuerich mit ue zu schreiben.

CODE $abfrage = "SELECT `id`, `usw` FROM tabelle WHERE `tags` LIKE '%STICHWORT%' ORDER BY `id` DESC";



Wie Sascha schon sagte ... garnicht gut


CODE WHERE `tags` LIKE '%STICHWORT%'

Das ist ganz ganz "böse"

Wieviele Datensätze kommen da mal zusammen?
mit diesem "Like" werden immer alle Datensätze durchsucht

Kanton = Bundesland ?

Stelle sicher das diese Info immer die Erste Info in dieser DatenCelle ist
und mach dann

CODE WHERE `tags` LIKE 'STICHWORT %'

1. das linke % weg, dadurch kann beim Suchen der (vorhandene?) Index genutzt werden

2. hab ich da nen Leerzeichen angehängt, zwischen Stichwort und dem rechten %
Problem ....
gibt es auser Stichwort nichtsmehr, wird es das Leerzeichen auch nicht geben
= Die Suche funktioniert nicht
( beim reinschreiben das Leerzeichen einfach anhängen funktioniert vielleicht auch nicht .... SQL löscht da die leerzeichen .... aber nicht auf beiden Seiten, sondern nur das linke oder das rechte und ich weiss jetzt nicht welches)

Warum hab ich das Leerzeichen eingefügt, wenn es doch zu einem Problem werden kann?
Weil es ohne das Leerzeichen auch ein Problem geben kann
z.B.

Sachsen
Sachsen-Anhalt

CODE WHERE `tags` LIKE 'Sachen %'

findet nur Sachen

CODE WHERE `tags` LIKE 'Sachen%'

würde auch Sachsen-Anhalt finden, was ja nicht erwünscht wird
ob diese Problematik bei dir ( Kantone vs Bundesland ) überhaupt auftreten kann weiss ich nicht ....
( aber nur mal so für den Hinterkopf, für Andere Fälle )

solltest vielleicht mit "Komma" trennen in der DB
da kannst Du auch sicher sein das es dort ist und nicht weggelöscht wird von SQL
also

CODE WHERE `tags` LIKE 'Sachen,%'

 
Vielen Dank für eure Hilfe. Wie schon angetönt bin ich (noch) kein Profi.

Das mit den Kantonen hat so funktioniert und auch die Abfrage der Tags habe ich nun so hingebracht, wie ich es wollte. Es ist nicht ganz einfach, weil es so viele Möglichkeiten in PHP gibt und jedes Buch/Anleitung anders vorgeht.

Danke trotzdem. Vorerst sind meine Fragen beantwortet, aber es kommen sicherlich noch weitere...
smile.gif


Und übrigens, wenn ihr schreibt, dass etwas gar nicht gut ist, habe ich nicht viel davon. Macht doch auch gleich Lösungsvorschläge, wie man es besser lösen könnte.
 
Die bessere Lösung bestünde darin, die Tags in eine eigene Randtabelle zu separieren:

ID Bezeichnung
1 Zürich
2 Üri
3 keine Ahnung :)

und dann eine Verknüpfungstabelle vk zu füllen

ID TagId HauptdatensatzId
1 2 1

ordnet der HauptdatensatzId 1 das Tag Üri zu.

Dann kann man bei der Suche direkt in der Randtabelle mit = suchen, ohne Like.

Das verknüpft liefert dann die zugeordneten Einträge.

QUOTE Select A.Id, A.Bezeichnung
From Haupttabelle As A
Where A.Id In
(Select B.HauptdatensatzId From vk As B Inner Join Tags As C On B.TagId = C.ID
Where C.Bezeichnung = @Variable)


Dann womöglich in der Verknüpfungstabelle noch beide Spalten indiziert - dann ist das fix.
 
Zurück
Oben