Script draait niet onder PHP7

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bjorn Pas

Bjorn Pas

03/04/2018 13:01:10
Quote Anchor link
Hallo allen,

Ik ben nu al een week aan het zoeken waarom het scriptje dat ik heb niet draait.

De server draait met Ubuntu 16.04LTS server, en daar draait PHP 7 op.
Ik krijg totaal geen output van dit script.
Nu heb ik wel gelezen dat er mogelijk dingen zijn veranderd in syntaxing tov php5, maar ik weer nu echt even niet waar ik het in moet zoeken.


Het gaat om het volgende script:


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
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
<?
/*
 * PHP code snippet to calculate the distance and bearing between two
 * maidenhead QTH locators.
 *
 * Written by Fabian Kurz, DJ1YFK; losely based on wwl+db by VA3DB.
 *
 * You can do whatever you want with this code.
 *
 */



function valid_locator ($loc) {
    if (ereg("^[A-R]{2}[0-9]{2}[A-X]{2}$", $loc)) {
        return 1;
    }

    else {
        return 0;
    }
}

function
loc_to_latlon ($loc) {
    /* lat */
    $l[0] =
    (
ord(substr($loc, 1, 1))-65) * 10 - 90 +
    (
ord(substr($loc, 3, 1))-48) +
    (
ord(substr($loc, 5, 1))-65) / 24 + 1/48;
    $l[0] = deg_to_rad($l[0]);
    /* lon */
    $l[1] =
    (
ord(substr($loc, 0, 1))-65) * 20 - 180 +
    (
ord(substr($loc, 2, 1))-48) * 2 +
    (
ord(substr($loc, 4, 1))-65) / 12 + 1/24;
    $l[1] = deg_to_rad($l[1]);

    return $l;
}



function
deg_to_rad ($deg) {
    return (M_PI * $deg/180);
}

function
rad_to_deg ($rad) {
    return (($rad/M_PI) * 180);
}

function
bearing_dist($loc1, $loc2) {

    if (!valid_locator($loc1) || !valid_locator($loc2)) {
        return 0;
    }

        
    $l1 = loc_to_latlon($loc1);
    $l2 = loc_to_latlon($loc2);

    $co = cos($l1[1] - $l2[1]) * cos($l1[0]) * cos($l2[0]) +
            sin($l1[0]) * sin($l2[0]);
    $ca = atan2(sqrt(1 - $co*$co), $co);
    $az = atan2(sin($l2[1] - $l1[1]) * cos($l1[0]) * cos($l2[0]),
                sin($l2[0]) - sin($l1[0]) * cos($ca));

    if ($az < 0) {
        $az += 2 * M_PI;
    }


    $ret[km] = round(6371*$ca);
    $ret[deg] = round(rad_to_deg($az));

    return $ret;
}


/* Example usage: Distance and heading from JO60LK to JO61UA: */
$bd = bearing_dist("JO60LK", "JO61UA");
echo "$bd[km]km, $bd[deg]deg";

?>
 
PHP hulp

PHP hulp

19/01/2020 11:33:48
 
Jacco Engel

Jacco Engel

03/04/2018 13:11:18
Quote Anchor link
Hij gaat fout op regel 14. Ereg zit niet meer in PHP7
http://nl3.php.net/ereg
 
- Ariën -
Beheerder

- Ariën -

03/04/2018 14:22:05
Quote Anchor link
Als je foutafhandeling aanzet, dan zou je de errors moeten zien.
 
Thomas van den Heuvel

Thomas van den Heuvel

03/04/2018 16:39:29
Quote Anchor link
Inderdaad, een compleet blanke pagina wil zeggen dat er iets niet pluis is, in de errorlogs kun je dan meestal terugvinden wat er aan scheelt.

Ook het aanzetten van het melden+weergeven van fouten (wat in wezen de error(log)s direct op je scherm toont, zodat je niet in aparte bestanden hoeft te gaan graven) kan inzicht verschaffen.

Dit doe je als volgt (zet de volgende snippet bovenaan in het script):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
error_reporting(E_ALL); // welke fouten je wilt tonen (alle)
ini_set('display_errors', 'stdout'); // waar je fouten wilt tonen (het scherm)
?>


En zoals @Jacco aangeeft is ereg() vervallen in PHP 7 (en al sinds PHP 5.3 deprecated).

Een alternatieve implementatie van valid_locator() zou zoiets moeten zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function valid_locator ($loc) {
    return preg_match('/^[A-R]{2}[0-9]{2}[A-X]{2}$/', $loc) === 1;
}

?>

