Autor Zpráva
Jcas
Profil *
Možná špatná konstrukce php scriptu, ale řeším takový problém a řešení co mě napadá mi připadá strašně úchylné. Proto poprosím o radu, jak se to dělá.
ps. Vše co vypíšu je z jednoho souboru.

Na začátku máme toto:
$path = "./prihlasky.php?uzivatel=".$_SESSION['user'];

O kousek dál:
//--------------UPRAVIT-----------------
    //data uložím do asociativního pole $row, který použiju na vyplnění formuláře
if(isset($_GET['upravit']) && isset($_GET['id']) && is_numeric($_GET['id']) && ($_GET['upravit']==$_GET['id'])) {
    //form ještě nebyl odeslán---získání dat z DB
if(!isset($_POST['user'])) {
       $row = mysql_fetch_array(mysql_query("SELECT * FROM `".$tabulka."` WHERE `id` = '{$_GET['id']}'")) or die ("selhalo fetch aray" . mysql_error());
       $path.='&upravit='.$_GET['id'].'&id='.$_GET['id'];
    }
    //form byl odeslán a neprošel kontrolou
    elseif($formular==false) {
        foreach ($_POST as $key => $value) {
            $row[$key] = $_POST[$key];
            }
           $path.='&upravit='.$_GET['id'].'&id='.$_GET['id'];
        }
        //form odeslán a prošel kontrolou
        else {
            mysql_query("UPDATE `".$tabulka."` SET `pohlavi` = '{$_POST['pohlavi']}', `plemeno` = '{$_POST['plemeno']}', `barva` = '{$_POST['barva']}', `kolekce` = '{$_POST['kolekce']}', `tetovani` = '{$_POST['tetovani']}', `cena` = {$_POST['cena']}, `zvire` = '{$_POST['zvire']}' WHERE `id`= '{$_GET['id']}'"); 
            
    //---odeslání emailu (admin, user)---
    cs_mail('data@zocschmoravskebranice.eu', 'Změna přihlášek', 'Uživatel '.$kdo['jmeno'].' '.$kdo['prijmeni'].' změnil své přihlášky' , 'From: '.$kdo['email'].PHP_EOL);
    
    //---oodeslat hlavičku-----
    header("Location: ".$path);
            }
}    

A při zobrazení mám tento odkaz:
<a href="./prihlasky.php?uzivatel='.$_SESSION['user'].'&upravit='.$radek['id'].'&id='.$radek['id'].'">Upravit</a>

Form má action="'.$path.'" - tedy na $path nastavenou v sekci "upravit"

A co řeším a nevím jak na to je, že v okamžiku, kdy uživatel klikne na odkaz upravit již existuje nějaká adresa == nějaké $_GET a rád bych, aby se to po uložení změny vrátilo na tuto adresu.

- při kliknutí na odkaz "upravit" je správně, že se $_GET nepřenesou
- při odeslání formuláře je také vše správně
- ale po uložení změny bych se rád vrátil k původní adrese (a kdyby to bylo i třeba doprostřed stránky, když tam uživatel byl, tak by to bylo super)


Problém je, že nevím, jak se takové věci řeší.
Napřed mě napadlo vytvořit si nějakou $ a tu si přenášet.
Nyní mě napadlo, že bych tu adresu mohl strčit do $_SESSION. Pak bych ji nemusel přenášet a jenom bych si ji po uložení změn vyvolal.
Ale také mi připadá divné historii ukládat do session.
mzk
Profil *
Jcas:
nevím je to to co chceš, ale můžeš si $path předat pomocí
<input type="hidden" value="$path">

jinak je podle mě blbost předávat dvakrát něco co znáš viz. prihlasky.php?uzivatel='.$_SESSION['user']..., přece tu session nemusíš předávat ještě pomocí url, obdobně &upravit='.$radek['id'].'&id='.$radek['id'].'" - předáváš stejnou hodnotu ve dvou proměných..
Jcas
Profil *
Děkuji za reakci, ale při zobrazení formuláře není $path stejná, jako při situaci, kdy kliknu na "upravit". A to je dobře, protože chci zobrazit pouze formulář a ne spousty věcí okolo.

