sql >> Databasteknik >  >> RDS >> Mysql

Är det möjligt att fråga en databas med ett värde som skickas i en URL, och skriva resultatet av frågan till URL:en med mod_rewrite?

Det är möjligt, men du måste använda en RewriteMap för att definiera en mappning som du kan använda inom en RewriteRule .

Apache version 2.2 har inte direkt databasåtkomst så du måste skriva ett skript som gör själva frågan och sedan returnera resultatet. Du kan definiera denna karta med "External Rewriting Program" .

Så om du har ett skript som tar "cats" från stdin, sedan frågar databasen och returnerar "1", skulle du definiera det så här:

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

Det direktivet måste finnas i din server eller vhost-konfiguration, det kan inte finnas i en htaccess-fil. Men du kan använda mappningen i en htaccess-fil:

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

Så detta tar URI:n /cats och skriver om det till /item.php?id=1 .

Om du använder apache 2.4 kan du dra fördel av " DBD" karta . Du kan infoga en fråga direkt i kartdefinitionen, utan att behöva använda ett externt skript. Du skulle använda det på samma sätt.

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

Använd den sedan på samma sätt:

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

Utan att använda en DBD/FastDBD-fråga tror jag att du ärligt talat är bättre av att bara göra en databassökning från item.php , eftersom du skulle duplicera allt detta arbete i ett andra externt skript ändå. Lägg bara till något som:

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]

Och i din item.php skript, leta efter båda id och namn . Om du har ett namn , gör databassökningen för att göra det till ett id. Det är mycket enklare att hantera, du behöver inte ha åtkomst till server/vhost-konfiguration och du komplicerar inte saken genom att använda en omskrivningskarta.




  1. Det går inte att ansluta till Google Cloud SQL med SSL + Golang från Google App Engine

  2. ett bättre tillvägagångssätt än att lagra mysql-lösenord i vanlig text i konfigurationsfil?

  3. Är det möjligt att lagra värdet för en utvald kolumn och använda den för nästa?

  4. Accelererad databasåterställning i SQL Server 2019