Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ist es möglich, eine Datenbank mit einem in einer URL übergebenen Wert abzufragen und das Ergebnis der Abfrage mit mod_rewrite in die URL zu schreiben?

Es ist möglich, aber Sie müssen eine RewriteMap verwenden um eine Zuordnung zu definieren, die Sie innerhalb einer RewriteRule verwenden können .

Apache Version 2.2 hat keinen direkten Datenbankzugriff, daher müssen Sie ein Skript schreiben, das die eigentliche Abfrage durchführt und dann das Ergebnis zurückgibt. Sie können diese Map mit dem "External Rewriting Program" .

Wenn Sie also ein Skript haben, das „cats“ von stdin nimmt, dann die Datenbank abfragt und „1“ zurückgibt, würden Sie es folgendermaßen definieren:

RewriteMap item_lookup prg:/path/to/item_lookup.php

Diese Anweisung muss in Ihrer Server- oder Vhost-Konfiguration enthalten sein, sie kann nicht in einer htaccess-Datei enthalten sein. Aber Sie können das Mapping in einer htaccess-Datei verwenden:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]

Dies nimmt also den URI /cats und schreibt das in /item.php?id=1 um .

Wenn Sie Apache 2.4 verwenden, können Sie den " nutzen. DBD"-Karte . Sie können eine Abfrage direkt in die Kartendefinition einfügen, ohne ein externes Skript verwenden zu müssen. Sie würden es auf die gleiche Weise verwenden.

RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"

Dann verwenden Sie es auf die gleiche Weise:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]

Ohne eine DBD/FastDBD-Abfrage zu verwenden, denke ich, dass Sie ehrlich gesagt besser dran sind, wenn Sie nur die Datenbanksuche von item.php durchführen , da Sie diese ganze Arbeit sowieso in einem zweiten externen Skript duplizieren würden. Fügen Sie einfach etwas hinzu wie:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^item/([0-9]+)$ /item.php?id=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)$ /item.php?name=$1 [L]

Und in Ihrer item.php -Skript, prüfen Sie beide id und Name . Wenn Sie einen Namen haben , führen Sie die Datenbanksuche durch, um das in eine ID umzuwandeln. Es ist viel einfacher zu verwalten, Sie benötigen keinen Zugriff auf die Server-/Vhost-Konfiguration und verkomplizieren die Sache nicht durch die Verwendung einer Rewrite-Map.