Zur Navigation

Fehler in Syntax

1 andehrl

hallo jörg ich wollte diesen code

if (isset($_POST['marke']) && $_POST['marke'] != '') {
    $query_R1 .= " marke LIKE '%" . mysql_real_escape_string($_POST['marke']) . "%' AND ";
}

mit "OR OR marke IS NULL erweitern. sieht dann so aus bei mir

if (isset($_POST['marke']) && $_POST['marke'] != '') {
    $query_R1 .= " (marke LIKE '%" . mysql_real_escape_string($_POST['marke']) . " OR marke IS NULL) "%' AND ";
}

bekomme dann diese fehlermeldung

Parse error: syntax error, unexpected T_STRING in /is/htdocs/wp10548565_XUUKREW8G9/www/3cMitumzugAngeboteErweitertergebnis.php on line 71

zeile 71 ist diese hier

if (isset($_POST['marke']) && $_POST['marke'] != '') {
    $query_R1 .= " (marke LIKE '%" . mysql_real_escape_string($_POST['marke']) . " OR marke IS NULL) "%' AND ";
}
if (isset($_POST['model']) && $_POST['model'] != '') {
    $query_R1 .= " model LIKE '%" . mysql_real_escape_string($_POST['model']) . "%' AND ";
}

02.10.2010 16:30 | geändert: 02.10.2010 16:54

2 Jörg Kruse

Ja, zu Verständnis was an deinem Code falsch ist:

So könnte die ursprüngliche Vergleichs-Bedingung konkret (d.h. nach der Ersetzung durch PHP) aussehen:

marke LIKE '%Suchbegriff%'

Du könntest das so erweitern:

(marke LIKE '%Suchbegriff%' OR marke IS NULL)

02.10.2010 16:56 | geändert: 02.10.2010 17:00

3 andehrl

dann müsste es so richtig sein, oder?

$query_R1 .= " (marke LIKE '%" . mysql_real_escape_string($_POST['marke']) . "%' OR marke IS NULL) AND ";

02.10.2010 17:27

4 Jörg Kruse

Ja, so sollte es gehen

02.10.2010 17:36

5 andehrl

super, danke für die erklärung :-)

02.10.2010 17:51

6 andehrl

kann ich das dann auch erweitern in

(marke LIKE '%Suchbegriff%' OR marke IS NULL OR marke Like '-')

wie in diesem beispiel

$query_R1 .= " (treibstoff = " . GetSQLValueString($_POST['treibstoff'], 'text') . " OR treibstoff IS NULL OR treibstoff Like (-)) AND ";

falls das überhaupt so geht, werden dann beide "OR werte" als ergebnis angezeigt oder nur der letzte?
ich habe zwei seiten in denen der user daten an die datenbank schicken kann. "einfache angaben" und "erweiterte angaben". da bei einfachen angaben zb das feld treibstoff nicht gibt wird in der datenbank NULL hinterlegt. bei erweiterten angaben kann der user treibstoff auswählen. lässt er aber das feld unberuhrt wird an die datenbank "-" übermittelt.
falls nun ein anderer user bei einer suche zb "benzin" im suchfeld eingibt soll er als ergebnis sowohl die datensätze ausgeworfen bekommen die "benzin" als wert beinhalten als auch die datensätze in denen NULL und "-" hinterlegt sind. geht das mit zwimal OR oder muss ich das anders abfragen?

02.10.2010 18:08 | geändert: 02.10.2010 18:52

... 1 Monat später ...

7 andehrl

diese frage ist für mich immer noch offen. du hast mir in einem anderen beitrag einen link geschickt in dem Zeichenketten-Operatoren erklärt werden. verschiedene bedingungen werden demnach mit "."oder ".=" miteinander verbunden. ist also diese bedingungskette möglich, oder fehlt da noch irgend etwas?

$query_R1 .= " (treibstoff = " . GetSQLValueString($_POST['treibstoff'], 'text') . " OR treibstoff IS NULL . OR treibstoff LIKE '-') AND ";

03.11.2010 19:24

8 Jörg Kruse

Der Punkt ist ein Verkettungs-Operator für PHP, nicht für SQL! Alles was sich hier zwischen den Anführungszeihen befindet, ist SQL - da hat dieser Punkt nichts verloren:

$query_R1 .= " (treibstoff = " . GetSQLValueString($_POST['treibstoff'], 'text') . " OR treibstoff IS NULL . OR treibstoff LIKE '-') AND ";

Und ich sehe auch nicht, wieso an der Stelle etwas verkettet werden muss?

Darüberhinaus müssen Strings in SQL in Hochkommata eingeschlossen werden:

$query_R1 .= " (treibstoff = '" . GetSQLValueString($_POST['treibstoff'], 'text') . "' OR treibstoff IS NULL OR treibstoff LIKE '-') AND ";

03.11.2010 23:40

9 andehrl

also momentan schaut der code bei mir so aus:

if (isset($_POST['treibstoff']) && $_POST['treibstoff'] != '-') {
    $query_R1 .= " (treibstoff = " . GetSQLValueString($_POST['treibstoff'], 'text') . " OR treibstoff IS NULL) AND ";
}

wenn ich die query wie von dir beschrieben verändere muss ich dann nicht auch

if (isset($_POST['treibstoff']) && $_POST['treibstoff'] != '-')

entsprechend erweitern um alle eintragungen der datenbank zu erhalten. in etwa so?:

if (isset($_POST['treibstoff']) && $_POST['treibstoff'] != '-' && $_POST['treibstoff'] IS NOT NULL)


04.11.2010 17:27

10 Jörg Kruse

Du wirfst hier PHP und SQL durcheinander - "IS NOT NULL" ist SQL-Syntax.

In dem if Konstrukt bestimmst du, bei welchen Werten von $_POST['treibstoff'] die SQL-Query um den folgenden Abschnitt erweitert werden soll. In dem SQL-Abschnitt wiederum definierst du, welche Bedingungen die gesuchten Datensätze bezüglich des Datenfeldes treibstoff erfüllen sollen.

04.11.2010 17:55