2009-06-05 5 views
2

Ich habe Probleme mit dem SQL unten. Grundsätzlich habe ich Zeilen, die Strings nach folgendem Format enthalten: 129 & c = Autos. Ich möchte nur den Teil der Ziffern, z. 129. Die SQL-Abfrage lautet:SQL: Suchspalte, die mit Ziffern beginnt

$result = mysql_query("SELECT * FROM " . $db_table . " WHERE id LIKE '" . $id . "%'"); 

Warum funktioniert nicht%? Ich kann% ...% nicht verwenden, weil es zu viel fängt.

+0

Ich versuche nicht, ein Klugscheißer zu sein, aber sei vorsichtig, wenn ich die Abfrage erstelle: Wenn die ID direkt von einem Benutzer kommt, hast du eine offene Tür zur SQL-Injektion. – balpha

+0

Was meinst du% funktioniert nicht? Wählt es nicht die Zeilen aus, die Sie erwartet haben? – Jack

+0

Nein, es stimmt mit der falschen Zeile überein. Also ist die ID 26 mit 136 abgeglichen. –

Antwort

1

Ich würde eigentlich empfehlen, reguläre Ausdrücke für die Übereinstimmung zu verwenden, aber leider gibt es keine Möglichkeit, den passenden Teil mit mysql zu erfassen. Sie müssen die Extraktion in PHP durchführen. Wenn Sie ein Array haben, das alle die genannten Ergebnisse $array:

$array = preg_replace('/^(\d+).*/', '$1', $array); 
+0

ist $ array das gleiche wie meine Variable namens $ result? –

+1

Das hat funktioniert - danke! Das Problem ist, dass ich die gesamte Tabelle abrufe und ich frage mich, ob die Abfrage irgendwie optimiert werden kann. –

+0

Sie können die limit-Anweisung verwenden, wenn Sie nur einige der Zeilen möchten: http://php.about.com/od/mysqlcommands/g/Limit_sql.htm – soulmerge

1

Sie können die ‚regexp‘ MySQL Sachen in der WHERE-Klausel, die Datenmenge nur auf die Zeilen, die Sie wollen, abgerufen zu reduzieren. Der Grund für Ihre Abfrage würde wie folgt aussehen:

SELECT * FROM table WHERE field REGEXP '^$id&' 

wo $ id von PHP und den Daten, die Sie ist am Anfang des Feldes willst immer eingesetzt und von einem & gefolgt. Wenn nicht, passen Sie die Regex natürlich an.

Die Regex-Engine von MySQL kann leider nicht capturen, also müssen Sie immer noch ein wenig PHP parsen, wie oben gezeigt, aber mit dem 'where regexp'-Zeug in MySQL müssen Sie nur handeln mit Zeilen, die Sie wissen, enthalten die Daten, die Sie möchten, nicht die gesamte Tabelle.

0

eine Abfrage wie folgt aus:

SELECT * 
FROM mytable 
WHERE id >= '0' COLLATE UTF8_BIN 
     AND id < ':' COLLATE UTF8_BIN 

werden alle Strings zurück, die mit einer Ziffer und machen Sie Ihren Ausdruck sargable, i starten. e. und Index auf id kann verwendet werden.

Dadurch wird Ihre Abfrage schneller ausgeführt.

Verwandte Themen