[PHP] IF sluit niet goed

Pagina: 1
Acties:
  • 1.691 views

Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik ondervind problemen met twee string filters (welke m.b.v. stripos werken), de filters werken gewoon goed, maar ze moeten afzonderlijk van elkaar werken. Ondanks dat ik van mening ben dat alle haakjes goed staan if(){ if(){} if(){} }, worden beide filters gecombineerd.

In de praktijk betekend dat met bijvoorbeeld de input:

"HELIKOPTER INZET VOOR LUTJEBROEK GRIP 1"

Hij "INZET VOOR" uit if 3 gebruikt én GRIP uit if 2, wat dus niet de bedoeling is.

De code:

PHP:
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
if ($from == "***@gmail.com") {

// edit email

$cut = split(" - ", $message);
$pri = substr($cut[2],0,3);
$sms = substr($cut[2],0,160);

// filter brandweer
//
// laat alles met "P 1" door (behalve in combinatie met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "CLASSIFICATIE" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "GRIP" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "GROTE BRAND" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat voor de rest niets door

if (stripos($pri, "P 1") !== false && stripos($cut[2],"OMS-BRANDALARM") === false && stripos($cut[2], "PAC-BRANDALARM") === false || stripos($cut[2],"CLASSIFICATIE") !== false || stripos($cut[2],"GRIP") !== false || stripos($cut[2],"GROTE BRAND") !== false) {
mail("***@gmail.com","BRANDWEER",$sms);
}
        
// filter lifeliners
//
// laat alles met "A1" in combinatie met "VIANEN" door
// laat alles met "INZET VOOR" in combinatie met "VIANEN" door
// laat voor de rest niets door
    
if (stripos($pri, "A1") !== false && stripos($cut[2],"VIANEN") !== false || stripos($cut[2], "INZET VOOR") !== false && stripos($cut[2],"VIANEN") !== false) {
mail("***@gmail.com","LIFELINERS",$sms);
}
    
}
?>


Zie ik wat over het hoofd?

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

Als je de ifjes nu eens nest, dan maak je het voor jezelf veel makkelijker. Zeker als je in elke if een echo geeft. Dan kun veel makkelijker debuggen!

Heb je wel wat met de opmerkingen van RobIII gedaan? RobIII in "[PHP] String filteren met str(i)pos"

En in algemene zin: Programming FAQ - Algemeen

[ Voor 12% gewijzigd door Matis op 09-07-2009 18:30 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Als je de ifjes nu eens nest, dan maak je het voor jezelf veel makkelijker. Zeker als je in elke if een echo geeft. Dan kun veel makkelijker debuggen!
Debuggen met echo gaat niet, omdat een piped e-mail het script aanroept. Kan het dus niet via de browser aanroepen.
Heb je wel wat met de opmerkingen van RobIII gedaan? RobIII in "[PHP] String filteren met str(i)pos"
Zoals je kan zien heb ik het filteren met stripos helemaal onder de knie
En in algemene zin: Programming FAQ - Algemeen
Ik dacht dat ik aan alle voorwaarden had voldaan in mijn openingspost. Heb alles zo goed mogelijk proberen te specificeren.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
F4T4L_3RR0R schreef op donderdag 09 juli 2009 @ 18:21:
Ondanks dat ik van mening ben dat alle haakjes goed staan if(){ if(){} if(){} }, worden beide filters gecombineerd.
Lees nog eens de syntax en stel die mening vervolgens bij. :> Zodra de conditie op regel 1 true is, zullen altijd de if condities op regels 17 en 27 geëvalueerd gaan worden.

Hints: Lees je nou eens echt in, zoek het else keyword op, vervang split() door explode() (want je gebruikt geen regex, laat staan dat je die deprecated ereg functie wil), doe iets aan je code style.
Vooral dat laatste puntje, want als je consistent indenteert zie je zelf het antwoord op je vraag.
F4T4L_3RR0R schreef op donderdag 09 juli 2009 @ 18:37:
Debuggen met echo gaat niet, omdat een piped e-mail het script aanroept. Kan het dus niet via de browser aanroepen.
Dan hardcode je $message en voila het kan opeens wel. Het probleem isoleren is ook standaard debugging.

[ Voor 25% gewijzigd door Voutloos op 09-07-2009 18:45 ]

{signature}


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

F4T4L_3RR0R schreef op donderdag 09 juli 2009 @ 18:37:
[...]


Debuggen met echo gaat niet, omdat een piped e-mail het script aanroept. Kan het dus niet via de browser aanroepen.
Dan vang je twintig berichtjes op waarmee je gaat testen, en zorg je dat er niet gemaild wordt? Dan kun je zo vaak echo'en als je wilt...

Als je dan gaat testen, probeer dan ook eens een adres als "WATERSNIP 1". ;)

