Tijdens while loop veldwaarden vergelijken uitlog script

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Yoop Overmaat

Yoop Overmaat

26/03/2016 10:59:34
Quote Anchor link
Ben weer eens aan het knutselen met een eind jaren 90 site en kom een JS bugreport
onder Firefox tegen waardoor het geheel aangepast moest worden. Het is een uitlog
script onder php & jquery ajax. Het eerste deel werkt nu, het tweede deel niet.
Het tweede gedeelte & punt waar het om draait.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
session_start();
include("conn.php");
$id = $_SESSION['id'];

$sql = "SELECT id, servtijd, speltijd, nickname FROM spelers";
if($result = mysqli_query($link, $sql)) {
while($rij = mysqli_fetch_array($result)) {

$servje = $rij['servtijd']; //ijkveld
$spelje = $rij['speltijd']; //controleveld

//Controle of velden gelijk zijn, zo nee uitloggen via query


if ($servje > $spelje) { //Heb zo het idee dat dit een blunder is
                            
$query="UPDATE spelers SET saw = '-',room = '-',enz='..' WHERE id ='$id'";
if(mysqli_query($link, $query)){
header("uitlog.html");
}
else {
echo "foutje3" . mysqli_error($link);
      }
    }
  }

mysqli_free_result($result);
}

mysqli_close($link);
?>


Werkt het geheel niet vanwege het gegeven dat je in een while lus met meerdere rijen
werkt? In dat geval zou het logsch zijn. In welke richting moet je de oplossing dan
zoeken?
 
PHP hulp

PHP hulp

25/12/2024 15:37:28
 
Thomas van den Heuvel

Thomas van den Heuvel

26/03/2016 14:30:25
Quote Anchor link
- spring eerst je code eens fatsoenlijk in, dit is onleesbaar
- zouden deze queries niet in een transactie moeten staan?
- controleer welke queries uitgevoerd worden
- wat bedoel je in hemelsnaam met "werkt geheel niet": wat verwacht je wat deze code doet, en wat is het (ongewenste) resultaat?
- je header is fout; waarschijnlijk bedoel je header('Location: uitlog.html');
- daarnaast kan de UPDATE query meerdere keren worden uitgevoerd omdat header('Location: ...') je niet direct automagisch transporteert naar de nieuwe locatie, dit gebeurt pas aan het einde van het script

Ga voor jezelf eerst na wat dit script zou moeten doen, en ga dan pas dingen aanpassen.
 
Yoop Overmaat

Yoop Overmaat

26/03/2016 16:24:42
Quote Anchor link
Je hebt gelijk. Zal het geheel eerst wat fatsoeneren & het hele verhaal hier neerzetten. Is dat mogelijk?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/03/2016 16:36:17
Quote Anchor link
Thomas van den Heuvel op 26/03/2016 14:30:25:
- daarnaast kan de UPDATE query meerdere keren worden uitgevoerd omdat header('Location: ...') je niet direct automagisch transporteert naar de nieuwe locatie, dit gebeurt pas aan het einde van het script


Hetgeen eenvoudig op te lossen is door er een exit; achter te zetten.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// ...

header('Location: logout.html');
exit;

// ...
?>
 
Thomas van den Heuvel

Thomas van den Heuvel

26/03/2016 21:28:57
Quote Anchor link
Frank Nietbelangrijk op 26/03/2016 16:36:17:
Hetgeen eenvoudig op te lossen is door er een exit; achter te zetten.

Dat zou ik pas doen als duidelijk is wat het script zou moeten doen. Mogelijk wil je die header (met exit) pas na de while-loop aanroepen.
 
Yoop Overmaat

Yoop Overmaat

08/04/2016 12:36:12
Quote Anchor link
De oplossing was nog al een puzzel maar is gevonden.

