Data van de webpagina uit meerdere regels/records met elkaar vergelijken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bas van de Ven

Bas van de Ven

17/11/2018 15:39:12
Quote Anchor link
Vanuit een database tabel laat ik records op de pagina zien. Elke record met dezelfde velden. 1 query resultaat dus.
Het eerste veld is een geboortedatum en het 6e veld een nummer van een moederdier. Alle waardes in de velden op de pagina kunnen worden aangepast als de pagina is geladen.
Moeders kunnen vaker voorkomen. Niet binnen een record maar juist over verschillende records.
Als een moeder vaker voorkomt moet de combinatie datum met moeder van die moeders overal gelijk zijn. Daarop wil ik controleren/valideren.

De data komt uit een reader en kan op de webpagina worden gecontroleerd en beoordeeld door de gebruiker. Per record kan de gebruiker aangeven met een checkbox of het record kan worden ingelezen in andere tabellen binnen de database. Ook zit er een validatie bij het laden en het verversen (server-site) van de pagina. Indien niet gevalideerd is de checkbox disabled. Ook verschijnt de reden als tekst achter de regel. In dit geval bijv. "Datum is verschillend"

Bij het laden van de pagina kan ik, combi datum en moeder, controleren m.b.v. een query. Hoe kan ik deze combi valideren na het posten (verversen) van de pagina als datums en moeders (hier en daar) zijn gewijzigd ?

Kan dit door een array te vullen en deze door te lopen. Of kan valideren in dit geval (alleen) met javascript voordat de data naar de server wordt verstuurd ? Incl. bewerken/ (dis)ablen van een checkbox.

Ik wil dus data, afkomstig van de webpagina, uit meerdere regels/records met elkaar vergelijken. Zijn hier voorbeelden van ?
 
PHP hulp

PHP hulp

29/03/2024 07:03:14
 
Thomas van den Heuvel

Thomas van den Heuvel

18/11/2018 00:14:28
Quote Anchor link
Het klinkt alsof je dingen dubbel opslaat, en hierbij dus zelf dit probleem controleert creëert. Zou het niet veel makkelijker zijn om op een of andere manier in een aparte stap de data omtrent een "moeder" te regelen, en hier dan alle "moeder" gerelateerde data aan op te hangen, en dan in dat andere scherm koppel je moeders (maar alle moeder-data die daar aanhangt staat gewoon vast, het betreft immers dezelfde moeder).

Mijn eerste ingeving zou dus zijn dat dit probleem op een andere plek opgelost zou moeten worden. Je wilt ook van alles één bron hebben, en vervolgens refereren aan die ene bron. Niet meerdere items aanmaken en deze dan krampachtig synchroon te houden, dat is niet nodig als je één bron aanhoudt.
Gewijzigd op 18/11/2018 19:18:26 door Thomas van den Heuvel
 
Bas van de Ven

Bas van de Ven

18/11/2018 16:44:03
Quote Anchor link
Wat op de reader staat zijn geboren lammeren die zijn ingescand met hun bijbehorende moeder.
Een moeder kan maar 1 keer (lees 1 dag) werpen per half jaar. Per moederdier moeten dus alle geboortedatums van haar lammeren hetzelfde zijn per worp.
De data uit de reader wordt in een tabel (impReader) ingelezen en ter beoordeling getoond op de webpagina. Na controle kan de data worden weggegooid of ingelezen in de tabel tblSchaap.

De data op de webpagina in mijn topic is dus van tijdelijke aard en kan dus worden aangepast door de gebruiker. Op het moment dat deze data vanuit impReader op de pagina wordt getoond heb ik nog geen probleem. Met een query kan ik controleren of per moeder elke geboortedatum hetzelfde is. Wijzigt men de geboortedatum(s) van een lam op de webpagina dan wil ik aan de serversite (of cliëntsite) eerst controleren of de geboortedatums per moeder nog steeds hetzelfde zijn. Daarna wil ik de data pas (definitief) opslaan in de tabel tblSchaap. De data uit impReader is dan niet meer beschikbaar.

Toevoeging op 18/11/2018 16:50:03:

PS. Elk lam krijgt zijn eigen geboortedatum en is onderdeel van de hele historie van het lam.
 
Thomas van den Heuvel

Thomas van den Heuvel

18/11/2018 22:30:38
Quote Anchor link
Hm, ik zie nog steeds niet helemaal waarom je dan in eerste instantie gegevens (datums) zou moeten kunnen wijzigen als deze toch niet veranderd zouden mogen worden, tenzij dat wellicht is om een fout te herstellen (verkeerde datum opgegeven ofzo).

Ook zou je je kunnen afvragen waarom je meerdere invulvelden hebt voor geboortedatums als deze toch hetzelfde zijn voor een worp, zou het dan niet logischer zijn om worpen bij te houden met een datum, en dat als je lammeren definitief wegschrijft naar tblSchaap dat je de geboortedatum kopieert van de worp waar deze van afkomstig is? Dan sla je denk ik twee vliegen in één klap? Je hoeft dan alleen maar de datum van de worp te controleren, en je hoeft niet meer na te gaan of alle geboortedatums hetzelfde zijn, want die invulmogelijkheid is er simpelweg niet meer.

