SQL Problem

teqqy

teqqy

Aktives Mitglied
Thread Starter
Dabei seit
13.06.2006
Beiträge
1.010
Reaktionspunkte
27
Hallo,

könnte mir bitte jemand sagen wo hier der Fehler ist:
Code:
$sql = "SELECT *
	FROM userdetails
	WHERE sex = '{$_POST['sex']}'
	AND plz = '{$_POST['plz']}%'";

Die Variablen lass ich durch ein Formular übergeben. Nun soll er mir in der Spalte PLZ alle die suchen die mit der im Formular eingegebenen Zahlen beginnen.

Ich stehe irgendwie grad mal tierisch auf dem Schlauch. Danke für eure Hilfe.
 
Du holst damit alle Datensätze, bei denen "Sex" exakt übereinstimmt und gleichzeitig der Anfang von "PLZ" gefunden wird.

Mein PHP ist ein bisschen eingerostet, aber SQL technisch passt das. Was funktioniert denn genau nicht. Die Info wäre schon hilfreich. ;) Wie äußert sich das Problem? Liefert er keine Datensätze?

Edit: Lass dir $sql doch mal mit echo ausgeben. Was kommt dann?
 
Du holst damit alle Datensätze, bei denen "Sex" exakt übereinstimmt und gleichzeitig der Anfang von "PLZ" gefunden wird.
Genau so sollte es sein :)

Mein PHP ist ein bisschen eingerostet, aber SQL technisch passt das. Was funktioniert denn genau nicht. Die Info wäre schon hilfreich. ;) Wie äußert sich das Problem? Liefert er keine Datensätze?
Genau, er gibt mir keine Fehlermeldung oder ähnliches aus. Liefert einfach keine Datensätze.

Edit: Lass dir $sql doch mal mit echo ausgeben. Was kommt dann?

z. B. das: (habe zwischenzeitlich * durch die Tabellenspalten ersätzt)
Code:
SELECT nickname, picture, sex, plz, birthday FROM userdetails WHERE sex = 'm' AND plz = '65%'
 
hast du da ganz sicher datensätze in dieser such konstellation?
was für eine DB ist dahinter? MySql?
Ist PLZ ein String oder ein Int wert?
Bin mir jetzt nicht so sicher aber bei Zahlen brauchst nicht die ' '.
 
SQL ist bei mir nun schon mehr als einen Tag her ;) , aber vielleicht musst du bei plz mit "LIKE" arbeiten: … AND plz LIKE '{$_POST['plz']}%'";
 
hast du da ganz sicher datensätze in dieser such konstellation?
was für eine DB ist dahinter? MySql?
Ist PLZ ein String oder ein Int wert?
Bin mir jetzt nicht so sicher aber bei Zahlen brauchst nicht die ' '
Da steht eine MySQL DB dahinter mit auch genau diesen Spaltenbezeichnungen. Wenn ich die WHERE-Klausel mit der PLZ weg lasse, funktioniert das auch. PLZ ist ein int Wert.
Wenn ich die Hochkommata weg lasse, kommt eine Fehlermeldung (Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /Applications/MAMP/htdocs/indsearch.php on line 73), werden also benötigt ;)

SQL ist bei mir nun schon mehr als einen Tag her , aber vielleicht musst du bei plz mit "LIKE" arbeiten: … AND plz LIKE '{$_POST['plz']}%'";
Hab ich auch schon versucht. Passiert auch nix. :(
 
Zuletzt bearbeitet:
Mustervergleiche gehen nur mit LIKE!!!

Eventuell ist etwas mit Groß- und Kleinschreibung nicht richtig... (siehe 'm' - steht das so in der DB drin!?)

Sehe gerade Dein Hinweis mit dem INTEGER - Du solltest mit größer Vergleichen arbeiten! Also bei PLZ 68% die 68*1000 nehmen und in der Select Anweisung nach PLZ>=68000 suchen! Wenn es eine to_char Funktion in MySQL gibt (gibt es!), kannst Du die Zahl dann in einen String wandeln und dann Deinen geplanten Mustervergleich mit '68%' machen.

z.B. so:
SELECT nickname, picture, sex, plz, birthday FROM userdetails WHERE sex = 'm' AND to_char(plz) like '65%'

Bye
Mirko
 
Zuletzt bearbeitet:
Wenn ich nicht irre, kannst du % nicht bei int anwenden weil int als immer als ganzer Wert interpretiert wird. Probiers mal, indem du plz als char speicherst.

Bei Postleitzahlen macht int eh wenig sinn, da bei 04328 Klein-Krotzenbach in Sachsen die führende Null wegfällt und du bei Postleitzahlen keine Rechenfunktionen brauchst, dafür aber keine String-Operationen durchführen kannst. Lieber ein char mit der Länge 5.
 
probier mal ob es so geht: (bei mir tuts zumindest auf MySQL 4)
$sql = "SELECT * FROM userdetails WHERE LIKE '{$_POST['plz']}%'"

Wenn das tut dann bau einfach dein zweites dazu.
$sql = "SELECT * FROM userdetails WHERE LIKE '{$_POST['plz']}%' AND sex = '{$_POST['sex']}'"

Kann aber auch sein das dsa Like an das Ende muss also so:
$sql = "SELECT * FROM userdetails WHERE sex = '{$_POST['sex']}' AND LIKE '{$_POST['plz']}%'"

Probiers mal und klappts? :)