[ Voor 9% gewijzigd door CodeCaster op 09-07-2009 19:08 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
F4T4L_3RR0R schreef op donderdag 09 juli 2009 @ 18:37:
Debuggen met echo gaat niet, omdat een piped e-mail het script aanroept. Kan het dus niet via de browser aanroepen.
Onzin natuurlijk. Dan maak je even een testpagina.
PHP:
1
2
3
4
5
6
7
8
$message = "blatiebla"

if (...) {
  if (...) {
    echo 'dinges';
  }
  etc..
}

En zelfs als je dat niet doet, maar per-se met email wil werken:
PHP:
1
2
3
4
5
6
7
8
9
10
$message = 'woei';

// edit email

$cut = split(" - ", $message);
$pri = substr($cut[2],0,3);
$sms = substr($cut[2],0,160);

mail('Test1 geeft:' . (stripos($pri, "P 1") !== false));
//etc...
F4T4L_3RR0R schreef op donderdag 09 juli 2009 @ 18:37:
Zoals je kan zien heb ik het filteren met stripos helemaal onder de knie
Want :? Het werkt niet, en je booleaanse logica klopt, klaarblijkelijk, ook niet want 't doet niet wat je wil...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 16-09 11:44
Meteen voeden vanuit je mail pipeline en doorsturen via mail is leuk maar niet erg praktisch voor testen, doe dat eerst even weg. De kern is het filteren en de logica.

Om te beginnen moet je een goed beeld krijgen van wat voor soort berichten je allemaal kan verwachten. Waarschijnlijk heb je dat wel, zet ze dan op papier of nog beter: bouw er een serie teststrings van die je aan jouw filter kan voeden.

Zo bijvoorbeeld:
PHP:
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
    // Functie voor filteren van de melding.
    // returnwaardes:
    //  TRUE = boodschap mag doorgelaten worden.
    //  FALSE = boodschap moet geblokkeerd worden.
    function filterMelding( $melding = '' )
    {
        // blablabla
    }

    // array met testmeldingen.
    $testMeldingen = array(
        'HELIKOPTER INZET VOOR LUTJEBROEK GRIP 1',
        'GRATIS DONUTS VIANEN GRIP 0'
        // etc etc.
    );
    
    // test het filter met alle testmeldingen.
    reset($testMeldingen);
    while( list($index,$melding) = each($testMeldingen) )
    {
        // gebruik het filter.
        $doorlaten = filterMelding( $melding );
        
        // bekijk het resultaat.
        printf( "%s (%d) \"%s\"\n", $doorlaten ? 'ja ' : 'nee', $index, $melding );
    }

Als je zoiets doet heb je een basis om uitgebreid te gaan testen hoe jouw filter op een bepaalde melding reageert en kan je logica ontdekken.

Daarnaast (wat RobIII ook aangeeft) kan je je filter ook nog eens elke conditie laten zien voor meer inzicht, daar kan je uithalen wat er nou fout gaat. Voorbeeld:
PHP:
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
    function filterMelding( $melding = '' )
    {
        // standaard: niet doorlaten.
        $doorlaten = false;
    
        // laat melding zien.
        printf( "filterMelding(\"%s\")\n", $melding );
        
        // eerste conditie, test op 'P 1' aan het einde.
        $pri = substr($melding,0,3);
        $posConditieP1 = stripos($pi, 'P 1');
        printf( "- heeft 'P 1' = %s\n", $posConditieP1 === false ? 'nee' , 'ja' );
        
        // /soortgelijk voor alle condities.
        // ...
        
        // daarna (eindelijk) de condities combineren.
        if( $posConditieP1 !== false &&
            $posConditieOMS === false       // etc. etc.
        )
        {
            // combinatie klopt, doorlaten.
            $doorlaten = true;
        }
        
        // geef het resultaat terug.
        return $doorlaten;
    }

(natuurlijk wel zelf uitbreiden en aanpassen, he?)

Is misschien veel werk, maar ik denk dat het je gaat helpen. Uiteindelijk kan je een waarheidstabel opstellen aan de hand van je testmeldingen en je logica op orde brengen. Je kan het later altijd uitbreiden; beter filteren (bv met preg_match), meer info er uit halen (bv het GRIP level), optimale propositielogica (meneer Karnaugh heeft daar wel iets leuks voor :') ).

Acties:
  • 0 Henk 'm!

  • DrClaw
  • Registratie: November 2002
  • Laatst online: 21-08 21:39
mee eens met wat cascade schrijft, maar ik zou dus niet zo'n grote filterfunctie schrijven.

eerder iets in de trant van:
PHP:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
$from = "***@gmail.com";
$message = "ONZIN - ONZIN - HELIKOPTER INZET VOOR LUTJEBROEK GRIP 1";

if ($from == "***@gmail.com") {

// edit email


$cut = split(" - ", $message);
$pri = substr($cut[2],0,3);
$sms = substr($cut[2],0,160);


// filter brandweer
//
// laat alles met "P 1" door (behalve in combinatie met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "CLASSIFICATIE" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "GRIP" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "GROTE BRAND" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat voor de rest niets door

process_brandweer_messages( $pri, $sms, $cut[2], "***@gmail.com", "BRANDWEER" );


// filter lifeliners
//
// laat alles met "A1" in combinatie met "VIANEN" door
// laat alles met "INZET VOOR" in combinatie met "VIANEN" door
// laat voor de rest niets door

if ( stripos($pri, "A1") !== false &&
        stripos($cut[2],"VIANEN") !== false ||
        stripos($cut[2], "INZET VOOR") !== false &&
        stripos($cut[2],"VIANEN") !== false) {
                stuurmail("***@gmail.com","LIFELINERS",$sms);
}

}

function stuurmail( $emailaddy, $code, $msg ) {
        if( true ) {
                echo "email: " . $emailaddy . "\n";
                echo "code: " . $code . "\n";
                echo "msg: " . $msg . "\n";
        } else {
                // mail( $emailaddy, $code, $msg );
        }
}

function process_brandweer_messages( $pri, $sms, $completemsg, $email, $code ) {
// filter brandweer
//
// laat alles met "P 1" door (behalve in combinatie met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "CLASSIFICATIE" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "GRIP" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat alles met "GROTE BRAND" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
// laat voor de rest niets door
        if( ( stripos($pri, "P 1") !== false ) && !( stripos($completemsg,"OMS-BRANDALARM") !== false ) || ( stripos($completemsg, "PAC-BRANDALARM") !== false ) ) {
                stuurmail($email,$code,$sms);
                return;
        }

        if( (stripos($completemsg,"CLASSIFICATIE") !== false) ) {
                stuurmail($email,$code,$sms);
                return;
        }

        if( ( stripos($completemsg,"GRIP") !== false ) ) {
                stuurmail($email,$code,$sms);
                return;
        }

        if( ( stripos($completemsg,"GROTE BRAND") !== false ) ) {
                stuurmail($email,$code,$sms);
                return;
        }
}
?>

Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
DrClaw,

Ik heb je code uitgeprint en probeer elke regel stap voor stap te begrijpen en verklaren wat het precies doet.

Snap alleen (nog) niet waarom het ene stripos gedeelte naar $cut[2] kijkt en het andere gedeelte naar $completemsg.

Ik ga even verder lezen en leren.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19-09 08:51

Janoz

Moderator Devschuur®

!litemod

Begin dan vooral hier met lezen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik snap niet waarom er een speciale functie voor het mailen aangemaakt is.

[ Voor 4% gewijzigd door F4T4L_3RR0R op 09-07-2009 23:27 ]


Acties:
  • 0 Henk 'm!

  • iMars
  • Registratie: Augustus 2001
  • Laatst online: 00:25

iMars

Full time prutser

PHP:
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
46
47
48
49
50
51
52
53
54
55
if ($from == "***@gmail.com")
{

    // edit email
    
    $cut = split(" - ", $message);
    $pri = substr($cut[2],0,3);
    $sms = substr($cut[2],0,160);
    
    // filter brandweer
    //
    // laat alles met "P 1" door (behalve in combinatie met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
    // laat alles met "CLASSIFICATIE" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
    // laat alles met "GRIP" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
    // laat alles met "GROTE BRAND" door (ook zonder "P 1" en/of met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
    // laat voor de rest niets door
    
    if (
        stripos($pri, "P 1") !== false
        &&
        stripos($cut[2],"OMS-BRANDALARM") === false
        &&
        stripos($cut[2], "PAC-BRANDALARM") === false
        ||
        stripos($cut[2],"CLASSIFICATIE") !== false
        ||
        stripos($cut[2],"GRIP") !== false
        ||
        stripos($cut[2],"GROTE BRAND") !== false
    ) 
    {
        mail("***@gmail.com","BRANDWEER",$sms);
    }
            
    // filter lifeliners
    //
    // laat alles met "A1" in combinatie met "VIANEN" door
    // laat alles met "INZET VOOR" in combinatie met "VIANEN" door
    // laat voor de rest niets door
        
    if (
        stripos($pri, "A1") !== false
        &&
        stripos($cut[2],"VIANEN") !== false
        ||
        stripos($cut[2], "INZET VOOR") !== false
        &&
        stripos($cut[2],"VIANEN") !== false
    )
    {
        mail("***@gmail.com","LIFELINERS",$sms);
    }
    
}
?>

Wat ik altijd doe, is alles geordend en netjes noteren. Zeker moet meerdere boleans vergelijkingen. Soms zie je door de bomen het bos niet meer.

Koop hier mijn P1 reader :)


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
@webmail: dat ziet er inderdaad veel overzichtelijker uit.

Heb nu trouwens dit:

PHP:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
if ($from == "***@gmail.com")
{

    // edit email
    
    $cut = explode(" - ", $message);
    $pri = substr($cut[2],0,3);
    $sms = substr($cut[2],0,160);
    
    // filter brandweer
    //
    // laat alles met "P 1" door (behalve in combinatie met "OMS BRANDALARM" en/of "PAC-BRANDALARM")
    // laat alles met "CLASSIFICATIE" door (behalve in combinatie met "A1" en/of "LIFELINER")
    // laat alles met "GRIP" door (behalve in combinatie met "A1" en/of "LIFELINER")
    // laat alles met "GROTE BRAND" door (behalve in combinatie met "A1" en/of "LIFELINER")
    // laat voor de rest niets door
    
    if (
        stripos($pri, "P 1") !== false
        &&
        stripos($cut[2], "OMS-BRANDALARM") === false
        &&
        stripos($cut[2], "PAC-BRANDALARM") === false
        ||
        stripos($cut[2], "CLASSIFICATIE") !== false
        &&
        stripos($pri, "A1") === false
        &&
        stripos($cut[2], "LIFELINER") === false
        ||
        stripos($cut[2], "GRIP") !== false
        &&
        stripos($pri, "A1") === false
        &&
        stripos($cut[2], "LIFELINER") === false
        ||
        stripos($cut[2],"GROTE BRAND") !== false
        &&
        stripos($pri, "A1") === false
        &&
        stripos($cut[2], "LIFELINER") === false
    ) 
    {
        mail("***@gmail.com","BRANDWEER",$sms);
    }
            
    // filter lifeliners
    //
    // laat alles met "A1" in combinatie met "VIANEN" door
    // laat alles met "INZET VOOR" in combinatie met "VIANEN" door
    // laat voor de rest niets door
        
    if (
        stripos($pri, "A1") !== false
        &&
        stripos($cut[2], "VIANEN") !== false
        ||
        stripos($cut[2], "LIFELINER") !== false
        &&
        stripos($cut[2], "VIANEN") !== false
    )
    {
        mail("***@gmail.com","LIFELINERS",$sms);
    }
    
}

Wat ook precies doet wat ik wil. :)

Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik loop weer tegen een nieuw probleem aan, maar vind het overbodig om wéér een nieuw topic aan te maken.