Na een eerdere post is het geheel gefatsoeneerd en aangepast en heb wat aangereikte ideetjes
uitgeprobeerd zoals een mysqli_multi_query of transaction. In combinatie met een session gaat
dit geheid een keer mis, sessie valt een keer weg, gevolg een empty_string en lege velden in
een tabel. Dit is niet tegen te gaan maar het abstractie niveau stijgt ineens want er spelen
nog meer problemen. In hetzelfde script blokkeert het verhaal en met 1 veld is er geen kader
ter referentie op te zetten. Dus je zult twee velden aan moeten maken in een tabel,de eerste
als ijkwaarde genaamd servtijd en de tweede als controlewaarde genaamd speltijd.

De opzet zoals hij nu is werkt, heb eerst de reset van beide velden in elkaar geknutseld, het
ding heet tijd0.php, volgens het bottom-up systeem opgebouwd vanwege het abstracte en om de
daarop volgende problemen tegen te gaan. De opbouw kan daarom nogal vreemd overkomen.
De opbouw is nu tijd1 -> redirect tijd0.php(reset) of tijd2.php ->(uitloggen) komt.

Dit is tijd1.php;

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
session_start();
include("cnnc.php");

$id = $_SESSION['id'];

$sql = "SELECT MAX(servtijd) FROM spelers";
if($result = mysqli_query($link, $sql)) {
while($rij = mysqli_fetch_array($result)) {
$klok = $rij['MAX(servtijd)'];
    }

mysqli_free_result($result);
  }
else {
echo "Oeps1:\n" . mysqli_error($link);
}


if($klok >= 9999) {
header("location:tijd0.php");
}
else {
$query = "UPDATE spelers SET servtijd = '$klok', speltijd = '$klok' WHERE id = $id'";
if(!mysqli_query($link, $query)) {
echo "Oeps2:\n" . mysqli_error($link);
}


$doei1 = $klok-1;

$sql = "SELECT servtijd, speltijd FROM spelers WHERE speltijd = 'doei1' AND status = 'online'";
if(mysqli_query($link, $sql)) {
$_SESSION['klok'] = $klok;
header("location:tijd2.php");
       }
else {
echo "Oeps3:\n" . mysqli_error($link);
    }
}

?>


Als de klok zijn max heeft behaald redirecten naar tijd0.php, beide velden resetten naar 0 en
terugverwijzen naar tijd1.php waardoor er automagisch een loop of lus ontstaat. Tijd0.php;

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
include("cnnc.php");
$query = "UPDATE spelers SET servtijd = '0', speltijd = '0'";
if(mysqli_query($link, $query)) {
header("location:tijd1.php ");
}
else {
echo "Meuh1:\n" . mysqli_error($link);
}

?>


Is de maxtijd niet behaald maar zit er wel verschil tussen de ijk en controlewaarde dan door
sturen middels een redirect naar tijd2.php, de moeilijkheid is hier het moment van inloggen
onder een client & de daarbij behorende variabelen; client reageert niet meer of is de netwerk
verbinding is traag? Dit is de reden van een $doei2 als maximale grens....Tijd2.php;

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
session_start();
include("cnnc.php");
}

$klok = $_SESSION['klok'];

$doei2 = $klok-5;    

$query = "UPDATE spelers SET servtijd='0', speltijd='0', room='none', saw='-',status='offline',
type='0', gstat='0' WHERE speltijd='$doei2'"
;
if(!mysqli_query($link, $query)) {
echo "Oeps4:\n" . mysqli_error();
}

mysqli_close($link);
?>


Hoe spreek je je dit verhaal onder Jquery - ajax aan?
 
Jan R

Jan R

08/04/2016 12:42:29
Quote Anchor link
Thomas van den Heuvel op 26/03/2016 14:30:25:
- spring eerst je code eens fatsoenlijk in, dit is onleesbaar


En je springt nog steeds niet in
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
if($code=='good'){
    echo 'Ik schrijf goede code';
}else{
    echo 'Ik schrijf slechte code';
}
 
Yoop Overmaat

Yoop Overmaat