edit: delimiters toegevoegd zoals @Rob terecht aanhaalde, dat is het nadeel van aangedragen oplossingen niet testen :s
Gewijzigd op 03/04/2018 22:57:35 door Thomas van den Heuvel
 
Rob Doemaarwat

Rob Doemaarwat

03/04/2018 17:22:42
Quote Anchor link
Thomas van den Heuvel op 03/04/2018 16:39:29:
Een alternatieve implementatie van valid_locator() zou zoiets moeten zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function valid_locator ($loc) {
    return preg_match('^[A-R]{2}[0-9]{2}[A-X]{2}$', $loc) === 1;
}

?>

Maar dan met delimiters:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
preg_match('/^[A-R]{2}[0-9]{2}[A-X]{2}$/', $loc)
 
Bjorn Pas

Bjorn Pas

03/04/2018 18:32:08
Quote Anchor link
Hallo allen, wat een reacties geweldig.
Voor mij is PHP echt helemaal een nieuwe wereld, ik ben er nu 2 weken mee bezig om een mysql database uit te lezen.
Dat is inmiddels helemaal gelukt :-), elke dag leer ik weer wat nieuws.
Ik ga me zeker meer verdiepen in de error handeling, zeer nutting inderdaad.

Vanavond zal ik eens kijken of het stukje code van Thomas, en de eventuele aanpassing van Rob soelaas biedt.
In iedergeval heel erg bedankt voor het mee denken :-)
 
Bjorn Pas

Bjorn Pas

05/04/2018 18:58:28
Quote Anchor link
Ik heb vanmiddag even tijd gehad om het aangepaste script te testen.
Echter is krijg er geen data uit..

Ik heb het stukje script toegevoegd van Thomas wat betreft de error reporting.
En ik heb het preg_match stukje toegepast. met en zonder de aanpassing van Rob.
het scherm blijft blank, en ik zie ook geen error output verschijnen.

Het ziet er nu als volgt uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
error_reporting(E_ALL); // welke fouten je wilt tonen (alle)
ini_set('display_errors', 'stdout'); // waar je fouten wilt tonen (het scherm)
?>

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?
/*
 * PHP code snippet to calculate the distance and bearing between two
 * maidenhead QTH locators.
 *
 * Written by Fabian Kurz, DJ1YFK; losely based on wwl+db by VA3DB.
 *
 * You can do whatever you want with this code.
 *
 */




function valid_locator($loc) {
    return preg_match('/^[A-R]{2}[0-9]{2}[A-X]{2}$/', $loc)  === 1;
}


function
loc_to_latlon ($loc) {
    /* lat */
    $l[0] = (ord(substr($loc, 1, 1))-65) * 10 - 90 + (ord(substr($loc, 3, 1))-48) + (ord(substr($loc, 5, 1))-65) / 24 + 1/48;
    $l[0] = deg_to_rad($l[0]);
    /* lon */
    $l[1] = (ord(substr($loc, 0, 1))-65) * 20 - 180 + (ord(substr($loc, 2, 1))-48) * 2 + (ord(substr($loc, 4, 1))-65) / 12 + 1/24;
    $l[1] = deg_to_rad($l[1]);

    return $l;
}



function
deg_to_rad($deg) {
    return (M_PI * $deg/180);
}

function
rad_to_deg($rad) {
    return (($rad/M_PI) * 180);
}

function
bearing_dist($loc1, $loc2) {

    if (!valid_locator($loc1) || !valid_locator($loc2)) {
        return 0;
    }

        
    $l1 = loc_to_latlon($loc1);
    $l2 = loc_to_latlon($loc2);

    $co = cos($l1[1] - $l2[1]) * cos($l1[0]) * cos($l2[0]) + sin($l1[0]) * sin($l2[0]);
    $ca = atan2(sqrt(1 - $co*$co), $co);
    $az = atan2(sin($l2[1] - $l1[1]) * cos($l1[0]) * cos($l2[0]), sin($l2[0]) - sin($l1[0]) * cos($ca));

    if ($az < 0) {
        $az += 2 * M_PI;
    }


    $ret[km] = round(6371*$ca);
    $ret[deg] = round(rad_to_deg($az));

    return $ret;
}


/* Example usage: Distance and heading from JO60LK to JO61UA: */
$bd = bearing_dist("JO60LK", "JO61UA");
echo "$bd[km]km, $bd[deg]deg";

?>
 
Jan te Pas

Jan te Pas

05/04/2018 19:10:32
Quote Anchor link
M.i. moet de regel om te testen zijn:

echo $bd[km]."km, ".$bd[deg]."deg";
 
- Ariën -
Beheerder

- Ariën -