Als de $string het volgende bevat:

DIT - IS - MAAR - EEN - VOORBEELD

En ik wil EEN gebruiken, dan doe ik: $exploded = explode(" - ", $string)
Vervolgens staat EEN in $exploded[3].

Maar als $string opeens het volgende bevat:

DIT - IS - MAAR - EEN - SIMPEL - VOORBEELD

Dan wil ik EEN - SIMPEL gebruiken, maar dit gaat niet door het extra streepje.

Wat ik dan kan doen is $exploded = explode(" - ", $string, 4), dan krijg ik met $exploded[3]: EEN - SIMPEL - VOORBEELD.

Echter, ik wil - VOORBEELD er niet bij hebben. Helaas kan ik met de functie explode niet van rechts naar links zoeken.

[ Voor 14% gewijzigd door F4T4L_3RR0R op 10-07-2009 06:25 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Je weet dus zeker dat de eerste drie, en de allerlaatste entry in de array wegkunnen? Dan kun je met een creatief for-loopje terecht:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

function getWaarde($string)
{
    $arr = explode(" - ", $string);
    $result = array();

    for ($i = 3, $size = count($arr); $i < ($size - 1); $i++) {
        $result[] = $arr[$i];
    }

    return $result;
}

$string = "DIT - IS - MAAR - EEN - VOORBEELD";
echo implode(" - ", getWaarde($string));

$string = "DIT - IS - MAAR - EEN - SIMPEL - VOORBEELD";
echo implode(" - ", getWaarde($string));

?>


De eerste expressie van de for-loop is dus een waarde die overeenkomt met het aantal woorden dat je wilt overslaan (in dit geval de eerste drie). De tweede expressie is de vergelijking die waar moet zijn om door te gaan met de for-loop. In dit geval kijk je of de waarde kleiner is dan de lengte van de array, minus het aantal elementen dat je aan het einde wilt overslaan (in dit geval dus één).

Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Als "SIMPEL" er niet in voorkomt, geeft hij "EENEEN" in plaats van "EEN".

Ik heb het eerste gedeelte van de split wel nodig voor het script.

Zal even een praktijkvoorbeeld geven, de inputstring is:

code:
1
0708906 - 09-07-2009 15:29 - P 2 PERSOON-TE-WATER Zuidwal Eenh: VIA597 - Vianen - post Vianen - monitorcode


Gesplitst is dat:

code:
1
2
3
4
5
[0] 0708906
[1] 09-07-2009 15:29
[2] P 2 PERSOON-TE-WATER Zuidwal Eenh: VIA597
[3] Vianen - post Vianen
[4] monitorcode


Maar de melding had evengoed kunnen zijn:

code:
1
0708906 - 09-07-2009 15:29 - P 2 PERSOON - TE - WATER Zuidwal Eenh: VIA597 - Vianen - post Vianen - monitorcode


Gesplitst is dat:

code:
1
2
3
4
5
6
7
8
[0] 0708906
[1] 09-07-2009
[2] P 2 PERSOON
[3] TE
[4] WATER Zuidwal Eenh: VIA597
[5] Vianen
[6] post Vianen
[7] monitorcode


Als ik dan $string[2] doorlaat, geeft dat alleen "P 2 PERSOON"...

Zoals je kan zien heb ik de laatste 3 nooit nodig.

Nummer [0] gebruik ik, alsmede [2].

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Dan doe je daar toch gewoon een check op?

PHP:
1
2
3
if($string[3] == "TE") {
       //Hervorm array of iets dergelijks
}


Je hebt genoeg oplossingen tot je beschikking wat dat betreft, het is alleen even uitzoeken welke je moet gaan toepassen ;)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Sja, dan is wellicht een handige manier om het met een regexp (met preg_match) ipv je huidige strip/explode op te lossen en de losse velden op te vangen. Maar gezien de moeite die het je nu al kost om relatief eenvoudige constructies te gebruiken, weet ik niet of ik het wel aandurf je daar uberhaupt een voorbeeld voor te geven.
Bovendien werkt ook dat alleen maar als er een regulier patroon in zit, als je steeds wat anders ontdekt en/of noemt, wordt het lastig om daar een sluitend voorbeeld van te geven.

