Below I have provided 2 codes. Both make use of the urlencode(). They are nearly the same code.
I notice that, only the 1st code’s output is normal and not encoded while the 2nd one’s output is encoded. Why ?
Since both are making use of the urlencode() then shouldn’t both their outputs be in encoded format ? This has been greatly puzzling me for days now. I give-up. What’s the mystery behind this ?
1st Code:
““
$url = ‘http://nogdog.com/cat/subcat?var 1=value 1&var2=2&this other=thing&number is=12’;
echo prepare_url($url) . “n”;
function prepare_url($url) {
$url_parts = parse_url($url);
if($url_parts === false or empty($url_parts[‘host’])) {
return false;
}
$url_out = preg_match(‘/^https?/i’, $url_parts[‘scheme’]) ? strtolower($url_parts[‘scheme’]) : ‘https’;
$url_out .= “://{$url_parts[‘host’]}{$url_parts[‘path’]}”;
if(!empty($url_parts[‘query’])) {
parse_str($url_parts[‘query’], $query_parts);
foreach($query_parts as $q_key => $q_value) {
$query_string_parts[] = urlencode($q_key).’=’.urlencode($q_value);
}
$url_out .= ‘?’.implode(‘&’, $query_string_parts);
}
return $url_out;
}
2nd Code:
““
function prepare_url2($url) {
$url_parts = parse_url($url);
if($url_parts === false or empty($url_parts[‘host’])) {
return false;
}
// re-assemble the start of url string
$url_start = preg_match(‘/^https?/i’, $url_parts[‘scheme’]) ? strtolower($url_parts[‘scheme’]) : ‘https’;
$url_start .= “://{$url_parts[‘host’]}{$url_parts[‘path’]}”;
// rawurlencode the start of url string
$url_out = rawurlencode($url_start);
if(!empty($url_parts[‘query’])) {
parse_str($url_parts[‘query’], $query_parts);
foreach($query_parts as $q_key => $q_value) {
// assemble and check if value is numeric
$query_string_parts[] = urlencode($q_key).’=’.(is_numeric($q_value) ? intval($q_value) :urlencode($q_value));
}
$url_out .= ‘?’.implode(‘&’, $query_string_parts);
}
return $url_out;
}
$url = ‘http://zorg.com/cat/subcat?var 1=value 1&var2=2&this other=thing&number is=13’;
echo prepare_url2($url);
**NOTE
The difference between the two codes are that, the 1st one defines the $url and calls the prepare_url() function at the top. (Before the prepare_url() function’s code).
““
$url = ‘http://nogdog.com/cat/subcat?var 1=value 1&var2=2&this other=thing&number is=12’;
echo prepare_url($url) . “n”;
While, the 2nd one defines the $url and calls the prepare_url() function at the bottom. (After the prepare_url() function’s code).
““
$url = ‘http://zorg.com/cat/subcat?var 1=value 1&var2=2&this other=thing&number is=13’;
echo prepare_url($url);
Apart from that, both codes are the same.
So, if both the codes are the same (so to speak), then why does the 1st code output like this:
And, why does the 2nd code output like this:
http%3A%2F%2Fzorg.com%2Fcat%2Fsubcat?var_1=value+1&var2=2&this_other=thing&number_is=13