Re: Problem with mod_rewrite and replacing spaces in URL
- From: David <seodave@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Wed, 18 Oct 2006 18:05:42 GMT
On Tue, 17 Oct 2006 11:55:44 -0700, Jeremy <jeremy@xxxxxxxxxxx> wrote:
David wrote:
Sent this to alt.php a couple of days back, but doesn't look like I'll
get an answer, so trying here.
I'm trying to convert a script to use friendly URLs, I've done this
before, but my PHP skills are quite basic so far, far from proficient
at this.
<snip>
One thing I immediately noticed: your text2url function lowercases
everything, but your Britney Spears example is capitalized.
I'd tried it with and without lowercase, so that wasn't a major
problem. Don't mind if the URls have upper case characters.
At a more fundamental level, how are you using the URL to lookup the
artists themselves? This is where the problem lies. You are going to
have to do the same transformation to the artist name when looking up
the artist that you did when creating the friendly URL.
For example, here is a simple scheme which lowercases the URL and
replaces spaces with dashes, and the corresponding database lookup.
.htaccess:
-----------------------------------------
RewriteRule ^artists/([^/]+) /artists.php?artistName=$1
-----------------------------------------
URL creation:
-------------------------------------------
$url = "/artists/" . strtolower(str_replace(" ", "-", $artistName));
-------------------------------------------
I've tried similar and it's worked fine with other sites, just this
one fails!
Tried a simpler function-
function safeurl($name){
$retVal = str_replace('/',' ',$name);
$retVal = str_replace('-',' ',$retVal);
return $retVal;
}
To replace a / with a space and spaces with a -
Example code-
$viewart = '<div style="clear:both; text-align:right;
padding-right:15px;">
<h4>View All <a
href="'.$site_url.''.safeurl($typ).'/Artist/'.safeurl($artist).'/1/">Polyphonic
Ringtones by '.$artist.'</a></h4>
</div>';
}
?>
<?php echo''.$viewart.'';?>
It works at code level, the \ and spaces are removed/replaced with -
when viewed in a browser but when clicking links they fail.
This code on the other hand works fine-
$viewart = '<div style="clear:both; text-align:right;
padding-right:15px;">
<h4>View All <a
href="'.$site_url.''.urlencode($typ).'/Artist/'.urlencode($artist).'/1/">Polyphonic
Ringtones by '.$artist.'</a></h4>
</div>';
}
?>
<?php echo''.$viewart.'';?>
This as expected replaces spaces with a + and characters like / are
replaced with %2F etc... the + URLs work but the / and some other
characters don't, so partial success.
I don't understand why the function fails?
Artist lookup (assumes PDO/PGSQL):
------------------------------------
$artist_query = $pdo->prepare("select * from artists where
LOWER(REPLACE(artist_name, ' ', '-')) = :artistName");
$artist_query->bindParam(":artistName", $_GET["artistName"]);
$artist_query->execute();
$artist = $artist_query->fetch();
-----------------------------
Does it make any difference that most of the data is from a CSV file
(no database)?
The code to get data is-
$row=0;
$file = fopen("$filepath", "r");
while (($data = fgetcsv($file, 1000, ";")) !== FALSE) {
if ($sct==''){
if ($data[$DATA["typ"]]==$typ and $data[$DATA["cat"]]==$cat or
$data[$DATA["typ"]]==$typ and $cat==''){
$row++;
$nam[$row] = $data[$DATA["nam"]];
$dsc[$row] = $data[$DATA["dsc"]];
$dsl[$row] = $data[$DATA["dsl"]];
$pth[$row] = $data[$DATA["pth"]];
$ppl[$row] = $data[$DATA["ppl"]];
} }
if ($sct>''){
if ($data[$DATA["typ"]]==$typ and $data[$DATA["cat"]]==$cat and
$data[$DATA["sct"]]==$sct){
$row++;
$nam[$row] = $data[$DATA["nam"]];
$dsc[$row] = $data[$DATA["dsc"]];
$dsl[$row] = $data[$DATA["dsl"]];
$pth[$row] = $data[$DATA["pth"]];
$ppl[$row] = $data[$DATA["ppl"]];
} }
}
fclose($file);
First time I've worked with a site using a CSV file.
Should I be replacing the spaces etc... in this code somehow?
This code will obviously not work verbatim; it's just an example of how
you need perform the same transformation on artist names when you're
looking them up, or the comparison won't work. Notice how in my SQL
query I'm comparing the passed-in artist name (in the form of
"britney-spears") with the artist name in the database (in the form of
"Britney Spears") only AFTER I transform the database version to the
proper format - LOWER(REPLACE(...)) transforms "Britney Spears" to
"britney-spears", making the comparison successful.
I tried variations of your code, but couldn't get anything to work.
Jeremy
Thanks very much for the advice so far, appreciated.
David
--
Free Search Engine Optimization Tutorial
http://www.seo-gold.com/tutorial/
.
- References:
- Prev by Date: mysql_free_result return error saying not valid mysql result resource
- Next by Date: How to detect if file download completed or cancelled
- Previous by thread: Re: Problem with mod_rewrite and replacing spaces in URL
- Next by thread: array_search() not working correctly?
- Index(es):
Relevant Pages
|