Een regexp die gewoon X velden splitst, waarbij in de eerste paar en de laatste paar geen " - " voorkomt is vrij eenvoudig, maar als ook daar weer " - " in voor kan komen...

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Als dit letterlijk de tekst is ( dus 1e niet en 3 laatste ook niet ), zou je nog kunnen overwegen om weer te imploden op alle andere elementen.

Is alleen erg foutgevoelig op het moment dat mensen de plaatsnamen ook met - gaan schrijven

Acties:
  • 0 Henk 'm!

  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09 22:20
Zo te zien komt de inputstring uit een email. Heb je zelf controle over hoe die email is opgebouwd? Kan me zo voorstellen dat die mail direct vanuit pdw wordt verstuurd?
Is er dan geen mogelijkheid een andere seperator te gebruiken voor de verschillende velden? Gebruik dan een seperator die niet voor kan komen in de meldtekst. Explode dan op die seperator en je probleem is opgelost.

offtopic:
Weet trouwens waar je mee bezig bent. Op deze manier verpreid je radioberichten die voor een specifieke ontvanger bedoeld zijn naar andere ontvangers. Dit is volgens de wetgeving illegaal.
Dat P2000 inmiddels algemeen goed is geworden, betekend nog niet dat het legaal is.

[ Voor 27% gewijzigd door PeetR op 10-07-2009 08:13 ]