08/04/2016 12:49:52
Quote Anchor link
Ow? Dus als jij in de sloot springt moet ik er maar achter aan springen?
Wie denk jij nu wel niet dat je bent? Zolang als het werkt, werkt het & ik laat me door jou echt niet de les lezen!
Gewijzigd op 08/04/2016 12:52:31 door Yoop Overmaat
 
Ben van Velzen

Ben van Velzen

08/04/2016 13:30:50
Quote Anchor link
Yoop, als je fatsoenlijke antwoorden wil krijgen is medewerking van jouw kant wel belangrijk. Als je gevraagd wordt je onleesbare brei om te zetten naar iets leesbaars zodat je geholpen kan worden hoef je niet zo extreem te reageren. Daarnaast zul je zelf een hoop fouten al kunnen herkennen als je netjes inspringt.
 
Randy vsf

Randy vsf

08/04/2016 13:33:38
Quote Anchor link
Ben van Velzen op 08/04/2016 13:30:50:
Als je gevraagd wordt je onleesbare brei om te zetten naar iets leesbaars zodat je geholpen kan worden


Yoop, kijk eens in de documentatie van je editor. Hier zijn functies voor.
 
Marthijn Buijs

Marthijn Buijs

08/04/2016 14:32:29
Quote Anchor link
Yoop Overmaat op 08/04/2016 12:49:52:
Zolang als het werkt, werkt het & ik laat me door jou echt niet de les lezen!


Maar blijkbaar moet je toch 'de les lezen' want het werkt niet..
Je mag er ook op rekenen dat mensen die je helpen verstand hebben van zaken en praktische tips hebben.
 
Yoop Overmaat

Yoop Overmaat

08/04/2016 15:05:21
Quote Anchor link
@Ben van Velzen
Ik heb mijn onleesbare brij naar een leesbaar en werkend iets omgezet op aangeven van de aanwezigen op dit forum, dus?
Heb alleen de oplossing voor het verhaal hier neergezet zodat mocht er iemand hetzelfde probleem tegenkomen hij/zij niet
opnieuw het wiel uit hoeft te vinden.

@Randy vsf
Editor? Daar heb ik me nog nooit aan gewaagd. Ik programmeer source from scratch op een nano onder Linux, het /var/apache/error-log is mijn kompas in deze.




Toevoeging op 08/04/2016 15:09:00:

Doe me een lol en lees nu eens de vraag aan het einde van het verhaal, hoe spreek je dit aan onder een jquery - ajax?
Heb er zelf ook een handje van, lees te snel en plemp maar iets.....
 
Marthijn Buijs

Marthijn Buijs

09/04/2016 12:31:05
Quote Anchor link
Aangezien het probleem van Yoop nog niet verholpen is, ging ik er maar iets aan doen.
Ik heb even je code omgetoverd tot leesbare code, dit zal de medemensen op dit forum ook helpen..

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
session_start();

include "conn.php";

$id = $_SESSION['id'];
$sql = "SELECT id, servtijd, speltijd, nickname FROM spelers";

if ($result = mysqli_query($link, $sql)) {
    while ($rij = mysqli_fetch_array($result)) {

        $servje = $rij['servtijd']; //ijkveld
        $spelje = $rij['speltijd']; //controleveld

        // Controle of velden gelijk zijn, zo nee uitloggen via query

        if ($servje > $spelje) { // Heb zo het idee dat dit een blunder is
            $query = "UPDATE spelers SET saw = '-', room = '-', enz='..' WHERE id ='" . $id . "'";

            if (mysqli_query($link, $query)) {
                header("uitlog.html");
            }
else {
                echo "foutje3 " . mysqli_error($link);
            }
        }

    }


    mysqli_free_result($result);
}


mysqli_close($link);

?>


Verder denk ik dat je in je eerste query het id uit de session mee moet geven en niet een while-loop moet gebruiken, zodat je één rij krijgt.
Gewijzigd op 09/04/2016 12:44:39 door Marthijn Buijs
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.