Diskuze: Metoda GET
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tak řešení je celá řada:
1. necháš pomlčku, a jako oddělovač se bude počítat pouze ta
první. Asi takto:
foreach(explode('/','/key-pair/key2--value') as $pair){
$parts = explode('-',$pair,2);
list($key,$value) = $parts; // TODO ošetřit, že existuje key, value
}
2. lze se inspirovat např. u Yii1, které používá notaci
/key1/val1/key2/val2
**3. lze se inspirovat u Nette a nebo většiny webů s hezkou URL
U hezkých url není cílem zbavit se otazníků a ampersandů. Cílem je zbavit
se názvu parametru. Takže třeba Nette parametry pojmenuje automaticky podle
pozice - máš třeba
actionFoo($id,$name){
...
}
Aby toto zavolal jdeš na url /foo/1/myname
- to je pro
uživatele mnohem pohodlnější, ale hlavně je to pro tebe pohodlnější,
jakmile implementuješ ten mechanismus.
Jestli se nepletu, tak první pomlčka bude vždy, tedy jestli jich po první pomlčce bude milion je úplně jedno, protože již budou součástí hledaného výrazu. Jen bych pomlčky před hledáním nahradil mezerama a ještě bych je algoritmem, zkrátil na jednu, když jich za sebou bude víc. Já to tak mám udělaný taky. Viz to co používám:
function hezka_url($nadpis)
{
$prevodni_tabulka = Array('ä'=>'a','á'=>'a','à'=>'a','ã'=>'a','â'=>'a','č'=>'c','ć'=>'c','ď'=>'d','ě'=>'e','é'=>'e','ë'=>'e','è'=>'e','ê'=>'e','í'=>'i','ï'=>'i','ì'=>'i','î'=>'i','ľ'=>'l','ĺ'=>'l',
'ń'=>'n','ň'=>'n','ñ'=>'n','ó'=>'o','ö'=>'o','ô'=>'o','ò'=>'o','õ'=>'o','ő'=>'o','ř'=>'r','ŕ'=>'r','š'=>'s','ś'=>'s','ť'=>'t','ú'=>'u','ý'=>'y','ů'=>'u','ü'=>'u','ù'=>'u','ũ'=>'u','û'=>'u','ž'=>'z','ź'=>'z');
$nadpis = strtr(mb_convert_case($nadpis, MB_CASE_LOWER, "UTF-8"),$prevodni_tabulka);
$url = $nadpis;
$url = iconv("utf-8", "us-ascii//TRANSLIT", $url);
$url = strtolower($url);
$url = preg_replace('/[^-a-z0-9_ ]+/i', '', $url);
$pole = explode(" ",$url);
$url = implode("-",$pole);
$url = preg_replace('/--/i', '', $url);
return $url;
}
zkusím to znovu s příkladem
url: https://server/…obsah_18-Vse
první pomlčka je uživatelský vstup z pole název (prostě uživatel zadal
vyhledávat pomlčku) a ostatní mi oddělují proměnné a hodnoty
co se vyhledávání týká, první pomlčka může a nemusí být, ale
potřeboval bych ji někde mezi potvrzením formuláře a znovunačtením
stránky vyescapovat (resp. převést na něco jiného)
zatímco ostatní pomlčky, co nejsou uživatelským vstupem, ale oddělovači
proměnných a hodnot bych potřeboval zachovat v aktuálním stavu
Petr Čech:
ad2, je vpodstatě co používám, jen jako oddělovač používám pomlčku,
kdybych to předělal na lomítka, jen tím přesunu problém na jiný znak
(problém nastane znovu při vyhledávání lomítka)
Myslím, že bych vpodstatě asi potřeboval zjistit, jakým způsobem metoda GET funguje
A proč nepoužiješ POST? Tam můžeš mít proměnní i s diakritikou, včetně pomlček, podtržítek.
A jen nápad, kdybys chtěl vytrvat na tom GET a chtěl přenést pomlčku, co ji při zpracování dotazu převést na slovo? př:
$dotaz = preg_replace('/-/i', ' pomlcka ', $url);
TLDR; Do GETu taky můžeš narvat cokoliv, jsou pro to funkce urlencode a urldecode.
Pokud použiješ styl 2, můžeš udělat
"/key/".urlencode($value)
. Potom při dekódování jen uděláš
urldecode. Lomítko je tady mnohem lepší, protože z urlencode ti lomítko
určitě nevyleze, navíc je to pro URL typický oddělovač.
Jinak bych ale měl jinou poznámku. Celé to, co děláš je k ničemu, to
není pretty url, v podstatě děláš úplně to samé jako standardní GET,
jen je to mnohem těžkopádnější.
Pretty url se dělá především proto, aby se eliminovaly klíče a nahradily
se jen pozicí:
/key1/value1/key2/value2
-
je to vlastně to samé jako ?key1=value1&key2=value2, jen jsi prohodil
pár znaků/value1/value2
, co že to je za proměnné
ti určí controller, a převede to na parametry metody.David Hynek:
V POST to původně bylo, a ano, tam s tím není problém. Předělávka do GET
byla z toho důvodu, aby šly výsledky hledání snadno uložit do záložek
(to s POST neuděláš).
Petr Čech:
Aha, ok. Tak to není pretty url a pokud chápu správně, nebylo by pro mě
vhodné, protože potřebuji vědět, co bylo zatrženo a z hodnot samotných se
to zjistit nedá.
Kód na serveru jsem vpodstatě zdědil a po odeslání formuláře,
dochází k průchodu krz .htaccess, kde se celá část za vyhledavani/ (https://server/…obsah_18-Vse) převede na GET[prom1], a to
se následně zpracovává.
Jediné co mě napadá, je pomlčku v názvu nahradit javascriptem před
odesláním.
Nejvíce by se mi líbilo, odchytit $_GET[nazev] hned po odeslání formuláře
(před průchodem krz .htaccess) a v té chvíli zakódovat třeba pomocí
urlencode($_GET[nazev]), ale netuším, zda to vůbec jde.
A proč znovuvynalézáš kolo a nenecháš to prostě v tom původním formátu? Ty stejně musíš udělat urlencode(), takže jediné, co měníš oproti standardnímu GET tvaru jsou oddělovače.
Petr Čech:
nejsem si 100% jist, co myslíš tím původním formátem, ale pokud to chápu
dobře, vpodstatě tvrdíš, že je špatně ta část co převádí celý
výraz na GET[prom1], respektive .htaccess. S tím se dá souhlasit, ale zrovna
tomu jsem se snažil pokud možno vyhnout... Změnou v .htaccess toho můžu
rozbít nejvíc.
Aktuálně tam mám
AddDefaultCharset UTF-8
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.anime\.akihabara\.cz
RewriteRule (.*) http://anime.akihabara.cz/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^anime.akihabara\.cz/index.php
RewriteRule (.*) http://anime.akihabara.cz/ [R=301,L]
Options +Indexes
Options +FollowSymLinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.*)/(.*)$
RewriteRule ^(.*)/(.*)$ /$1.php?prom1=$2 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /chyba.php [L]
a nevím jak z toho vyjmout vyhledávání, aniž bych poškodil něco jiného
tak to udelej jeste jinak viz
RewriteRule ^(.*)/(.*)$ /$1.php?prom1=$2 [L,QSA]
nahrad
RewriteRule ^(.*)/(.*)$ /zpracuj.php?ukol=$1&prom1=$2 [L,QSA]
A pak muzes v promenne ukol odchytit vyhledavaji od ostatnich ukolu, ktere pak jednoduse nasmerujes kam potrebujes.
pouzivam toto
function escapeUrl(str)
{
var func;
func = encodeURIComponent || encodeURI || escape;
return func(str);
//encodeURIComponent(value).replace(/!/g,'%21').replace(/'/g,'%27').replace(/\(/g,'%28').replace(/\)/g,'%29').replace(/\*/g,'%2A').replace(/%20/g,'+');
}
function escapeHtml(str) {
var map = {
"&": "&",
"<": "<",
">": ">",
"\"": """,
"'": "'"
};
return str.replace(/[&<>"']/g, function(m) { return map[m]; });
}
v php mam podobne funkce, pouziti vypata takto
$str = ' <td><a href="'. escapeHtml('zas_upl.php?form_type=upload&file='.escapeUrl($item->name_full)) .'" class="btn btn-mini" target="blank">Upload</a></td>';
Cili escapujes values
str = 'odesli.php?ukol=' + escapeUrl(hodnota) + '&prom1=' + escapeUrl(hodnota)
A pak to cele escapjes na html, abys to mohl vypsat do html kodu
str = escapeHtml(str);
alert('<a href="' + str +'">');
vyhledavani/--nazev_kde-obsahuje-obsah18-Vse
S takovym parsovanim hodne stesti. Jedine nahradit, jak psal Hynek, pomlcku
necim jinym.
$dotaz = preg_replace('/-/i', ' nahrazeno ', $url); // viz Hynek
Na jednu stranu chces hezkou url, ale na druhou stranu chces escapovat pomlcku
Urlencode pomlcku samo
neescapuje, protoze pomlcka je povoleny znak. Takze, ve tvem pripade budes muset
pouzit tu variantu s replace a najit si v tabulkach, jake ma pomlcka
alternativy.
Postup:
1. https://translate.google.com/
'pomlcka' - cestina do anglictiny - 'dash'
2. google.com
'php url encode dash'
$dotaz = preg_replace('/-/i', ' nahrazeno ', $url); // viz Hynek
3. https://stackoverflow.com/…d-dot-in-php
$str = str_replace('.', '%2E', $str);
$str = str_replace('-', '%2D', $str);
nebo bod 2
google = ascii table url dash
-> https://www.ascii.cl/htmlcodes.htm
-> minus: dec = 45, hex = 2D, symbol = -, html_number = -, html_name =
(nic, ale mam pocit, ze existuje −), mean (vyznam) = minus sign
Zobrazeno 13 zpráv z 13.