Your time as a student is the best time of your life


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

PeetR schreef op vrijdag 10 juli 2009 @ 08:07:
offtopic:
Weet trouwens waar je mee bezig bent. Op deze manier verpreid je radioberichten die voor een specifieke ontvanger bedoeld zijn naar andere ontvangers. Dit is volgens de wetgeving illegaal.
Dat P2000 inmiddels algemeen goed is geworden, betekend nog niet dat het legaal is.
Tja, check deze site. http://www.alarmeringen.nl/ Daar kun je je ook abonneren op een *ongeval*. Ik mag hopen dat deze site ook niet in strijdt is met de wet.

Als de TS van deze site zijn feed haalt, dan is hij klaar. Helemaal XML geörienteerd en dus geen gekloot meer met implode, explode, foo's en bars ;).
Zie http://www.alarmeringen.nl/webfeeds.html voor het instellen van de regio en discipline!

Ik check op deze manier ook het nieuws van NU.nl (zie mijn signature).

Makkelijker kan bijna niet. Immers dwing je met XML af dat er in de juiste vakjes de juiste gegevens moeten zitten ;)

Edit:
Ik zie net dat je ook per regio EN discipline kunt zoeken. Wanneer de TS zijn/haar regio selecteert en de juiste dicipline (brandweer in dit voorbeeld) dan valt bijna de hele RSS binnen de scope van de TS.

[ Voor 16% gewijzigd door Matis op 10-07-2009 08:23 . Reden: RSS vergeten ;) ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09 22:20
offtopic:
En websites zoals http://www.alarmeringen.nl zijn ook in strijd met de wet.
Kijk maar eens in de fora van de diverse P2000-sites. Er zitten nog wel wat hiaten in. Men probeert zich te beroepen op de vrije radiowet (alles wat je zonder inspanning kan decoderen mag je horen), maar dat is niet helemaal juist. Het openbaar maken van aan specifieke ontvangers gerichte boodschappen is niet toegestaan.

edit: Ik ben geen jurist, maar volgens mij zit het zo ongeveer in elkaar.

Inderdaad is het gebruik van RSS-feeds en XML waar eea al gesplitst is natuurlijk het gemakkelijkst, maar ik heb het is dat de TS een eigen ontvanger heeft en deze diensten wil aanbieden aan bezoekers van zijn site.
Hij moet dus opzoek naar een methode om zelf de meldteksten te splitsen. Nu komen deze berichten al deels gesplitst binnen (in het protocol bestaan al verschillende velden), maar de TS plakt dit aan elkaar om het te versturen als email. Mijns inziens moet hij dus de seperator veranderen in een teken dat niet in meldteksten voorkomt.
Ik kan er natuurlijk volledig naast zitten. De TS moet maar eens vertellen waar zijn input vandaan komt en of dat misschien aan te passen is.