Jinak: prihlasky.php?uzivatel='.$_SESSION['user'] je kvůly admin přístupu, ale asi to je ipravdu zbytečné.
upravit='.$radek['id'].'&id='.$radek['id'] mám z naivní přdstavy bezpečnosti, kdy kontroluji rovnost. Mimochodem mě právě napadlo, že kdyby někdo odkoukal adressu a vypsal ji ručně, tak by mohl něco smazat.
mzk
Profil *
Jcas:
pokud je to v jednom souboru, tak klidně nech action="" a nebo jmeno toho souboru (scriptu), jinak pokud bys chtěl něco jako kontrolu, tak bys měl alespoň něco hashovat a pak porovávat hash.. měl bys nastavit uživateli práva na úpravu atd.. protože pak jak už si na to došel sám, může ti to kdokoliv pomazat..
Alphard
Profil
Jcas:
ale při zobrazení formuláře není $path stejná, jako při situaci, kdy kliknu na "upravit"
A co třeba vzít GET proměnné, (serializovat je) jako další parametr a pak se na něj vrátit?
Jcas
Profil *
Alphard:
vzít GET proměnné, (serializovat je) jako další parametr
Jak to myslíte? co to znamená serializovat.

Já si spíš říkal (nevím jestli to jde, nebo ne a jak se to dělá)

Prohlížeč má info o historii. Když kliknu třeba o tři kroky zpět, tak nejen, že mě to vrátí na původní adresu, ale dokonce si i pamatuje, v jaké části textu jsem byl. (např. když jsem byl na konci stránky, hodí mě to opět nakonec.)

Něco takového využít by pro mě bylo naprosto ideál. Ale nevím jak to funguje. Myslím, že tohle se týká cash a jestli je to pravda, tak dle toho co jsem četl by v tomto případě zobrazil sice historii, ale nenačetl by z DB tu opravu.

Ovšem cash (nebo jak kolega píše hash) jsou věci, se kterýma jsem ještě nikdy nic nedělal.


Smí se dělat ze session vícenásobné pole?
$_SESSION['history'][]=$path;
Akorát tohle má chybu, že pokud bude formulář odesílat s chybama - několikrát, tak nebudu vědět, kam ho mám vrátit.
mzk
Profil *
Jcas:
Ovšem cash (nebo jak kolega píše hash) jsou věci, se kterýma jsem ještě nikdy nic nedělal.
hlavně to jsou i dvě naprosto rozdílné věci.

Ohledně toho hashování jsem narážel na:
$path.='&upravit='.$_GET['id'].'&id='.$_GET['id'];

function skryj($text) { 
  return md5('predek'. $text . 'zadek');
}

$path.='upravit='.$_GET['id'].'&id='.skryj($_GET['id']);

if (skryj($_POST['upravit']) == $_POST['id'])....

Smí se dělat ze session vícenásobné pole?
$_SESSION['history'][]=$path;

určitě ano, je to proměnná tak jak "všechny ostatní"..

šak tu cestu kterou chceš tak si ulož buď do formuláře, nebo do session, cookie a pak ji jen jednoduše vypiš..
Alphard
Profil
Jcas:
Jak to myslíte? co to znamená serializovat.
Serializovat jsem myslel funkcí serialize(), ale to je jen implementační detail. Jde o to, že do té stránky upravit si můžete přece předat i parametry, které v ní nepotřebujte a pak s jejich pomocí přesměrovat. Mně se zdá, že se zbytečně pitvá naprosto triviální problém.
Jcas
Profil *
To jsem celý já - řešit triviální záležitost.
Takže takhle:
$edit->zobraz('
    <a href="./prihlasky.php?uzivatel='.$_SESSION['user'].'&upravit='.$radek['id'].'&id='.$radek['id'].'&history='.serialize($_GET)).'">Upravit</a> - 
    <a href="./prihlasky.php?uzivatel='.$_SESSION['user'].'&smazat='.$radek['id'].'&id='.$radek['id'].'&history='.serialize($_GET)).'" onClick="return klik()">Smazat</a>');

Form - action=""

A po uložení změn
else {
            mysql_query("UPDATE `".$tabulka."` SET `pohlavi` = '{$_POST['pohlavi']}', `plemeno` = '{$_POST['plemeno']}', `barva` = '{$_POST['barva']}', `kolekce` = '{$_POST['kolekce']}', `tetovani` = '{$_POST['tetovani']}', `cena` = {$_POST['cena']}, `zvire` = '{$_POST['zvire']}' WHERE `id`= '{$_GET['id']}'"); 

    
    //---oodeslat hlavičku-----
    header("Location: ".$path.'&'.unserialize($_GET['history']));
            }
Alphard
Profil
Nevidím otázku, ale myslím, že takhle to nemůže fungovat.
Jste velmi blízko, jen unserialize() vrátí původní pole, které je třeba naformátovat do tvaru key1=val1&key2=val2.
Jcas
Profil *
Děkuji - tuto chybu jsem už odhalil.
Ale ještě jedna. Zřejmě nějak není možné výsledek funkce serialize() předávat do odkazu. Do adresy.
Alphard
Profil
urlencode(serialize(...))

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: