I'm new here I and need your help.
I started playing with .htaccess and php and I came across a problem.
When doing url rewriting, I pass into the url a string which is the title of an article extracted from the database. The problem is that the string(title) has a lot of characters who in the url are misspelled. EG: localhost/news/php%5%is%out
Here % are the blank spaces. I tried to format every title with preg_replace and I replaced every space with '-' but there are a lot of characters and I wanted to know if there is any way of doing this without preg_replace so any string can be good for a query.
In news.php I get the string from the url and I use it for the query in the database from which I extract the body of the entire article.
RewriteRule ^news/([a-zA-Z0-9._]+)/?$ /news.php?news_title=$1
This is my .htaccess file so in the news.php i get the 'news_title' variable through $_GET and then query the database to find the articol with this title.
So my question is, am I doing this all wrong? Is there any other way of doing this? I started working with htaccess only 2 days ago and I want to make my urls more friendly.
I hope my question is clear.
Thank everyone who helps me.
Just for an example, this is what I use to transform the normal tile in a string that won't be change with symbols(;amp, %, ?, etc) in the url
function generateUrl($url) {
$v1 = preg_replace("/[\s\:\;\,\_\'\`\"\?\!\%\(\)\+\=\#\#\[\]\{\}\/]/", "-", $url );
$v2= preg_replace('/[-]{2,}/', '-', $v1);
$v3 = preg_replace('/^[-]/', '', $v2);
$final = preg_replace('/[-]$/', '', $v3);
return $final;
}
I think the answer for your problem is here URL Friendly Username in PHP?. When you add article to the table, use this function (Slug) to convert article title and store converted title in column "slug". When user enters the address (.....)/article.php?name=some-title, use $slug = $_GET['title'] and find article by a slug. Before you save article you should check whether the article with this slug exists. If exists add to slug some number and then save to db. You can't allow to exists two record with the same slug in the table.
Related
I am making the dynamic website in PHP. While code is running good using pageid.
The url is now like www.google.com/pageid=1
Now, i want to change the url for 1 level pages as www.google.com/page1
for level 2 as www.google.com/page1/page2
for level 3 as www.google.com/page1/page2/page3
While unique address is stored in the my table as page1,page2,page3.
How can it be possible to change url at run time. Please give the examples and comments. So that it may helpful to understand.
Also i want to know if it is possible using the .htaccess file. If possible How .htaccess %{REQUESTED_FILE}% will reach out for my unique url's that are stored in the database.
$URL= "www.google.com/page1"
1) split the string with '/'
$data = explode("/",$URL);
$data[1] will have page1 value
2) replace the string page with ""
$pageId = str_replace("page","", $data[1]);
3) whatever is left is the page id
pageId has the value now.
Use that to query the database.
Another way is to use regex to extract the number from page1 and use it where-ever you want to use it.
I have developed a website using Raw PHP. I have used special character (? and ~) in URL. Example: http://webdeveloperszone.com/?~=portfolio .
Now, I want to rebuild this website using wordpress or codeigniter. I want to keep all the existing link live, because google has cached those links. That means, I have to create links which supports special character (? and ~).
Can any one tell me how can I do this?
PHP
string urlencode ( string $str );
string urldecode ( string $str );
JavaScript
encodeURI(uri);
decodeURI(encodeURI(uri));
For codeigniter
Have a look on
https://ellislab.com/codeigniter/user-guide/general/urls.html
Enable query string
And change
$config['controller_trigger'] = 'c';
To
$config['controller_trigger'] = '~';
In wordpress just you need to create page.
and then change post name from database as you like.
Create page named portfolio.
save and publish it.
then go to phpmyadmin.
open wp_posts.
get the record for perticular page.
and change post_name to your slug ?~=portfolio.
That's it.
Let me first give you a little background to explain what I'm trying to do. My websites use URL's that look like this: MySite/World/Isthmus_of_Panama
I'm working on a major upgrade (and may eventually upgrade further by switching to a CMS, like Drupal or WordPress), and it sounds like the general consensus is that URL's with hyphens are better than underscores. So I'm changing my URL's to MySite/World/Isthmus-of-Panama. In the meantime, I'm also trying to figure out if I should change my URL's to all lower case, and what about special symbols like accents or parentheses?
And what if someone typed in a URL that looks like MySite/World/Isthmus of Panama ? Wikipedia has a script that automatically converts the spaces to underscores. It will also default to the correct URL if you use the wrong case.
Of course, if I change my URL's, I'll also have to forward visitors from my old URL's. It's getting very confusing.
Then I realized that I could cover all of the bases with a script that accepts any URL that matches the characters in my database, 1) regardless of case, 2) and regardless of whether multiple words are separated by hyphens, underscores, spaces or %20. So imagine the following URL's:
MySite/World/Isthmus-of-Panama
MySite/World/Isthmus of Panama
MySite/World/Isthums%20of%20Panama
MySite/World/isthumus_of_panama
MySite/World/Isthmus-of_PANAMA
Where the database value is Isthmus-of-Panama.
Below is one of my queries, where $MyURL = the database value URL (e.g. Isthmus-of-Panama). Can anyone tell me how to modify it so that all of the above URL's will be accepted, with the page then defaulting to the database value?
Wikipedia has a similar feature. If you go to their article about Crazy Horse, then replace the URL Crazy_Horse with crazy_horse or Crazy Horse, it will default to Crazy_Horse. Thanks.
$sql= "SELECT COUNT(URL) AS num FROM gs_reference
WHERE URL = :MyURL";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':MyURL',$MyURL,PDO::PARAM_STR);
$stmt->execute();
$Total = $stmt->fetch();
switch($Total['num'])
{
case 1:
// DISPLAY A PAGE
break;
case 0:
// 404 NOT FOUND ERROR
break;
default:
// DUPLICATE RESULTS
break;
}
I would convert input, example Isthums%20of%20Panama, to the database value in php.
If the converted value is equal to the input one then don't do a 301 redirect to the url with the converted text else do one
EDIT
I would create in database a column slug (generally called like this) which contain the text normalized (ascii character and -) and create an unique index on it
You could use this function to generate the slug in php: PHP function to make slug (URL string)
I've searched for an answer to this question already and found an article relating to it but it does not give an exact answer. That can be found here: PHP - How can I replace dashes with spaces?
I am using this function to convert my blog titles into SEO friendly URL strings:
//SEO Friendly URLS
public static function Seo($input){
$input = str_replace(array("'", "-"), "", $input);
$input = mb_convert_case($input, MB_CASE_LOWER, "UTF-8");
$input = preg_replace("#[^a-zA-Z0-9]+#", "-", $input);
$input = preg_replace("#(-){2,}#", "$1", $input);
$input = trim($input, "-");
return $input;
}
which will convert titles like so "My Blog Title" to "my-blog-title", which is good. However I usually pass the blog ID in the URL to get the blog from the database, but I'm trying to keep really friendly urls.
I understand I can pass the blog ID as a second query string on the end of the title like mysite.com/page.php?post=my-blog-post&id=1 but that still looks bad. I WILL be using .htaccess to remove the .php and '?' from the URL's, but I am unsure how to keep a pretty URL while passing the ID too.
How can I query the database while using the blog title as the URL query?
URL friendly versions of titles are often referred to as slugs. If you store the slug in the database table you could use it to retrieve articles. It would be best to store the slug anyway so that once a slug is created it is never changed.
For example, let's say you find and fix a bug in the Seo function, there's a possibility that it could change your URL, which is obviously bad SEO. Storing the slug in the database avoids that issue.
If you store the slug, you'll probably want a slug for each blog category as well. This way you're more closely imitating a filesystem and would no longer have to ensure that every slug was completely unique. While it's unlikely you'd have articles with the same title in different directories, it's something to consider as you build your site.
You can use mod_rewrite module for Apache. This is the most common practice.
Using .htaccess rewrite rule
RewriteRule ^([^?]*) index.php?route=$1 [L,QSA]
URL http://example.com/en/my-life/first-impression
will be "rewritten" and passed to index.php as GET parameter route.
Exploded it in PHP by dashes.
$parts = explode('/', $_GET['route']);
This is how you will get all parts of url and make your PHP logic accordingly,
$parts[0] => language code
$parts[1] => category
$parts[2] => post SEO title
I want to apply the page HTML title in the URL
for example in here (stackoverflow) the url is something like that:
http://stackoverflow.com/questions/10000000/get-the-title-of-a-page-url
you can see the "get-the-title-of-a-page-url" part which is the page title
what i mean is when the user go to spowpost.php?post=1
the actual url that shows up when the pages load will be
spowpost.php?post=1$title=..the_title..
how can i do that?
EDIT: i was thinking about htaccess , but i don't know this very well so tutorial would help for this CERTAIN case..
You can use .htaccess for this. For example:
RewriteEngine On
RewriteRule ^questions/(\d+)/([a-z-]+) index.php?id=$1&title=$2 [L]
Your PHP page (index.php) receives the id and title as parameters in $_GET[]:
echo $_GET['title'];
// get-the-title-of-a-page-url
You can then use that (or the id, which is easier) to retrieve the correct item from your data source:
// Assuming you didn't store the - in the database, replace them with spaces
$real_title = str_replace("-", " ", $_GET['title']);
$real_title = mysql_real_escape_string($real_title);
// Query it with something like
SELECT * FROM tbl WHERE LOWER(title) = '$real_title';
Assuming you do have an id parameter in the URL of some sort, it's easier to query based on that value. The title portion can be used really only to make a readable URL, without needing to act on it in PHP.
In reverse, to convert the title to the format-like-this-to-use-in-urls, do:
$url_title = strtolower(str_replace(' ', '-', $original_title));
The above assumes your titles don't include any characters that are illegal in a URL...
$article_link = "http://example.com/spowpost.php?post=$postid&$title=$url_title";
Or to feed to .htaccess:
$article_link = "http://example.com/spowpost$postid/$url_title";
From what I understand, your title will be passed to the page as part of the URL. To show it in the title bar, put this in the section:
<?php $title=urldecode($_GET["title"]); echo "<title>$title</title>"; ?>
You might need to change parts of this, for instance dashes to spaces or something. If that is the case, use PHP's str_replace function: http://php.net/str_replace
Not sure about what's the problem you are facing but just according to what you say in your post the anwser would be:
1.You take the ID from the URL.
2.You search in your database for the original title
3. And then display it in the tag in the of your HTML.
Clarify if you have problem with any of the previous points.