Edit2:
Ik gebruik die RSS-feed ook, maar er missen geregeld meldingen. Bovendien wil de TS het nog specifieker, hij wil niet alleen regio/discipline, maar uit een bepaalde regio ook alleen een bepaalde stad. Daarnaast wil hij alleen sturen als het een P1 melding of opschaling is. Dat betekend dat hij in die feed alsnog moet gaan filteren.

[ Voor 59% gewijzigd door PeetR op 10-07-2009 08:38 ]

Your time as a student is the best time of your life


Acties:
  • 0 Henk 'm!

  • Wilbert de Vries
  • Registratie: Augustus 2007
  • Laatst online: 17-09 21:02

Wilbert de Vries

Ex-hoofdredacteur
Even met privé-pet op
PeetR schreef op vrijdag 10 juli 2009 @ 08:26:
[offtopic]

Edit2:
Ik gebruik die RSS-feed ook, maar er missen geregeld meldingen. Bovendien wil de TS het nog specifieker, hij wil niet alleen regio/discipline, maar uit een bepaalde regio ook alleen een bepaalde stad. Daarnaast wil hij alleen sturen als het een P1 melding of opschaling is. Dat betekend dat hij in die feed alsnog moet gaan filteren.
Missen er nog steeds 'geregeld' meldingen? De server is onlangs vernieuwd en bevat nu een dual quadcore cpu met 8GB geheugen, waardoor de load gemiddeld rond de 0,50 schommelt (ipv 3 zoals op de vorige server met een single quadcore en 5GB geheugen). Overigens kunnen geregistreerde gebruikers op de site een eigen rss-feed samenstellen, bijvoorbeeld op basis van de alarmcode van een specifieke plaats. Dat zou al schelen :)

Of dergelijke projecten legaal zijn, is veel over te doen geweest. Volgens de letter van de wet mag je alles ontvangen, maar dit (in dit geval dus de P2000-berichten) niet wederopenbaar maken. Alarmeringen.nl bestaat echter al even en heeft in de tussentijd correspondentie gevoerd met het ministerie van Binnenlandse Zaken om te zorgen dat bepaalde meldingen niet op de site verschijnen (vrouwenhuizen, suicide, etc). Ik zie dit als een signaal dat het minimaal wordt gedoogd en dat er in ieder geval niet tegen Alarmeringen.nl zal worden opgetreden.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

Ah, wat toevallig:
De website en daartoe behorende diensten en/of producten, in persoon vertegenwoordigd door Wilbert de Vries, wonende te Loosdrecht.
Ik vond het al bijzonder dat je zoveel ins and outs wist ;)

[ Voor 15% gewijzigd door Matis op 10-07-2009 09:19 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Wilbert de Vries schreef op vrijdag 10 juli 2009 @ 09:13:
Even met privé-pet op
Missen er nog steeds 'geregeld' meldingen? De server is onlangs vernieuwd ...
offtopic:
Missende data heeft lang niet atijd met oude hardware te maken. ;) Misschien worden juist de items die gefilterd worden bedoeld. B)

{signature}


Acties:
  • 0 Henk 'm!

  • PeetR
  • Registratie: Februari 2002
  • Laatst online: 13-09 22:20
De laatste keer dat ik een melding miste is van 8/6.
(misschien een idee om met een dubbele flexbox te werken. Een box kan ook wel eens een melding missen ;))
En ja ik gebruik ook een gepersonaliseerde feed, met de voor mij belangrijke capcodes ;)

Ik ken inderdaad de discussies rondom de diverse websites. Laten we daar hier niet verder over discussiëren, op deze manier wordt het heel erg off-topic.

Het is aan de TS om eens te vertellen of hij iets aan zijn inputstring kan doen om het makkelijker te maken om de string op de juiste manier op te delen.

[ Voor 0% gewijzigd door PeetR op 10-07-2009 09:27 . Reden: typo's ]

Your time as a student is the best time of your life


Acties:
  • 0 Henk 'm!

  • Wilbert de Vries
  • Registratie: Augustus 2007
  • Laatst online: 17-09 21:02

Wilbert de Vries

Ex-hoofdredacteur
Voutloos schreef op vrijdag 10 juli 2009 @ 09:22:
[...]
offtopic:
Missende data heeft lang niet atijd met oude hardware te maken. ;) Misschien worden juist de items die gefilterd worden bedoeld. B)
offtopic:
Dat zou kunnen, maar eerlijk is eerlijk: in de vorige setup kon de code niet altijd alle meldingen goed verwerken - juist omdat er op de server meer gebeurde dan sec meldingen in de database schieten. Ongetwijfeld kan de code nog iets worden verbeterd, maar ik betwijfel of ik daar de meeste winst zou kunnen behalen. De meeste winst zou kunnen worden geboekt door direct vanaf de command line in het bewuste decodeerprogramma PDW de meldingen in de database te schieten. Maar dat vergt een complete remake van de code en vereist kennis die ik niet heb :$ Bovendien is dat een aanname, die me geen garantie geeft dat eea ook beter/sneller/<vul iets in> werkt.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

F4T4L_3RR0R schreef op vrijdag 10 juli 2009 @ 07:32:
Als "SIMPEL" er niet in voorkomt, geeft hij "EENEEN" in plaats van "EEN".
Nee hoor. Dat heeft waarschijnlijk met de weergave van dat scriptje wat ik gaf te maken. Hij gooit daar twee dingen direct achter elkaar, namelijk "EEN" en "EEN - SIMPEL", dan krijg je "EENEEN - SIMPEL". Maar dat heeft met de manier waarmee ik het outputte te maken, de functie werkt gewoon.
Ik heb het eerste gedeelte van de split wel nodig voor het script.

Zal even een praktijkvoorbeeld geven, de inputstring is:

code:
1
0708906 - 09-07-2009 15:29 - P 2 PERSOON-TE-WATER Zuidwal Eenh: VIA597 - Vianen - post Vianen - monitorcode


Gesplitst is dat:

code:
1
2
3
4
5
[0] 0708906
[1] 09-07-2009 15:29
[2] P 2 PERSOON-TE-WATER Zuidwal Eenh: VIA597
[3] Vianen - post Vianen
[4] monitorcode


Maar de melding had evengoed kunnen zijn:

code:
1
0708906 - 09-07-2009 15:29 - P 2 PERSOON - TE - WATER Zuidwal Eenh: VIA597 - Vianen - post Vianen - monitorcode


Gesplitst is dat:

code:
1
2
3
4
5
6
7
[0] 0708906
[1] 09-07-2009
[2] P 2 PERSOON
[3] TE[4] WATER Zuidwal Eenh: VIA597
[5] Vianen
[6] post Vianen
[7] monitorcode


Als ik dan $string\[2] doorlaat, geeft dat alleen "P 2 PERSOON"...

Zoals je kan zien heb ik de laatste 3 nooit nodig.

Nummer \[0] gebruik ik, alsmede \[2].
In dat geval kun je dus gewoon mijn scriptje aanpassen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php


function getWaarde($string)
{
    $arr = explode(" - ", $string);
    $result = array();

    for ($i = 3, $size = count($arr); $i < ($size - 3); $i++) {
        $result[] = $arr[$i];
    }

    return $result;
} 

$string = "0708906 - 09-07-2009 15:29 - P 2 PERSOON - TE - WATER Zuidwal Eenh: VIA597 - Vianen - post Vianen - monitorcode";

$array = explode(" - ",  $string);

$result = array_merge(array($array[0]), getWaarde($string));

?>

Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Excuses voor de verlate reactie van mijn kant. Was vandaag druk doende om al mijn websites en mailboxen te verhuizen samen met de hoster.

@Patriot:

Moet ik nog een implode functie toevoegen?

Ik heb nu dit:

PHP:
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
<?php

function getWaarde($string)
{
    $arr = explode(" - ", $string);
    $result = array();

    for ($i = 3, $size = count($arr); $i < ($size - 3); $i++) {
        $result[] = $arr[$i];
    }

    return $result;
}

$string = "0708906 - 09-07-2009 15:29 - P 2 PERSOON - TE - WATER Zuidwal Eenh: VIA597 - Vianen - post Vianen - monitorcode";

$array = explode(" - ",  $string);

$result = array_merge(array($array[2]), getWaarde($string));

$result2 = implode(" - ", $result);

// echo geeft: 0708906
echo $array[0];

// echo geeft: P 2 PERSOON - TE - WATER Zuidwal Eenh: VIA597
echo $result2;

?>

Heb ook:
code:
1
$result = array_merge(array($array[0]), getWaarde($string));


Moeten veranderen in:
code:
1
$result = array_merge(array($array[2]), getWaarde($string));



Edit:


code:
1
$result = array_merge(array($array[0]), getWaarde($string));


Geeft een Array:

code:
1
2
3
[0] 0708906
[1] TE
[2] WATER Zuidwal Eenh: VIA597


code:
1
$result = array_merge(array($array[1]), getWaarde($string));


Geeft een Array:

code:
1
2
3
[0] 09-07-2009 15:29
[1] TE
[2] WATER Zuidwal Eenh: VIA597


code:
1
$result = array_merge(array($array[2]), getWaarde($string));


Geeft een Array:

code:
1
2
3
[0] P 2 PERSOON
[1] TE
[2] WATER Zuidwal Eenh: VIA597


Ah, daar is de P 2 PERSOON weer!

@all:

Over de wetten m.b.t. het weder verspreiden van de berichten, daar ben ik goed van op de hoogte. Echter is het nog steeds voor eigen gebruik, dus toegestaan. E-mail en SMS is een gesloten systeem.

RSS feeds is ook een optie! Misschien is e-mail via een pipe sneller dan een cronjob, met het oog op het verkleinen van vertragingen? Hoe moet het e.e.a. verwerkt worden als er tijdens een cronjob van 1 minuut, meer dan 1 nieuw berichten binnen is gekomen op de feed?

Heb even een account aangemaakt op alarmeringen.nl en een persoonlijke feed samengesteld.

Even wat basiscode, wat verder uitgedacht en gebouwd moet worden als ik RSS wil gebruiken.

