PHP/MySQL PLZ Suche

S

sevY

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 bearbeitet von einem Moderator:
Yves schrieb:
Gibt der Benutzer die PLZ '4' ein, so wird daraus 44000 gemacht.
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.
 
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
 
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.
 
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.
 
Probiers doch mal mit regulären Ausdrücken, da bist du flexibler ;-)
 
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!
 
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.
 
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);
 
Zurück
Oben Unten