SQL DB Abfrage mittels Formular und PHP - 'OR' funktioniert nicht und Datumssuche

joli_ch

Grünschnabel
Hallo zusammen,

ich befasse mich erst kurz mit PHP und mysql, da ich dies für ein Projekt in der Firma brauche.
Das Schreiben von Daten mittels Formular in eine Tabelle hat funktioniert.
Nun werden diese Daten und solche aus anderen Tabellen (über Keys verbunden) nach verschiedenen Kritieren (im Moment 2) per Formulareingabe abgefragt. (Entweder oder)

Das erste Kriterium ist die Abfrage nach einer Seriennummer, welche auch als einzelne Abfrage funktioniert.

Das zweite Kriterium ist die Abfrage nach einem Datum. Bzw. die Tabelle enthält eine Spalte DatVon und eine Spalte DatBis, Datumsformat yyyy-mm-dd. Im Formular gebe ich ein Datum ein und es sollen die Datensätze ausgegeben werden, bei welchem das Datum zwischen DatVon - DatBis liegt...

Das Datum wandle ich für diese Abfrage ebenfalls um von dd.mm.yyyy in yyyy-mm-dd (so wie ich es für den Datenbankeintrag mache).
Die Abfrage nur nach Datum hat über SQL im myPHPAdmin unter Verwendung eines spezifischen Datums funktioniert.

Nun habe ich 2 Probleme:

1. Wenn ich die Abfrage nur nach Datum übers Web/Formular versuche (mit untenstehndem Code ohne die OR Zeile), dann bekomme ich keine Fehlermeldung, aber auch keinen Eintrag zurück, obwohl es in der DB einen gültigen Eintrag gäbe.
An der Datumumwandlung sollte es nicht liegen, diese wird korrekt umgewandelt (Wert geprüft über Ausgabe mit echo (datum)). Oder kann ich den Vergleich nicht so ausführen?

2. Wenn ich beide Bedingungen zusammenfüge mit OR, dann bekomme ich Fehlermeldungen:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/jolanda/public_html/test_cso/abfrage.php on line 56
In 56 wird $ergebnis verwendet, also muss $ergebnis ja falsch bzw. not valid sein?
Ausserdem ergibt die Fehlerausgabe.:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6 , wobei line 6 meiner Meinung nach der 6. Linie nach $abfrage entspricht.

Ich habe schon einiges versucht, komme aber nicht mehr weiter...

Der Code dazu...

PHP:
<?php  
$srn_s = $_POST["srn_s"];
$datum_s = $_POST["datum_s"];
$datumsep=explode(".",$datum_s);
$ndatum=$datumsep[2]."-".$datumsep[1]."-".$datumsep[0];

echo $ndatum;
 
$abfrage = 
"SELECT inp.srn, inp.pnr, inp.DatVon, inp.DatBis, inp.ZeitVon, inp.ZeitBis, per.VorName, per.Nachname, per.Natel, per.TelefonPrivat, mif.REG, mif.KUNDENNAME, mif.ORT
FROM input inp
LEFT JOIN personal per ON (inp.pnr = per.PNR)
LEFT JOIN mif ON (inp.srn = mif.SERIENR)
WHERE inp.DatVon <= $ndatum  OR inp.DatBis >= $ndatum
OR inp.srn LIKE $srn_s
";

echo $ndatum_s;
echo (mysql_error()); 

$ergebnis = mysql_query($abfrage);

...hier geht es natürlich noch weiter, aber die Ausgabe funktioniert.


So... jetzt hoffe ich, dass es nicht zu umständlich ausgedrückt ist und danke schon im Voraus für die Hilfe...

lg
Jolanda
 
PHP:
$abfrage = 
"SELECT inp.srn, inp.pnr, inp.DatVon, inp.DatBis, inp.ZeitVon, inp.ZeitBis, per.VorName, per.Nachname, per.Natel, per.TelefonPrivat, mif.REG, mif.KUNDENNAME, mif.ORT
FROM ( input inp LEFT JOIN personal per ON (inp.pnr = per.PNR) ) LEFT JOIN mif ON (inp.srn = mif.SERIENR)
WHERE (inp.DatVon <= $ndatum AND inp.DatBis >= $ndatum) OR inp.srn = $srn_s
"; 
$ergebnis = mysql_query($abfrage);
echo(mysql_error());

Du solltest auf jeden Fall mehr mit Klammern arbeiten. Die joins hab ich mir jetzt nicht genau angeschaut wenn du sagtest das du darüber schon ausgaben erzielt hast.

Es wird dir jetzt alle Werte ausgeben bei denen a) $ndatum zwischen DatVon und DatBis liegen oder genau auf den Werten von DatVon/DatBis oder b) genau die angegebene Seriennummer haben.

Das ist jetzt nur zum Test ein Vorschlag. Du musst dringend noch die Parameter filtern! Z.B würde ein 22.7.2011 als Datum schon nicht mehr funktionieren!
 
Zuletzt bearbeitet von einem Moderator:
Grundsätzliche Info: Formulardaten NIE ungefiltert / unkontrolliert in einer MySQL-Anweisung benutzen. Auch nicht in einer "angeblich" geschlossenen Firmen-Intranetstruktur.

SQL Injection und Prepared Statements.

Es könnte sein, dass der Unterstrich in der letzten Variable das Problem ist. Nimm diesen Unterstrich einfach raus oder übergib die Variable anders.
..Als Sonderzeichen werden ‘_’ und ‘$’ sowie alle nicht alphanumerischen Zeichen des aktuellen Zeichensatzes betrachtet. ..
http://dev.mysql.com/doc/refman/5.1/de/legal-names.html

L.Behm hat schon auf die Logik in der Klammerung hingewiesen.. Dein Statement xx OR yy OR zz bedeutet ja, dass im Falle des Zutreffens eines Falles der Eintrag genommen wird. In Deinem Fall muss doch entweder die Datumsabfrage oder die Seriennummer stimmen.. (nDatum muss jünger als DatVon sein UND älter als DatBis) ODER Seriennummer stimmt.


mfg chmee
 
Zuletzt bearbeitet:
Danke euch für die schnelle Hilfe... werde das am Wochenende mal ausprobieren und wegen der Sicherheit nachlesen. Va da es nicht in einer Intranetstruktur läuft sondern über einen normalen Webserver!
 
Auch wenn mir zum Punkt 2 (_) nach dem Aufwachen klar geworden ist, dass der Unterstrich gar nicht mehr existieren dürfte, wenn die MySQL-Query abgeschickt wird, da von php abgearbeitet. Mir macht es das Arbeiten mit variablen Strings einfacher, wenn ich jene nicht im String angebe, sondern sichtbar hinzuaddiere..

also:
PHP:
// nicht
echo "Das ist $variable";

// sondern
echo "Das ist ".$variable;

mfg chmee

p.s.: Ach so, laß Dir das SQL-Statement mal vor der Query per Echo ausgeben und zeig es mal, dann sollte der Fehler offenbar werden..

p.p.s.: :) Ein mysql_error ausgeben lassen, bevor die Query abgeschickt wird, halte ich auch für eigenartig
PHP:
echo (mysql_error()); 
// soll wohl für die connect sein, oder?
$ergebnis = mysql_query($abfrage);

//----------
// besser
$ergebnis = mysql_query($abfrage) or die("MySQL Error : " . mysql_error()."</br>");
// in der produktivumgebung so wenig wie möglich Systeminfos ausgeben lassen
// potentiell gefährlich!
 
Zuletzt bearbeitet:
Zurück