05/04/2018 19:11:31
Quote Anchor link
Doe eens op het laatste:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "<pre>".print_r($bd,true)."</pre>";
?>


Ik ben benieuwd wat er in de array zit.
 
Bjorn Pas

Bjorn Pas

05/04/2018 19:28:55
Quote Anchor link
- Ariën - op 05/04/2018 19:11:31:
Doe eens op het laatste:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "<pre>".print_r($bd,true)."</pre>";
?>


Ik ben benieuwd wat er in de array zit.


Hier krijg ik de volgende melding op:
Notice: Undefined variable: bd in /html/logbook/loc_calc.php on line 72

Dit met het originele script en het stukje aangepast met dan van Jan te Pas
Gewijzigd op 05/04/2018 19:29:33 door Bjorn Pas
 
- Ariën -
Beheerder

- Ariën -

05/04/2018 19:34:19
Quote Anchor link
Doe dat eens op die plaats van die echo. Want $bd hoort gewoon te bestaan.
 
Bjorn Pas

Bjorn Pas

05/04/2018 19:38:36
Quote Anchor link
- Ariën - op 05/04/2018 19:34:19:
Doe dat eens op die plaats van die echo. Want $bd hoort gewoon te bestaan.


/* Example usage: Distance and heading from JO60LK to JO61UA: */
$bd = bearing_dist("JO60LK", "JO61UA");
echo $bd[km]."km, ".$bd[deg]."deg";
echo "<pre>".print_r($bd,true)."</pre>";
?>

Heb het er nu onder geplaatst, en krijg nu dit terug op het scherm:

".print_r($bd,true).""; ?>
 
- Ariën -
Beheerder

- Ariën -

05/04/2018 19:42:52
Quote Anchor link
Moet wel binnen het PHP-blok tussen de php-tags uiteraard ;-)
Het is PHP en het blijft immers PHP.
 
Rob Doemaarwat

Rob Doemaarwat

05/04/2018 19:43:58
Quote Anchor link
Bij mij is ie helemaal notice en warning vrij als ik dit doe (oa netjes quootjes om de indices heen)
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
46
47
48
49
50
51
52
53
54
55
56
57
<?php


function valid_locator($loc) {
    return preg_match('/^[A-R]{2}[0-9]{2}[A-X]{2}$/', $loc)  === 1;
}


function
loc_to_latlon ($loc) {
    /* lat */
    $l[0] = (ord(substr($loc, 1, 1))-65) * 10 - 90 + (ord(substr($loc, 3, 1))-48) + (ord(substr($loc, 5, 1))-65) / 24 + 1/48;
    $l[0] = deg_to_rad($l[0]);
    /* lon */
    $l[1] = (ord(substr($loc, 0, 1))-65) * 20 - 180 + (ord(substr($loc, 2, 1))-48) * 2 + (ord(substr($loc, 4, 1))-65) / 12 + 1/24;
    $l[1] = deg_to_rad($l[1]);

    return $l;
}



function
deg_to_rad($deg) {
    return (M_PI * $deg/180);
}

function
rad_to_deg($rad) {
    return (($rad/M_PI) * 180);
}

function
bearing_dist($loc1, $loc2) {

    if (!valid_locator($loc1) || !valid_locator($loc2)) {
        return 0;
    }

        
    $l1 = loc_to_latlon($loc1);
    $l2 = loc_to_latlon($loc2);

    $co = cos($l1[1] - $l2[1]) * cos($l1[0]) * cos($l2[0]) + sin($l1[0]) * sin($l2[0]);
    $ca = atan2(sqrt(1 - $co*$co), $co);
    $az = atan2(sin($l2[1] - $l1[1]) * cos($l1[0]) * cos($l2[0]), sin($l2[0]) - sin($l1[0]) * cos($ca));

    if ($az < 0) {
        $az += 2 * M_PI;
    }


    $ret['km'] = round(6371*$ca);
    $ret['deg'] = round(rad_to_deg($az));

    return $ret;
}


/* Example usage: Distance and heading from JO60LK to JO61UA: */
$bd = bearing_dist("JO60LK", "JO61UA");
echo "{$bd['km']}km, {$bd['deg']}deg";

?>

Als je nu nog steeds een fout krijgt: op welke regel (van dit script, dan kunnen we mee tellen)?
 
Bjorn Pas

Bjorn Pas

05/04/2018 19:46:17
Quote Anchor link
Hoppa, dit script werkt!

Ik krijg keurig: 84km, 39deg

Ik ga eens die echo bestuderen..

Heel erg bedankt :-)
Gewijzigd op 05/04/2018 19:47:05 door Bjorn Pas
 



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.