PHP:
1
2
3
4
5
6
7
8
9
<?php
$xml = simplexml_load_file('http://www.alarmeringen.nl/feeds/user/9074/6d8e4836f22d0a921638c5a785a62896/remonv.rss');

foreach($xml->channel->item as $item)
{
    echo '<h1>' .  $item->title . '</h1>';
    echo '<div>' . $item->description . '</div>';
}
?>


Hoewel ik zelf de mogelijkheid heb om te decoderen met PDW en daardoor wellicht de output aan kan passen, valt deze optie ook af. Ik mis namelijk veel berichten omdat ik P2000 decodeer via de geluidskaart. De RS232 poort heb ik al in gebruik om een ander datasignaal te decoderen. (USB/RS232 converters werken niet)

Ik krijg de e-mails via iemand anders aangeleverd.

[ Voor 59% gewijzigd door F4T4L_3RR0R op 11-07-2009 06:43 ]


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik heb vandaag zitten brainstormen.

Als ik gebruik maak van een RSS feed, dan moet ik het script via een cronjob aanroepen. Dat kan elke minuut.

Als ik het script wat de XML code ophaalt, maar een headline laat ophalen, dan stuurt deze door de cronjob toch elke minuut het script opnieuw aan, en dus elke minuut een mail uit.

Er zal dus iets moeten worden gemaakt waardoor de functies in PHP alleen worden aangeroepen als er een nieuwe headline is.

Daarnaast kan het ook zijn dat tijdens de opvolgende cronjob opeens 4 nieuwe berichten/headlines op de XML feed zijn verschenen, deze moeten dan alle 4 apart, een voor een worden uitgestuurd met de mailfunctie.

Ik denk dat dit wensenlijstje heel veel code met zich meebrengt, als het überhaupt al mogelijk is.

Lijkt me dan makkelijker om de suggestie van Patriot te gebruiken en te verbeteren. Zie daarvoor de post van mij hierboven.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Het enige foutje in mijn script was afaik de $i = 3 op regel 9, dat moest $i = 2 zijn. Je zei namelijk dat je het element op index 0 en op index 2 nodig had. Soms staan er ook streepjes in wat eigenlijk één stuk moet zijn, waardoor hij die ook opdeelt en index 2 als het ware in meerdere elementen zit. Je weet echter zeker dat je de laatste drie niet nodig hebt, en alles daarvoor wel.

Anyway. Als je van die $i = 3 nou even $i = 2 maakt, dan heb je volgens mij wat je wilt in een array. Dan is het inderdaad zo dat als je het wilt weergeven je moet imploden. Verder is dit eigenlijk wel iets wat je zelf had uit moeten kunnen vogelen. Is het niet gewoon zo dat je te weinig kennis van de programmeren hebt?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Patriot schreef op zaterdag 11 juli 2009 @ 22:03:
Is het niet gewoon zo dat je te weinig kennis van de programmeren hebt?
Die conclusie is hier al vaker getrokken...


Don't get me wrong; we worden echt niet allemaal op magische wijze als "programmeur" geboren. We hebben allemaal ooit een "Hello world" gemaakt en zijn van daar uit verder moeten gaan. Maar wat jij, F4T4L_3RR0R, doet is gewoon in het wilde weg wat aanrommelen met functies en net zo lang pielen tot het werkt zonder te begrijpen waarom dat dan zo is. Het is allemaal prima te doen wat je wil, maar daar heb je gewoon een fatsoenlijke basis voor nodig wil je dat een beetje goed kunnen uitvoeren en daar ontbreekt het bij jou gewoon (nog) aan. Probeer eens een stapje terug te doen en je eerst eens even eigen te maken hoe het nou precies allemaal werkt. Neem eens een tutorial of pruts wat aan met kleine testprojectjes. Dit project is je klaarblijkelijk nog te veel en, zoals gezegd, dat is niet erg maar dan moet je ook van ons niet verwachten dat wij je handje gaan vasthouden en je bij ieder akkefietjes bijstaan.

De helft van je problemen, zo niet alle, in je topics van afgelopen dagen zijn gewoon puur een gebrek aan basiskennis en gebrek aan inzicht. Los van het feit nog dat je gewoon niet (of amper) debugged (Debuggen: Hoe doe ik dat?).
F4T4L_3RR0R schreef op zaterdag 11 juli 2009 @ 02:49:
@Patriot:

Moet ik nog een implode functie toevoegen?
Vragen als deze zijn, sorry dat ik het zeg, kompleet loos. Je kunt, als je wat inzicht hebt, prima zelf beantwoorden of dat zo zou zijn, en zo ja, waar dan. Je vraag slaat dan ook als een tang op een varken.

Hoe dan ook; ik heb het een beetje gehad met deze basic vraagjes topics en verzoek je dus vriendelijk, maar met klem, te zorgen dat je bij een volgend topic wat meer kennis onder je gordel hebt en minstens wat eigen uitpluiswerk hebt gedaan (en dan niet op basis van gokwerk).

[ Voor 10% gewijzigd door RobIII op 11-07-2009 22:11 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.