Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Hvordan laves/bruges flag for udført

22 views
Skip to first unread message

Kurt G.

unread,
May 16, 2012, 4:27:24 AM5/16/12
to
Jeg har en side, hvor der er 8 forskellige forme. Alle disse forme kalder
samme side igen og udfører forskellige ting.
Bl.a. skal der gemmes data i en database, og det vil jo blive gjort hver
gang man beder om at få siden opdateret (F5).
Koden for en af disse ser således ud:

if (isset($_POST['GEM_NY_ADMIN']))
{
if (isset($_POST['NyAdminNavn'])) {$brugernavn = $_POST['NyAdminNavn'];}
else {$brugernavn = "";}
(flere af samme slags)
$sql="INSERT INTO $database1 (forening, ...) VALUES
('$foreningsnr',....)";
if (!mysql_query($sql,$forbindelsen))
{
die('Fejl ved indsættelse af ny administrator: ' . mysql_error());
}
}

Hvordan kan jeg indføre et 'flag' for, at posten allerede er gemt een gang,
når der trykkes på F5?

Mvh Kurt


Birger Sørensen

unread,
May 16, 2012, 5:08:33 AM5/16/12
to
Kurt G. skrev:
Det kan gøres på mange måder - og forskellige, hvis de 8 opgaver skal
udføres i en bestemt eller vilkårlig rækkefølge.
Du kan bruge 8 forskellige variable, som sættes falsk fra starten, og
sand efterhånden som opgaverne udføres - kan nok med fordel være et
array -, eller en enkelt integer, der sættes til 0 fra starten, og hver
udført opgave sætter et givet bit.
Værdier for et sådant flag er 1,2,4,8,16,32,64,128
Men det bør for læsbarhed udføres med konstanter;
define('NONE', 0);
define('FIRST', 1);
define('SECOND', 2);
define('THIRD', 4);
define('FOURTH', 8);
osv
Du sætter flaget med f.eks.
$flag = $flag | SECOND;
Og checker det med
if (($flag & SECOND) == SECOND) { ... }
Og det fjernes igen med
$flag = $flag & ~SECOND;

Hvis man har brug for en indikator for hvor langt man er nået, kan man
bruge << og >>
Man starter med at sætte den til den første
$progress = FIRST;
For hvert succesfuldt trin, opdaterer man den
$progress = $progress << 1
Afhængig af opgaven, kan man bruge en sådan indikator alene.

Se evt også
http://dk.php.net/manual/en/language.operators.bitwise.php

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://skippersevent.dk


Karl Erik Christensen

unread,
May 16, 2012, 5:19:32 AM5/16/12
to
Jeg ser umiddelbart 3 muligheder, men der er sikkert flere:

Date - gem dato/tid for opdatering i databasen.
Cookie - sæt cookie med xx levetid.
Session - $_SESSION form1 -> opdateret.

Karl Erik.

--
http://dmwebdesign.dk/karlerik/ - Ny hjemmeside
http://produceret-i.dk/ - Køb danske produkter

Kurt G.

unread,
May 16, 2012, 7:54:46 AM5/16/12
to
"Karl Erik Christensen" skrev i meddelelsen
news:4fb37110$0$285$1472...@news.sunsite.dk...

KLIPPET

Jeg ser umiddelbart 3 muligheder, men der er sikkert flere:

Date - gem dato/tid for opdatering i databasen.
Cookie - sæt cookie med xx levetid.
Session - $_SESSION form1 -> opdateret.

Karl Erik.

-----------------------------------------------------------------------------------------
Tak for svarene fra jer begge.
Jeg havde tænkt på både SESSION og cookies, men synes ikke, at jeg kan få
flowet til at fungere.

Det, som jeg havde forestillet mig, er noget lignende:

<form method="POST" action="<? echo $_SERVER['PHP_SELF']; ?>">
<input type='hidden' name='GemAdmin' value='1'>
<input type="submit" value="Gem den nye adminstrator"
name="GEM_NY_ADMIN">
</form>

if ((isset($_POST['GEM_NY_ADMIN'])) AND isset($_POST['GemAdmin'])))
{
gør noget....
Sæt $_POST['GemAdmin'] til 1
}
Hvis det ikke kan lade sig gøre, efterlyser jeg nok et eksempel, der viser
hvordan jeg i flowet gør med f.eks. SESSION.

Mvh Kurt

Bertel Lund Hansen

unread,
May 16, 2012, 8:02:41 AM5/16/12
to
Kurt G. skrev:

> Hvis det ikke kan lade sig gøre, efterlyser jeg nok et eksempel, der viser
> hvordan jeg i flowet gør med f.eks. SESSION.