Gruss Michael
 
@theblubb
öhm :kopfkratz: Deine SQL-Kentnisse sind aber ganz schön eingerostet.

Was ist denn das?
theblubb schrieb:
$sql = "SELECT * FROM userdetails WHERE LIKE '{$_POST['plz']}%'"
Hier fehlt die Spalte mit der verglichen werden soll. Kurz gesagt, in all Deinen Beispielen fehlt der Vergleichswert.

Außerdem ist das Problem bereits identifiziert. Ein Vergleich mit LIKE geht nicht auf Spalten vom Typ INT. Paelmchen hat es schön erklärt.
 
@theblubb
öhm :kopfkratz: Deine SQL-Kentnisse sind aber ganz schön eingerostet.

Was ist denn das?
Hier fehlt die Spalte mit der verglichen werden soll. Kurz gesagt, in all Deinen Beispielen fehlt der Vergleichswert.

Außerdem ist das Problem bereits identifiziert. Ein Vergleich mit LIKE geht nicht auf Spalten vom Typ INT. Paelmchen hat es schön erklärt.

Stimmt hab plz = vergessen.
Naja das der Vergleich LIKE nicht auf INT geht kann ich mir nicht vorstellen. Ich habe hier eine Tabelle mit dem Datentyp INT (tinyint). Da funktioniert das jedoch.

Es gibt auch ne super Beispielseite für SQL Befehle: http://www.torsten-horn.de/techdocs/sql.htm#SELECT
 
täusche ich mich oder liegt das problem daran, dass durch, die in den $_GET-variablen verwendetetn, " ' " die abfrage nicht funktionieren kann?
man hat ja sonst die abfrage "...WHERE sex = '{$_POST[' ".
 
täusche ich mich oder liegt das problem daran, dass durch, die in den $_GET-variablen verwendetetn, " ' " die abfrage nicht funktionieren kann?
man hat ja sonst die abfrage "...WHERE sex = '{$_POST[' ".

Bei Char muss man (variable = '22') verwenden, bei INT reicht ein (variable = 0)

Normalerweise kann man auch bei INT (variable = '22') verwenden. Tut auch gerade ausprobiert.
 
Also vielen Dank für eure Hilfe. Mein Problem ist gelöst! :clap:

Habe den Datentyp in ein char umgewandelt und mit LIKE gearbeitet. Jetzt funktioniert es!

Ich bedanke mich nochmals ganz herzlich bei euch!
 
@TheBlubb

SQL ist dann doch so clever den '22' Ausdruck in ein Integer zu casten, aber Mustervergleiche gehen eben nur mit Strings! Und somit geht zahl='2%' (sowieso nicht - Muster gehen nur mit LIKE, aber sei's drum) eben so nicht, sondern nur durch to_char(zahl) like '2%'...

Bye
Mirko
 
SQL ist dann doch so clever den '22' Ausdruck in ein Integer zu casten, aber Mustervergleiche gehen eben nur mit Strings! Und somit geht zahl='2%' (sowieso nicht - Muster gehen nur mit LIKE, aber sei's drum) eben so nicht, sondern nur durch to_char(zahl) like '2%'...

Versuchsaufbau:
Code:
CREATE TABLE `client` (
  `id` int(8) unsigned zerofill NOT NULL auto_increment,
  `firstname` varchar(100) NOT NULL default '',
  `surname` varchar(100) NOT NULL default '',
  `zip` int(5) unsigned zerofill NOT NULL default '00000',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

INSERT INTO `client` (`id`, `firstname`, `surname`, `zip`) VALUES (00000001, 'Karl', 'Dall', 63263),
(00000002, 'Frank', 'Elstner', 55122),
(00000003, 'Thomas', 'Gottschalk', 43872);

Der Theorie folgend müsste folgende Abfrage fehlschlagen:
Code:
select * from client where zip like "6%";

Tut sie aber nicht:
Code:
+----------+-----------+---------+-------+
| id       | firstname | surname | zip   |
+----------+-----------+---------+-------+
| 00000001 | Karl      | Dall    | 63263 |
+----------+-----------+---------+-------+
1 row in set (0.00 sec)

Oder ist mein MySQL einfach intelligent genug und macht das to_char für das Feld zip automatisch?

Matt
 
Huch,

geht tatsächlich und ja es wird wohl ein cast in char gemacht - hatte wohl mit den Operatoren '=' und 'like' aus dem Thema was durcheinander geworfen... sorry

Würde aber trotzdem lieber einen expliziten Cast machen, also to_char und dann mit nem Muster vergleichen - Erfahrungen aus anderen Programmiersprachen, ist dann aber wohl Geschmacksache...

Bye
Mirko
 
Wow ... ein öffentliches Formular?

Das schreit nach SQL-Injektion ... :) <- böser Gedanke ... :)
 
ich finds noch viel besser wie man ein SQL-Problem exakt über dem Forum für Web-Datenbanken plaziert (Web-Programmierung) statt im zugehörigen Forum!

ich verschieben dann mal..
 
Zurück
Oben Unten