PHP/MySQL PLZ Suche

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von sevY, 09.01.2006.

  1. sevY

    sevY Thread Starter Gast

    Hi,

    folgendes Problem:

    Ich habe einen Datensatz mit Personen, die alle für einen Postleitzahlenbereich eine Aufgabe besitzen.
    Der Benutzer kann mittels seiner eingegeben PLZ entsprechende, für die PLZ zuständige Personen finden.

    Ein Datensatzelement sieht so aus:

    PersonenID, Zuständigkeit-Postleitzahl-Von, Zuständigkeit-Postleitzahl-Bis


    Postleitzahlen sind immer 5-stellig, daher habe ich mit MySQL "where plz-user-suche is BETWEEN von AND bis" das Einzugsgebiet ausgelesen.

    Hat ein Nutzer keine 5-stellige Postleitzahlen, habe ich diese mit Nullen aufgefüllt.



    Unzulänglichkeit:

    Gibt der Benutzer die PLZ '44' ein, so wird daraus 44000 gemacht.
    Das ist aber falsch, da bei der Eingabe 4 nicht nach den "Personen, die 44000 umfassen" gesucht werden soll, sondern nach allen "Personen, die für mindestens 40000 zuständig sind".


    Also lasse ich die Sucheingabe unverändert und fülle diese nicht mit Nullen auf.
    Stattdessen muss ich die Zeichenlänge der Postleitzahlenfelder der Personen auf die Zeichenlänge der Sucheingabe heruntersetzen.

    PHP:

    //Testdaten

    $input=44//Suche
    $plzlen=strlen($input); //Zeichenlänge der Suche


    $getDealerByCountry=mysql_query("select dealerid,von,bis from ".DB_TAB_ZONE." where ".$input." >= SUBSTRING(von,0,".$plzlen.") && ".$input." <= SUBSTRING(bis,0,".$plzlen.") order by RAND()",$handler);


    Leider funktioniert das nicht, da Substring scheinbar nur mit Strings arbeitet, ich zum Vergleichen jedoch numerische Datentypen brauche.

    Gibt es eine Funktion, hat jemand eine Idee oder einen Ansatz (eventuell zum Typecasting)?


    Liebe Grüße
    Yves
     
    Zuletzt von einem Moderator bearbeitet: 09.01.2006
  2. dms

    dms Thread Starter Gast

    Das verstehe ich nicht. Wenn Du eine 4 mit Nullen auffüllst bis es ein String mit 5 Zeichen ist, wie kann sich dann eine zweite 4 einschummeln?

    Wie hast Du denn das gelöst? Mein Angebot wäre folgendes:

    SELECT RPAD(_plz_,5,'0');

    Alternativ könnte man es auch mit einem kleinen Konstrukt aus concat und substring lösen.

    SELECT SUBSTRING(CONCAT(_plz_,'00000'),1,5);

    Edit: Substring nimmt übrigens auch Integers entgegen. Der zweite Parameter erwartet jedoch eine 1, keine 0 wenn Du vom Anfang ausgehst.
     
  3. k33k

    k33k MacUser Mitglied

    Beiträge:
    370
    Zustimmungen:
    1
    MacUser seit:
    24.08.2003
    hallo yves,

    1. ansatz: musst die substring-funktion nicht auch durch doppelte anführungszeichen eingeleitet werden? bin mir da nicht sicher.

    2. ansatz: du kannst bei einem vergleich auch gleich nen cast machen.
    z.B. $int =45000; //intwert
    $plz = "45000"; //string
    wenn du jetzt den vergleich mit if($plz === $int) usw. sollte es funktionieren, da php die $plz in eine INT-Variable umwandelt.

    das ganze leider ohne gewähr
    hoffe konnte etwas helfen
    michael
     
  4. sevY

    sevY Thread Starter Gast

    Sorry, war ein Fehler. Eingabe ist 44, als Beispiel.

    PHP:
    str_pad($_POST['postleitzahl'],5,0);
    Das das erübrigt sich ja… da, wie schon gesagt, dadurch zuviele Personen ausgeschlossen werden.


    Erklärung:

    „Suche nach 44 zeigt alle Personen, die die 44000 im Einzugsgebiet haben.“
    Das ist korrekt.

    „Suche nach 4 zeigt alle Personen, die die 40000 im Einzugsgebiet haben.“
    Was ist mit Händler, die die 46000 im Einzugsgebiet haben (46000-48000)?
    Die werden ausgeschlossen.

    Suche nach 4 soll alle Händler zeigen die eine Zahl von 40000-49999 im Einzugsgebiet haben.
     
  5. dms

    dms Thread Starter Gast

    Vermutlich ist mein Edit oben untergegangen, also nochmal. :)

    Substring nimmt übrigens auch Integers entgegen. Der zweite Parameter erwartet jedoch eine 1, keine 0 wenn Du vom Anfang ausgehst.
     
  6. Incoming1983

    Incoming1983 MacUser Mitglied

    Beiträge:
    7.597
    Zustimmungen:
    1
    MacUser seit:
    23.07.2005
    Probiers doch mal mit regulären Ausdrücken, da bist du flexibler ;-)
     
  7. sevY

    sevY Thread Starter Gast

    Lösung:

    PHP:
    $getDealerByCountry=mysql_query("select dealerid,von,bis from ".DB_TAB_ZONE." where countryid='".mysql_escape_string($_POST['country'])."' && ".$input." between substring(von,1,".$input_char_length.") AND substring(bis,1,".$input_char_length.") order by RAND()",$handler);
    Fazit:
    Es lag am SUBSTRING Offset-Parameter, welches 1 und nicht 0 ist. BETWEEN habe ich als Ersatz für die Verkettung der arithmetischen Operatoren genutzt – ist übersichtlicher.

    Vielen Dank an alle für die Mühe!
     
  8. sevY

    sevY Thread Starter Gast

    Nächstes Problem ;)

    Quasi als Notiz für spätere Threadleser, die das Problem auch haben.


    Der Händler aus Leipzig hat als Einzugsgebiet 00001 bis 04999.
    Logischerweise fallen bei numerischen, ganzzahligen Datentypen die führenden Nullen weg.
    Verglichen wird daher mit 1 und 4999… also muss ich nun in MySQL die von,bis Felder mit führenden Nullen versehen, sodass diese immer 5 Stellen erreichen.
     
  9. sevY

    sevY Thread Starter Gast

    PHP:
    $getDealerByCountry=mysql_query("select dealerid,von,bis from ".DB_TAB_ZONE." where countryid='".mysql_escape_string($_POST['country'])."' && ".$input." between substring(lpad(von,5,0),1,".$input_char_length.") AND substring(lpad(bis,5,0),1,".$input_char_length.") order by RAND()",$handler);
     
Die Seite wird geladen...

Diese Seite empfehlen