Diskuze: refresh v prohližeču
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, nemôžeš priamo zistiť refreshnutie stránky, ale možeš na to skúsiť použiť cookies
if (isset($_COOKIE['action'])) {
// akcia už prebehla
} else {
setcookie('action');
// spustiť požiadavku(query)
}
a závisí od tvojich požiadaviek... musíš rozhodnúť kedy cookies vymazať a/alebo spustiť akciu znova.
alebo nejako takto ... nastavíš si session cookie a potom musíš použiť podmienky
<?php
session_start();
if (!$_SESSION['loaded'])
{
// sem vlož svoj kod(požiadavky)
}
$_SESSION['loaded'] = true;
?>
Alebo ak nechceš použiť cookies a ani session, môžeš to skusiť cez php + ajax + javascript
function runQUERY()
{
xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","doIT.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send();
}
a javaScriptom jednoducho skontroluješ, či stránka bola refresnuta
<head>
<script type="text/javascript">
function checkRefresh()
{
if( document.refreshForm.visited.value == "" )
{
// This is a fresh page load
alert ( 'Fresh Load' );
document.refreshForm.visited.value = "1";
..call you AJAX function here
}
else
{
// This is a page refresh
alert ( 'Page has been Refreshed, The AJAX call was not made');
}
}
</script>
</head>
<body onLoad="checkRefresh()">
<form name="refreshForm">
<input type="hidden" name="visited" value="" />
</form>
</body>
</html>
a potom normálne v php
<?php
mysql_query("UPDATE---------");
//put any code here, i won't run on any page refresh
?>
(toto som našiel na StackOf)
Prepáč čítam to uz 5 krát a stale nerozumiem v com je problém. Skús to popísať trosku lepšie a určite nájdeme riešenie tvojho problému
Marian Benčat:6.10.2017 8:17
Osobně si myslím, že popsal strašně debilním způsobem problém s absencí PRG patternu u něj:
https://en.wikipedia.org/…Redirect/Get
Na druhou stranu u něj vidím ten redirect:
header("Location: servishw3new.php");
takže vlastně nevim
tak jsem se na to vyspal a myslim, ze reseni je jednoduche.
staci nepouzivat $_SESSION['edituj'] a misto
$_SESSION["edituj"]= htmlspecialchars($_REQUEST["idhw"],ENT_QUOTES);
tam dej
$edituj = htmlspecialchars($_REQUEST["idhw"],ENT_QUOTES);
a pak vsude misto $_SESSION['edituj'] pouzij to $edituj.
tj. polozka hw bude editovatelna jen na strance, ktera vykreslila editovaci formular po kliknuti na jeji tlacitko "Editovat cenu".
a tim padem ve chvili, kdy uzivatel da refresh a nebo odejde na jinou stranku, zrusi se editace
ALE ...
pokud naopak chces, aby dany radek s hw polozkou zustal editovatelny
- dokud uzivatel nezavre prohlizec
- nebo dokud nestiskne tlacitko cancel
a mezitim si mohl v tom samem tabu brouzdat, jak se mu zachce a kdykoli se vratit na editovaci stranku bez nutnosti klikat na editovaci tlacitko, tak to nech, jak to mas
ALE ...
neco mi rika, ze tebou pozadovane chovani bude neco mezi radky, co jsi nam tu nenapsal.
tedy ze chces zabranit konkretnimu problemu, ktery uzivatel aplikace
zpusobuje a je treba tomu zabranit
nebo ze neco uzivatele stve a ty to chces upravit, aby to uzivatele nestvalo
....
muzes sem napsat, k jakemu problemu dochazi a proc chces kod menit?
bude pak snazsi vymyslet nejake fikane reseni
michal Čepelák:11.10.2017 14:15
omlouvám se za špatné vyjadřování.
Jde o to že mám více stránek za sebou kde lze editovat a pokud je stránce
stejné id (i když je proměná id na každé stránce pod jiným názvem) tak
se mi po přepnutí na další stránku objeví editace na nové stránce pod
stejným id jako na předchozí stránce.
Jirka Jr:11.10.2017 15:24
takze predpokladam, ze tech vice stranek znamena co stranka, to jedna polozka hw v te tabulce...
tak pak je nejjednodussi to, co jsem napsal na zacatku mojeho prispevku ... tedy ukladat to id do promenne $edituj a ne do $_SESSION['edituj']
tim je ta promenna platna jen pro request, ve kterem se vykresli ten editacni formular a ne az do zavreni prohlizece nebo vyprseni session.
a jeste je samozrejme potreba zmenit chovani requestu na tlacitko cancel, ktere uz nerusi promennou v session, ale pouze reloaduje stranku ... protoze v requestu je jen 'cancel' a ne 'editujhw', tak se zrusi editace
uprava prvniho bloku kodu:
if (isset($_REQUEST["editujhw"])){
// promenna misto polozka v $_SESSION
$edituj= htmlspecialchars($_REQUEST["idhw"],ENT_QUOTES);
}
// nasledujici uz neni potreba, protoze promenna $edituj plati jen pro jeden request
// na jehoz konci je automaticky zrusena
/* if (isset($_REQUEST["cancel"])){
unset($_SESSION["edituj"]);
}
*/
if (isset($_REQUEST["savehw"]))
{
Db::connect();
$edit = Db::query('UPDATE servis_hw SET ticket=?, snhw=?, typhw=?, zavadahw=?, opravahw=?,opravilhw="'.$_SESSION["oprava_id"].'", oprcenahw=? WHERE idhw=?', $_POST['ticket'], $_POST['snhw'], $_POST['typhw'],$_POST['zavadahw'],$_POST['opravahw'],$_POST['oprcenahw'],$_POST['idhw']);
header("Location: servishw3new.php");
// toto uz neni potreba
//unset($_SESSION['editujhw']);
}
uprava druheho bloku kodu:
foreach ($servisHW as $hw)
{
// tady staci jen overit, ze se jedna o reakci na tlacitko "Edituj cenu"
// a ze se vykresluje formular pro pozadovany radek/id
if ((isset($_REQUEST["editujhw"])) and ($hw['idhw']==$edituj)){
echo '
<tbody>
<tr>
<td><form method="POST"><input name="idhw" type="hidden" value="'.$hw['idhw'].'">' . htmlspecialchars($hw['idhw']).'</td>
<td>' . htmlspecialchars($hw['datum']).'</td>
<td><input type="text" name="ticket" value="' . htmlspecialchars($hw['ticket']).'" /></td>
<td><input type="text" name="snhw" value="' . htmlspecialchars($hw['snhw']).'" /></td>
<td><input type="text" name="typhw" value="' . htmlspecialchars($hw['typhw']).'" /></td>
<td><input type="text" name="zavadahw" value="' . htmlspecialchars($hw['zavadahw']).'" /></td>
<td><input type="text" name="opravahw" value="' . htmlspecialchars($hw['opravahw']).'" /></td>
<td>' . htmlspecialchars($hw['uziv_jmeno']).'</td>
<td><input type="text" name="oprcenahw" value="' . htmlspecialchars($hw['oprcenahw']).'" /></td>
<td>
<button name="savehw" class="circular ui positive basic icon button" title="Uložit"><i class="ui save icon"></i></button>
<button name="cancel" class="circular ui negative basic icon tiny button" title="Zruš"><i class="ui remove icon " ></i></button>
</td>
</form></td></tr></tbody>
';
}else{
echo('<tbody>
<tr>
<td><form method="POST"><input name="idhw" type="hidden" value="'.$hw['idhw'].'">' . htmlspecialchars($hw['idhw']).'</td>
<td>' . htmlspecialchars($hw['datum']).'</td>
<td>' . htmlspecialchars($hw['ticket']).'</td>
<td>' . htmlspecialchars($hw['snhw']).'</td>
<td>' . htmlspecialchars($hw['typhw']).'</td>
<td>' . htmlspecialchars($hw['zavadahw']).'</td>
<td>' . htmlspecialchars($hw['opravahw']).'</td>
<td>' . htmlspecialchars($hw['uziv_jmeno']).'</td>
<td>' . htmlspecialchars($hw['oprcenahw']).'</td>
<td>
<button name="editujhw" class="circular ui red basic icon tiny button" title="Editovat cenu" onClick="edit()" ><i class="ui edit icon"></i></button>
<button name="delhw" onClick="return deletHw();" class="circular ui red basic icon tiny button" title="smazat cenu" ><i class="ui trash icon " ></i></button>
</td>
</form>
</tr>
</tbody>
');
}
}
jen nevim, kde se nastavuje $_SESSION["oprava_id"] a co se s ni vsechno dela, tak jsem to tam nechal
jo a kdyz takhle pouzijes jen obycejnou promennou $edituj misto polozky v
$_SESSION ....
tak po reloadu nebo prechodu na dalsi stranku se samozrejme krome zruseni
editace aj ztrati rozepsane hodnoty z formulare, ktere nebyly potvrzeny
tlacitkem savehw ...
proste tam na dalsi strance bude zas to, co uz je v databazi
pokud bys chtel nejake zapamatovavani rozepsanych hodnot, to by pak chtelo ponekud predelat a zapojit aj nejaky javascript, ale to je asi tema na dalsi diskuzni vlakno
Zobrazeno 8 zpráv z 8.