Как мне сделать www.mydomain.com/folder/?id=123 ---> www.mydomain.com/folder/xCkLbgGge
Я хочу, чтобы моя страница запроса БД получила собственный URL-адрес, как я видел в твиттере и т. д. и т. д.
Как мне сделать www.mydomain.com/folder/?id=123 ---> www.mydomain.com/folder/xCkLbgGge
Я хочу, чтобы моя страница запроса БД получила собственный URL-адрес, как я видел в твиттере и т. д. и т. д.
Этот термин известен как «слаг». Wordpress сделал этот термин популярным. Во всяком случае, хотя.
В конечном счете, вам нужно иметь файл .htaccess, который перехватывает весь ваш входящий трафик, а затем преобразует его на уровне сервера для работы с вашим PHP в том смысле, что вы все равно сохраните логику ?id=123 нетронутой, но для клиента сторона '/folder/FHJKD/' будет видимым результатом.
вот пример файла .htaccess, в котором я использую аналогичную логику .. (то же самое делает и WordPress).
RewriteEngine On
#strips the www out of the domain if there
RewriteCond %{HTTP_HOST} ^www\.domain\.com$
#applies logic that changes the domain from http://mydomain.com/post/my-article
#to resemble http://mydomain.com/?id=post/my-article
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?id=$1 [QSA,L]
что это сделает, так это возьмет все после domain.com/ и передаст его как переменную в index.php, переменная в этом примере будет «id», поэтому вам нужно настроить логику, которая наилучшим образом соответствует потребностям ваших сайтов.
пример
<?php
//the URL for the example here: http://mydomain.com/?id=post/my-article
if($_GET['id'])
{
$myParams = explode('/', $_GET['id']);
echo '<pre>';
print_r($myParams);
echo '</pre>';
}
?>
теперь логика для этого должна быть намного глубже, это только чистый пример на базовом уровне, но в целом и особенно из-за вашей работы с базой данных, я полагаю, вы хотите убедиться, что $myParams чист от вредоносного кода, который может внедрить в ваш PHP или базу данных.
Вывод вышеуказанного $myParams
через print_r()
будет следующим:
Array(
[0] => post
[1] => my-article
)
Для работы с ним вам нужно будет сделать как минимум
echo $myParams[0].'<br />';
или вы можете сделать это так, потому что большинство браузеров добавят конечный /
<?php
//the URL for the example here: http://mydomain.com/?id=post/my-article
if($_GET['id'])
{
//breaks the variable apart, removes any empty array values and reorders the index
$myParams = array_values(array_filter(explode('/', $_GET['id'])));
if(count($myParams > 1)
{
$sql = "SELECT * FROM post_table WHERE slug = '".mysql_real_escape_string($myParams[1])."'";
$result = mysql_query($sql);
}
}
?>
Это, по общему признанию, очень грубый пример, вы хотели бы поработать там с некоторой логикой, чтобы предотвратить внедрение mysql, а затем вы примените запрос, как если бы вы сейчас вытаскивали свои статьи, используя только id = 123.
В качестве альтернативы вы также можете пойти совершенно другим путем и исследовать чудеса MVC (Model View Control). Что-то вроде CodeIgniter — это хороший простой MVC-фреймворк для начала работы. Но это зависит от вас.
$myParams[0]
будет вашей точкой перехода. Теперь большинство людей добавят дополнительный столбец в свои таблицы базы данных, по крайней мере, таким образом, чтобы они могли легко согласовать то, что у них есть, с этой концепцией, не меняя слишком много. Теперь этот один столбец будет частью slug .com/my-article в вашем URL-адресе, в столбце будет храниться моя статья, которую вы будете искать, и работать с ней, как и с любым другим запросом БД.
- person chris; 14.06.2012
Это может быть достигнуто с помощью mod_rewrite
, например. через файл .htaccess
.
В вашем .htacess вам нужно добавить RewriteEngine.
После этого вам нужно будет сделать несколько регулярных выражений, чтобы заставить этого маленького зверя работать. Я предполагаю, что ?id - это folder.php?id=123.
Например, часть папки: RewriteRule ^folder/([a-zA-Z0-9_-]+)/([0-9]+).html$ folder.php?id=$123