En als dat allemaal niet mogelijk is: het is zeer goed mogelijk om een serverside check uit te voeren, dit zou ik trouwens aanmoedigen als je de gegevens die aangeleverd worden niet helemaal kunt vertrouwen. Dit kun je op legio manieren oplossen. De simpelste vorm is waarschijnlijk een loopje waarmee je door de velden heenloopt. Vanaf het eerste veld houd je dan een datum bij, verandert de datum dan ben je klaar, alleen als alle datums hetzelfde zijn retourneer je een "ok". En als je dit ook nog moet spiegelen met informatie uit je database dan wordt het iets uitgebreider maar het idee blijft hetzelfde.
Gewijzigd op 18/11/2018 22:35:08 door Thomas van den Heuvel
 
Bas van de Ven

Bas van de Ven

19/11/2018 19:39:38
Quote Anchor link
Bedankt Thomas,

Ik kan er al wel iets mee.

Ad alinea 1 :
Het is inderdaad om fouten te herstellen.

Ad alinea 2 :
De reader is van een externe leverancier. Deze biedt, per lam (lees regel), data aan in een txt-bestand. Dus per lam o.a. de geboortedatum. De reader kent overigens verschillende acties en in mijn topic beperk ik me tot de actie 'Geboortes'.
Alleen de dekdatum sla ik op per moederdier (i.c.m. vaderdier). Werpdatum na ± 145 dagen is gelijk aan geboortedatum en sla ik als geboortedatum alleen op bij de historie van lam. Niet nog eens bij moeder.
Waarom => Gebruikers kunnen later vragen om een marge van enkele dagen dat een moeder kan werpen. Daar houd ik op deze manier rekening mee. 1 werpdatum per moeder werkt dan niet meer. Bovendien blijft mijn huidige data structuur ongewijzigd.

Ad alinea 3 :
Hierbij ga je er m.i. vanuit dat moederdieren bij elkaar staan. Het aantal regels in de reader en dus later op mijn webpagina zijn er vaak tientallen. Daarvan staan de moeders niet per definitie bij elkaar, verwachting is van wel. Query-result sorteren op moederdier zou een oplossing kunnen zijn. Her en der kàn moederdier vervolgens worden gewijzigd (reden zie Ad 1). Data moet ik dan op de webpagina sorteren. Daar ben ik niet bekend mee maar zal vast ergens zijn te vinden. Misschien heb je een tip waar.

Krijg je een idee van mijn beweegredenen ? :)
 
Thomas van den Heuvel

Thomas van den Heuvel

20/11/2018 00:47:23
Quote Anchor link
Ik begrijp het wel ongeveer, maar weet niet precies in welke vorm je dit wilt oplossen.

Je zou in ieder geval alles kunnen tellen, en als je per moeder meerdere geboortedatums hebt dan is er iets mis.
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
36
37
38
39
40
41
42
43
44
45
<?php
// https://www.phphulp.nl/php/forum/topic/data-van-de-webpagina-uit-meerdere-regelsrecords-met-elkaar-vergelijken/102557
// input; index 1 = birthdate, index 6 = mother id

$in = array(
    array(1 => '2018-11-20', 6 => 1),
    array(1 => '2018-11-20', 6 => 1),
    array(1 => '2018-11-20', 6 => 1),
    array(1 => '2018-11-20', 6 => 1),
    array(1 => '2018-11-20', 6 => 1),
    array(1 => '2018-11-20', 6 => 1),
    array(1 => '2018-11-19', 6 => 2),
    array(1 => '2018-11-20', 6 => 2),
    array(1 => '2018-11-20', 6 => 2),
    array(1 => '2018-11-20', 6 => 2),
    array(1 => '2018-11-20', 6 => 2),
    array(1 => '2018-11-21', 6 => 1),
    array(1 => '2018-11-20', 6 => 2),
);


// output
$out = array();

// build data
foreach ($in as $row) {
    // if mother is not registered yet
    if (!isset($out[$row[6]])) {
        // if birthdate is not register yet
        $out[$row[6]] = array();
    }
elseif (!isset($out[$row[6]][$row[1]])) {
        $out[$row[6]][$row[1]] = 0;
    }

    // add one animal to this mother and date
    $out[$row[6]][$row[1]]++;
}


// check for duplicate dates per mother
foreach ($out as $mother => $dates) {
    if (count($dates) > 1) {
        echo 'mother '.$mother.' has multiple birthdates:<br>';
        foreach ($dates as $date => $count) {
            echo '- '.$date.' ('.$count.')<br>';
        }
    }
}

?>

Op eenzelfde wijze kun je ook de desbetreffende records highlighten, en dan is het aan de invuller (of controleur?) om dit recht te breien.
 
Bas van de Ven

Bas van de Ven

28/11/2018 22:30:12
Quote Anchor link
Het is gelukt.
Inmiddels ben ik erachter wat je met jouw code doet en heb deze vervolgens geïntegreerd in mijn bestaande code.

elseif (!isset($out[$row[6]][$row[1]])) heb ik nog wel aangepast naar
if (!isset($out[$row[6]][$row[1]]))

Als 'if (!isset($out[$row[6]]))' van toepassing is dan is 'if (!isset($out[$row[6]][$row[1]]))' ook van toepassing. Andersom hoeft dat natuurlijk niet zo te zijn.

Bedankt voor het meedenken.
 



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.