Diskuze: Metoda GET
Petr Čech:23.7.2018 9:34
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.
David Hynek:23.7.2018 10:04
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;
}
VelkyBubak:23.7.2018 10:39
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
David Hynek:23.7.2018 12:01
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);
Neaktivní uživatel:23.7.2018 12:09
TLDR; Do GETu taky můžeš narvat cokoliv, jsou pro to funkce urlencode a urldecode.
Petr Čech:23.7.2018 12:33
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í:
- toto v podstatě není pretty url:
/key1/value1/key2/value2
- je to vlastně to samé jako ?key1=value1&key2=value2, jen jsi prohodil pár znaků - toho je pretty url:
/value1/value2
, co že to je za proměnné ti určí controller, a převede to na parametry metody.
VelkyBubak:23.7.2018 14:22
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.
Petr Čech:23.7.2018 15:37
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
David Hynek:23.7.2018 20:33
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.