Datalis mit mehren 'Option value' Werten - Browserselektion einschränkbar?

#1
Hallo zusammen,
ich fülle eine Datalist mit einer sql-abfrage, und zeige mehrere Felder in der Auswahlliste an. Mein Problem ist, dass der Browser bei der Eingabe eines Zeichens alle angezeigten Option value - Felder zum Vergleich heranzieht. Lässt sich das anpassen ? Bsp:
... sql abfrage definition ...
PHP:
<datalist id="idx">
<?php
$sqlr = "SELECT id, Name, Ort, Strasse FROM Adress order by Name" ;
$resultr = mysql_query($sqlr) OR die(mysql_error());
while($rowfthr = mysql_fetch_assoc($resultr)) {
  $idfthr = $rowfthr["id"];
  echo "<option value= $idfthr>".$rowfthr["Name"]. ' - ' .$rowfthr["Ort"]. ' - ' .$rowfthr["Strasse"]. "</option>";
}
?>
</datalist>
Wenn man nun im Input 'an' eingibt, zeigt er alle Datensätze in der Auswahlliste an, die entweder im Namen, im Ort oder in der Strasse die Buchstabenkombination 'an' beinhalten. Ich möchte aber, dass nur das Feld "Name" zum Vergleich herangezogen wird. Gleichwohl sollen aber alle 3 Felder in der Liste angezeigt werden.
Hab bisher leider keine Antwort drauf gefunden, evt weil google meine Frage nicht versteht....


Danke für alle Tipps, Franz
 

merzi86

Erfahrenes Mitglied
#2
Ein Datalist durchsucht nunmal das komplette innerhtml und da steht bei dir nunmal alle 3 Eingaben.

Was du probieren könntest wäre ein JavaScript, was die Standard Event abbricht (Stichwort preventDefault)
und dann musst du "manuell" die Liste durchsuchen und die Optionen, in dem in den Ersten Bereich
der Suchbegriff nicht vorkommt werden einfach versteckt.

Ob dies allerdings wirklich so funktioniert kann ich dir nicht versprechen.
Habe das noch nie probiert.

Desweiteren alle mysql_* Funktionen sind als Deprecated markiert und wurden in PHP7 komplett entfernt.
Also am besten jetzt schon abgewöhnen mit diesen Funktionen zu arbeiten, da dies in naher Zukunft nicht mehr funktionieren wird.
 
#3
Hallo merzi,
Danke. und ja, ich bin grad dabei den alten Code umzustellen, und dabei hab ist mir das mit der Datalist noch aufgestossen. Aber da scheint es wirklich keine einfache Lösung zu geben. Was html5 mit datalist bietet ist an sich schon sehr gut, wie manche Browser das interpretieren ist stellenweise genial (Fire) bis katastrophal (saf). In meinem Fall eben doof, wenn man nur mit einem Feld arbeiten möchte. Wenn man zig tausende von Adressen in der DB hat, viele in einem Nest wohnen, dass 'dorf' im Ortsnamen enthält und du suchst jemanden der Dorfner heisst... Bis zur Eingabe der ersten 4 Stellen ist die Liste Müll. Aber egal, muss man eben mehr Zeichen eingeben.
 

Alice

Erfahrenes Mitglied
#4
Vielleicht habe ich die Frage nicht verstanden aber probier das mal aus...

PHP:
<?php
   $sqlr = "SELECT * FROM Adress WHERE Name LIKE '%an%' ORDER BY Name" ;
   $resultr = mysql_query($sqlr) OR die(mysql_error());


   echo '<datalist id="idx">'."\n";

   while($rowfthr = mysql_fetch_assoc($resultr))
   {
       $idfthr = $rowfthr["id"];
       echo "<option value= $idfthr>".$rowfthr["Name"]. ' - ' .$rowfthr["Ort"]. ' - ' .$rowfthr["Strasse"]. "</option>";
   }

   echo '</datalist>'."\n";
?>
 

merzi86

Erfahrenes Mitglied
#5
Eine andere Idee wäre es doch die eine Liste in 3 aufzuteilen.

Als erstes Wählt man die Gemeinde aus, in der 2. dem Gemeindeteil (Stadtgebiet bzw. das jeweilige Dorf) und in der Dritten dann die Straße.
Die 2. und 3. Liste kann man ja nach den Auswahl Kriterien der vorher gehenden Liste filtern.
 
#6
Danke merzi, aber eine where Klausel hilft hier nicht weiter. Zur Erklärung, das Formular besteht aus mehreren Felder. Eben ein Adresseingabe. Eine per SQL vorgefüllte Datalist hat den Vorteil, dass während der Eingabe des Namens bereits alle Namen vorgefiltert aufgelistet werden, die (zumindest bei firefox) den eingegebenen Wert irgendwo beinhalten. (IE prüft nur ab Beginn, safari kann es gar nicht). Wenn nun in den Option Values zugleich Ort und Strasse angezeigt werden, kann man wesentlich bestimmter erkennen, ob der eingegebene Name bereits vorhanden ist, und kann eine erkannte Person auswählen, ansonsten füllt man auch die restlichen Felder aus, und die Adresse wird angelegt. Andererseits listet Firefox aber auch Namen auf, die den eingegebenen Wert im Orts- oder Strassennamen beinhalten, weil Strasse und Ort in den Option values enthalten sind, um angezeigt werden zu können.
Also, wenn ich als Name "Jäger" eingebe, dann werden auch alle Personen aufgelistet, die in einer "Jägerstrasse" wohnen, und wenn deren Name mit einem Buchstaben vor J beginnt, rutschen die vorhandenen Jäger in der Liste u.U. weit nach unten, und die Liste wird unnötig lange. Da der Name als erstes Feld eingegeben wird, hat man noch nichts für eine where Klausel.
Die Datalist wurde eben seiner Funktionalität gewählt, weil man hier mit einem einzigen Eingabefeld einen Mehrfachnutzen erziehlt. Ein vollwertiges Eingabefeld mit einer dynamisch gefilterten Select-Liste.
 
#8
Danke, sieht gut aus. Aber für mich als Anfänger ist das wohl noch etwas zu komplex. Werd mich aber da mal einlesen, evt krieg ich es hin. Da mein Problem html seitig wohl nicht zu lösen ist schliesse ich das Thema mal.
 
#10
Halb-OT

Was html5 mit datalist bietet ist an sich schon sehr gut, wie manche Browser das interpretieren ist stellenweise genial (Fire) bis katastrophal (saf)
Da bist du wohl noch sehr genügsam

Ich hab heute 5 Stunden vergeudet, bis ich eingesehen habe, dass Inputs mit Datalist in "keinem" meiner getesteten 8 Browser irgendwie zufriedenstellend funktionieren. 30KB JS dazupacken, nur dafür, war am Ende die bessere Lösung (jQuery-UI, per Konfigurator nur das Nötigste)

Dass HTML 2016 noch immer keine Combobox hat, die nicht komplett offen für Interpretation ist was es eigentlich sein soll, ist schon irgendwie traurig.