Du kan f.eks. lade SESSION-variablen huske værdien af
POST-variablen. Hvis den er uændret, skal der ikke gemmes.

Med forkortet pseudokode:

if (POST!=SESSION) {
gem_værdien();
SESSION=POST;
}
else {
message("Værdien er allerede gemt!");
}

--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/

Birger Sørensen

unread,
May 16, 2012, 9:28:14 AM5/16/12
to
Kurt G. kom med denne ide:
if (!isset($_SESSION['progress')) || ($_SESSION['progress'] == 0)) {
$_SESSION[progress'] = 1;
}
switch ($_SESSION['progress']) {
case 2 :
if (success behandl data fra form1) {
$_SESSION['progress'] = $_SESSION['progress'] << 1;
}
break;
case 4 :
if (success behandl data fra form2) {
$_SESSION['progress'] = $_SESSION['progress'] << 1;
}
break;
case 8 :
if (success behandl data fra form3) {
$s_SESSION['progress'] = $_SESSION['progress'] << 1;
}
break;
case 16 :
if (success behandl data fra form4) {
$_SESSION['progress'] = $_SESSION['progress'] << 1;
}
break;
case 32 :
if (success behandl data fra form5) {
$_SESSION['progress'] = $_SESSION['progress'] << 1;
}
break;
// osv - bemærk at case-værdien skal ganges med 2 hver gang
// Første gang checkes ikke - der skal blot vises første form
}
switch ($_SESSION['progress']) {
case 1 :
// Vis form1
break;
case 2 :
// vis form2
break;
case 4 :
// vis form3
break;
case 8 :
// vis form4
break;
case 16 :
// vis form5
break;
case 32 :
// vis form6
break;
// osv - bemærk at case-værdien skal ganges med 2 hver gang
// Sidste gang skal formentlig vises noget andet end en form...
}

Shift left operationen:
$session['progress'] = $session['progress'] << 1;
kan også udføres som en mulitplikation med 2:
$_SESSION['progress'] *= 2;
Simplere, men midre læsevenligt.

Man kan udføre det samme med et hidden-field i formene. Man skal så
bare bruge den læste værdi i stedet for $_SESSION, og man skal sætte
værdien, når formen skal vises.
Strengt taget behøver man heller ikke bruge et egentligt flag, men kan
bruge "almindelig" talrækkefølge. Man skal så lægge een til i stedet
for shift left (eller gange med 2) - det er så bare ikke det der
forstås (jeg forstår) ved et flag; hvilket for så vidt og for opgaven,
vel er ligegyldigt. :-Z

Karl Erik Christensen

unread,
May 16, 2012, 12:12:13 PM5/16/12
to
Du kunne f.eks. dimensionere:

class Session
{
var $form1;
var $form2;
var $form3;
osv.

I formene sætter du så onsubmit:
onsubmit='$this->formx = "opdateret"'

Så kan du vælge at undlade at vise formen hvis den er opdateret, i din
if isset funktion:

if(!isset($_SESSION['formx']) {
visformx; }
else { ....... }

Kurt G.

unread,
May 17, 2012, 5:53:29 AM5/17/12
to
"Karl Erik Christensen" skrev i meddelelsen
news:4fb3d1c5$0$295$1472...@news.sunsite.dk...
---------------------------------------------------------------------------------------
Tak for forslagene, jeg vil kikke nærmere på dem.
Mvh Kurt

Jonathan Stein

unread,
May 23, 2012, 7:14:48 AM5/23/12
to
Den 16-05-2012 10:27, Kurt G. skrev:

> Hvordan kan jeg indføre et 'flag' for, at posten allerede er gemt een
> gang, når der trykkes på F5?

Når jeg laver forms over flere sider, plejer jeg at indsætte de allerede
udfyldte felter som hidden input felter.

På den måde kan brugeren bladre frit frem og tilbage, siden er ikke
afhængig af sessions og jeg kan gemme alle data samlet, så jeg ikke
risikerer "halve" data i databasen.

Når jeg har gemt data på sidste side, laver jeg en redirect til en
slut-side. Så er der ikke nogen fare, hvis brugeren trykker F5.

M.v.h.

Jonathan

Kurt G.

unread,
May 26, 2012, 11:55:21 AM5/26/12
to
"Jonathan Stein" skrev i meddelelsen
news:4fbcc6a4$0$289$1472...@news.sunsite.dk...
-----------------------------------------------------------------------------------------------
Det lyder som en interessant måde at kare det på!
Mvh Kurt
-----------------------------------------------------------------------------------------------
M.v.h.

Jonathan

0 new messages