php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.01.2011, 22:10  
Erfahrener Benutzer
 
Registriert seit: 15.10.2005
Beiträge: 231
Dilandau kann nur auf Besserung hoffen
Standard Vorgehensweise für Auswahlformular von 10 aus 1000 oder mehr Datensätzen?

Hellau,

Ich möchte dem Benutzer auf meiner Website komfortabel eine Auwahl von ca 10 Personen aus einer Datenbanktabelle mit mehr als 1000 Personen (ID, Name) ermöglichen. Das soll über die Eingabe der Anfangsbuchstaben Ihrer Namen geschehen, wobei dazu dann vom Programm her Vorschläge gemacht werden, welche Person mit vollem Namen das sein könnte. Es sollte im Prinzip genauso funktionieren wie die Eingabe der Beitrags-Tags hier in diesem Forum. Wenn ein paar Buchstaben eingegeben sind, soll eine Auswahl aufklappen, aus der man eine mögliche Person auswählen kann. Wenn man dann alle gewüschten Personen ausgewählt hat und auf OK klickt, sollen die IDs der gewählten Personen in eine neue Tabelle geschrieben werden. Ein Problem gibts noch dabei: wenn man nur einen Buchstaben ein gibt, kann es sein, dass es immernoch unüberschaubar viele mögliche Personen gibt ... und zur Abrundung des ganzen: zum Anfang der Auswahl sollen bereits ein paar Personen vor-ausgewählt sein können, die man dann auch aus der Auswahl entfernen können soll.

Wie kann sowas gemacht werden oder welche Alternativen gibt es und wie?
danke,
ags
__________________
mobilis in mobili
Dilandau ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.01.2011, 22:28  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Autosuggest, Autocomplete ...

z.B.
http://code.drewwilson.com/entry/aut...-jquery-plugin
http://docs.jquery.com/UI/Autocomplete
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 19.01.2011, 22:44  
Erfahrener Benutzer
 
Registriert seit: 15.10.2005
Beiträge: 231
Dilandau kann nur auf Besserung hoffen
Standard

Muss ich vorher alle 1000 Namen in ein Array lesen?
__________________
mobilis in mobili
Dilandau ist offline   Mit Zitat antworten
Alt 19.01.2011, 22:46  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Kannst du, musst du aber nicht. Kannst die Eingabe auch per AJAX abfeuern und dann nur die passenden Treffer zurückschicken. Ich zeig immer maximal 10 an.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 19.01.2011, 23:43  
Erfahrener Benutzer
 
Registriert seit: 15.10.2005
Beiträge: 231
Dilandau kann nur auf Besserung hoffen
Standard

Wie schlimm ist es, wenn ich bis zu 20000 Namen aus der Datenbank in ein array lade? wird das langsam oder zu speicherintensiv?
__________________
mobilis in mobili
Dilandau ist offline   Mit Zitat antworten
Alt 20.01.2011, 08:02  
Erfahrener Benutzer
 
Registriert seit: 15.10.2005
Beiträge: 231
Dilandau kann nur auf Besserung hoffen
Standard

Ich habe mir die Beispiele durchgeschaut und auch ausführlich nach "autocomplete" gesucht aber eines scheint allen varianten gemeinsam zu sein: ich brauche das ergebnis der eingabe als IDs der gewählten namen, nicht als volltext.

ps: ich kann auch nicht ausschließen, dass es namen doppelt gibt, die aber intern schon unterscheiden werden sollen.

pps: vielleicht gibts noch eine ganz andere lösung für mein problem an die ich noch nicht gedacht habe?
__________________
mobilis in mobili

Geändert von Dilandau (20.01.2011 um 08:31 Uhr).
Dilandau ist offline   Mit Zitat antworten
Alt 20.01.2011, 08:56  
Erfahrener Benutzer
 
Registriert seit: 08.10.2009
Beiträge: 681
PHP-Kenntnisse:
Anfänger
Harry_X befindet sich auf einem aufstrebenden Ast
Standard

du solltest dein problem besser mal genauer analysieren:

du brauchst auf user-seite ja nicht nur die Eingabe einer Zeichenkette, sondern auch die Option, die Anzeige zu modifizieren sowie eine Art übernehmen button, denk ich mal, denn du willst die Auswahl in eine Liste übernehmen.
Andererseits ist das o.g. genau das Thema, das du probieren solltest, denn bitte welcher user guckt sich denn 1000 Namen durch?
Dann sieht das zB so aus:

user will ne auswahl treffen:
1. leere liste/table generieren
2. gemäß der "null"-Auswahl zB die "default"-names anzeigen lassen (->SQL)
mach mehrmals:
{3.1. user kickt einen der defaults raus -> blacklist anlegen
3.2. user gibt Buchstabe #n ein
4. SQL muß, falls list oder blacklist existiert, als irgendein join ausgeführt werden
5. erneute Ausgabe }

so oder so ähnlich. Vielleicht kann man die list auch in eine Session schreiben, aber wie o.a. willst du ja eh ne table draus machen
Harry_X ist offline   Mit Zitat antworten
Alt 20.01.2011, 10:23  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Dilandau Beitrag anzeigen
Ich habe mir die Beispiele durchgeschaut und auch ausführlich nach "autocomplete" gesucht aber eines scheint allen varianten gemeinsam zu sein: ich brauche das ergebnis der eingabe als IDs der gewählten namen, nicht als volltext.
Ja, das ist zugegeben etwas ungünstig programmiert, du kannst allerdings Metaangaben übernehmen und den onSelect/select-Handler des Autocomplete dazu nutzen, aus diesen Metaangaben die ID des Eintrags zu ermitteln.

Siehe:
http://docs.jquery.com/UI/Autocomplete#event-select

Hier mal ein Codeschnipsel von mir, vielleicht hilft es ja:
Code:
	window.gf.autocomplete = {
		init: function(dialogJ) {
			// find all input elements with "autocomplete" css class
			var autocompletesJ = $('input.autocomplete', dialogJ);
			autocompletesJ.each(function(i, node) {
				var autocompleteJ = $(this);
				// parse our payload data in virtual attribute "gf_autocomplete"
				// f.e. gf_autocomplete = {url:'example/test.php',hiddenJ:'input#test_id'}
				var payload = $.parseJSON(autocompleteJ.attr('gf_autocomplete'));
				autocompleteJ.removeAttr('gf_autocomplete');
				autocompleteJ.bind('keyup blur', function() {
					// if the user is clearing the input field, we want to clear
					// the hidden-id element as well, which makes the behaviour more intuitive
					if ($(this).val().length == 0) {
						$(payload.hiddenJ).val('');
					}
				});
				autocompleteJ.autocomplete({
					// add autocomplete functionality
					source: function(event, add) {
						// use AJAX as resource
						$.getJSON(
							payload.url,
							event,
							function(json) {
								// gather result
								var suggestions = [];
								$.each(json.response, function (i, object) {
									// required JSON response is
									// f.e. {response:[{label:'example',id:1},{label:'test',id:2}]}
									suggestions.push({
										label: object.label,
										id: object.id,
										object: object
									});
								});
								
								add(suggestions, false);
							}
						);
					},
					
					// when selecting an autocomplete suggestion, the label
					// is not relevant, use id instead and write it back to the element
					// provided as selector in payload.hiddenJ
					select: function(event, ui) {
						var hiddenJ = $(payload.hiddenJ, dialogJ);
						hiddenJ.val(ui.item.object.id);
						return true;
					}
				})
			});
		}
	};
Die AJAX-Antwort:
Code:
{"version":"1.0","success":true,"command":"autocomplete","response":{"61":{"id":61,"team_id":null,"name":"*** BI Test Accounts","type":null,"color":null,"edited":"2011-01-19 18:37:43","created":"2011-01-19 18:37:43","label":"*** BI Test Accounts"}},"timestamp":"2011-01-20T10:20:50+01:00"}
Das ist jetzt zwar zum Initialisieren von Autocomplete in <div> Layern (Dialogbox) aber sollte bei dir ähnlich umzusetzen sein. Ich hole mir aus dem Texteingabefeld ein Attribut (gf_autocomplete), darin ist JSON-Code, der die URL und das ID-Feld bestimmt. Das ID Feld ist das Hiddenfeld, in das die ID des Autocompletewertes später geschrieben wird. Die Eingabe wird dann mit dem Suchwort an die URL geschickt, die Antwort (json.response) entsprechend entgegengenommen, die label-Eigenschaft ins Texteingabefeld übernommen und die id-Eigenschaft ins Hiddenfeld.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 20.01.2011, 13:29  
Erfahrener Benutzer
 
Registriert seit: 15.10.2005
Beiträge: 231
Dilandau kann nur auf Besserung hoffen
Standard

Um mein Problem genauer zu spezifizieren: nun will ich es so machen, dass man einen namen eingeben kann und dass der vervollständigt wird. und zwar jeweils nur 1 namen. wenn man dann enter drückt, soll der name in einer liste rechts daneben aufgenommen werden.

Ich habe einen Code gefunden, mit dem ich soweit recht zufrieden bin. Den habe ich mal hier ausgestellt: http://janeway.quicktunnels.net/autosuggest/

leider blicke ich noch nicht ganz durch und bräuchte Hinweise:

- wo wird der eingabetext verglichen, so dass ich die funktion dahingehend abändern kann, dass gross- und kleinschreibung egal wird

- wie füge ich meine IDs (jede person in der datenbank hat eine ID) an die auswählbaren items? ich brauche nur einen rückgabewert: die numerische position des items im eingabearray (da kann ich dann die ID auslesen, den namen und evtl noch das land)

Und noch eine kleine sache: was ist eine gescheite lösung um die tabelle der ausgewählten personen in der datenbank nach den änderungen im frontend abzugleichen? soll ich die DB tabelle leeren und neu füllen mit den IDs die ich ausgewählt habe?

danke
__________________
mobilis in mobili
Dilandau ist offline   Mit Zitat antworten
Alt 20.01.2011, 16:47  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Ehrlich gesagt blicke ich bei deiner Problembeschreibung überhaupt kein bisschen durch.

Ich habe mir selber ohne JQuery als Übung (war ne Praktikumsaufgabe) so ein autocomplete anhand von Postleitzahlen und dazugehörigen Städten programmiert. Die Vorgehensweise ist da ja die selbe.

Ich gebe eine 0 ein und die Liste erstellt sich mit allen PLZ in der DB die mit 0 anfangen, dann gehts immer so weiter. Das autocomplete ändert sich je mehr Zahlen eingegeben werden und dazu werden auch die Städte angezeigt.

Wenn ich dann auf einen Datensatz klicke werden Formularfelder ausgefüllt.

Wenn du den Namen in der Liste haben willst dann musst eben mittels DOM die Liste entsprechend manipulieren.

Hier mal mein kleiner bescheidener Code, wie gesagt an meiner Aufgabe eben spezifisch.

Code:
function createXMLHttpRequest () {
    var req;
                
    if ( window.XMLHttpRequest ) {
        try {
            req = new XMLHttpRequest();
        } catch ( e ) {
            req = false;
        }
    } else if ( window.ActiveXObject ) {
        try {
            req = new ActiveXObject( "Microsoft.XMLHTTP" );
        } catch ( e ) {
            req = false;
        }
    }
            
    return req;
}
Code:
function setRequestForCitySearch () {
    var ajaxRequest = new createXMLHttpRequest();
    var zipValue = document.getElementById( "zipCode" ).value;
    var requestString = "?zip=" + zipValue;
    
    //document.getElementById( "testShow" ).lastChild.nodeValue = zipValue;
    
    ajaxRequest.onreadystatechange = function () {
        
        if ( this.readyState == 4 && this.status == 200 ) {
            
            if ( zipValue.length > 0 ) {
                document.getElementById( "zipAndCity" ).style.display = "block";
                document.getElementById( "zipAndCity" ).innerHTML = ajaxRequest.responseText;
            } else {
                document.getElementById( "zipAndCity" ).style.display = "none";
                document.getElementById( "cityName" ).value = '';
            }
        }
    }
        
    ajaxRequest.open( "GET", "LIT_ReadCityData_Class.php" + requestString );
    ajaxRequest.send( null );
}

/*
*
*    funktion wählt datensatz aus den funden aus
*
*/
var selectCity = function ( pEvent ) {
    pEvent = pEvent || window.event;
    var target = pEvent.target || pEvent.srcElement;
    var zipCity = target.lastChild.nodeValue.split( " " )[0];
    var city = target.lastChild.nodeValue.substring( zipCity.length, target.lastChild.nodeValue.length );
    
    document.getElementById( "zipCode" ).value = zipCity;
    document.getElementById( "cityName" ).value = city;
    document.getElementById( "zipAndCity" ).style.display = "none";
}
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
    <head>
        <script type="text/javascript" src="ajax_req.js"></script>
        <script type="text/javascript" src="city_search.js"></script>
        
        <script type="text/javascript">
            window.onload = function () {
                document.getElementById( "zipCode" ).onkeyup = setRequestForCitySearch;
                document.getElementById( "zipAndCity" ).onclick = selectCity;
            }
        </script>
    </head>
    <body>
        <div>
            <input id="zipCode" type="text" name="zip" value="" />
            <div id="zipAndCity" style="display: none; width: 200px; border: 1px solid #000000;"></div>
            <br />
            <input id="cityName" type="text" name="city" value="" />
            <br />
            <input id="loadButton" type="button" name="send" value="Sendens" />
        </div>
        <div id="testShow" style="display: none; width: 200px; border: 1px solid #000000;">
        </div>
    </body>
</html>
PHP-Code:
<?php
error_reporting
E_ALL E_STRICT);
ini_set"display_errors"TRUE);

/*
*
*    PDO Instanz
*
*/
$pdo = new PDO"mysql:host=localhost;dbname=city_search""root" );
$pdo->exec"SET CHARACTER SET utf8" );

class 
LIT_ReadCityData_Class {
    
    protected 
$pdo;
    protected 
$num_ZipCode;
    protected 
$arr_CityByZipCodes = array();
    
    
/**
     *
     *    Konstruktor
     *    @param $num_ZipCode:numeric vonAjax übergebene Postleitzahl
     *
     */
    
public function __construct $num_ZipCodePDO $pdo ) {
        
$this->pdo $pdo;
        
$this->num_ZipCode $num_ZipCode;
    }
    
    
/**
     *
     *    
     *
     */
    
protected function loadCitysByZipCodes () {
        
$sql_ReadCitys "
                        SELECT
                            zc.zip_code,
                            cbz.id_city,
                            cbz.id_zip,
                            cbz.city
                        FROM
                            zip_codes zc
                        RIGHT JOIN
                            citys_by_zip cbz
                        ON
                            ( zc.id_zip = cbz.id_zip )
                        WHERE
                            zc.zip_code LIKE CONCAT(:zip,'%')
                        "
;
        
$sel_PrepareRC $this->pdo->prepare$sql_ReadCitys );
        
$sel_PrepareRC->bindParam":zip"$this->num_ZipCode );
        
        if ( 
$sel_PrepareRC->execute() ) {
        
            while ( 
$res_Citys $sel_PrepareRC->fetchPDO::FETCH_ASSOC ) ) {
                
$this->arr_CityByZipCodes[] = array(
                                                        
'zip_code' => $res_Citys['zip_code'], 
                                                        
'city' => $res_Citys['city']
                                                    );
            }
            
            return 
$this->arr_CityByZipCodes;
        }
    }
    
    public function 
getCityAndZipCodes () {
        return 
$this->loadCitysByZipCodes();
    }
}

//nur für testausgaben
if ( isset( $_GET['zip'] ) ) {
    
$zip $_GET['zip'];
}

$test = new LIT_ReadCityData_Class$zip$pdo );
$arr_citysByZip $test->getCityAndZipCodes();

//print_r( $arr_citysByZip );

//header( ' ', TRUE, 200 );

foreach ( $arr_citysByZip as $key => $value ) {
    echo 
'<p id="'.$arr_citysByZip[$key]['city'].'">';
        echo 
$arr_citysByZip[$key]['zip_code'];
        echo 
' ';
        echo 
$arr_citysByZip[$key]['city'];
    echo 
'</p>';
}
?>
Vieleicht kannst du damit ja etwas anfangen. Es steckt nun keine super Datenstruktur etc. dahinter, weil dies nur eine Übungsaufgabe war. Also habe ich die Dateien etc. auf das nötigste beschränkt.

Wenn Fragen hast dann frag.

Gruß Litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Vorgehensweise Kontrolle von Abhängigkeiten coola PHP Einsteiger 9 21.01.2011 11:20
[Erledigt] Problem mit number_format wenn zahl über 1000 geht litterauspirna PHP Tipps 2008 12 20.11.2008 20:26
MySQL/PHP: Löschen von Datensätzen ajo_silent PHP Tipps 2005-2 8 03.08.2005 17:00

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
auswahlformular html, php auswahl formular, php auswahlformular, auswahl formular php, jquery select aufklappen, jquery autocomplete abhängigkeiten zwischen den feldern, autosuggest drew wilson object, jquery autocomplete anfangsbuchstaben, html auswahlformular, auswahlformular php, jquery autocomplete 1 zeichen, postleitzahl autovervollständigen javascript, abhängigkeit select und autocomplete, jquery autocomplete soll nur anzeigen anfangsbuchstaben, ajax php auswahl formular, jquery ui autocomplete deutsche orte, auswahl formulare mit php, php auswahl aufklappen, jquery formular ausklappen, ajax autofill auswahl beschränken

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:20 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum