Mysql
 sql >> Base de données >  >> RDS >> Mysql

Est-il possible d'interroger une base de données à l'aide d'une valeur transmise dans une URL et d'écrire le résultat de la requête dans l'URL à l'aide de mod_rewrite ?

C'est possible, mais vous devez utiliser un RewriteMap pour définir un mappage que vous pouvez utiliser dans une RewriteRule .

Apache version 2.2 n'a pas d'accès direct à la base de données, vous devrez donc écrire un script qui effectue la requête réelle, puis renvoie le résultat. Vous pouvez définir cette carte à l'aide du "Programme de réécriture externe" .

Donc, si vous avez un script qui prend "cats" de stdin, puis interroge la base de données et renvoie "1", vous le définirez comme suit :

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

Cette directive doit être dans la configuration de votre serveur ou vhost, elle ne peut pas être dans un fichier htaccess. Mais vous pouvez utiliser le mappage dans un fichier htaccess :

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

Cela prend donc l'URI /cats et le réécrit en /item.php?id=1 .

Si vous utilisez apache 2.4, vous pouvez profiter du " Carte DBD" . Vous pouvez insérer une requête directement dans la définition de la carte, sans avoir à utiliser un script externe. Vous l'utiliserez de la même manière.

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

Utilisez-le ensuite de la même manière :

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

Sans utiliser une requête DBD/FastDBD, je pense que vous feriez mieux de simplement faire la recherche de base de données à partir de item.php , puisque vous dupliquez tout ce travail dans un deuxième script externe de toute façon. Ajoutez simplement quelque chose comme :

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]

Et dans votre item.php script, vérifiez à la fois id et nom . Si vous avez un nom , effectuez la recherche dans la base de données afin de transformer cela en un identifiant. C'est beaucoup plus facile à gérer, vous n'avez pas besoin d'avoir accès à la configuration du serveur/vhost et vous ne compliquez pas les choses en utilisant une carte de réécriture.