Veranderen van PHP-code

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Lambert Mertens

Lambert Mertens

29/05/2019 09:57:23
Quote Anchor link
Ik heb een Raspberry PI met een Apache2 webserver en een voorbeeld project.
Werkt perfect.
Nu wil ik de PHP-code veranderen van het voorbeeld project. (eerste keer dat ik PHP gebruik)
Als ik (om te beginnen) een simpel echo-statement of print statement toevoeg in de werkende PHP-module, dan krijg ik de run-time error:
localhost meldt het volgende: Something went wrong.

Wat moet ik nog doen om de wijziging te laten werken.
 
PHP hulp

PHP hulp

29/11/2024 06:50:00
 
- Ariën  -
Beheerder

- Ariën -

29/05/2019 10:14:13
Quote Anchor link
Wat doe je precies? En waar komt die (onduidelijke) melding vandaan?
 
Lambert Mertens

Lambert Mertens

29/05/2019 12:26:58
Quote Anchor link
Het voorbeeld project displayt 8 knoppen. Als je die indrukt, verandert de kleur van de betreffende en gaat een IO pin aan.
Het voorbeeld project werkt perfect. Bestaat uit drie files: gpio.php, index.php en script.js. En natuurlijk de jpg-files voor de knoppen.
Nu wil ik de IO-aansturing veranderen in de file gpio.php. Deze file bevat een routine, die aangeroepen wordt als er een knop ingedrukt wordt.
Eerst heb ik een statement toegevoegd: echo ("button");
Daarna heb ik de Apache geherstart. En de browser gestart met localhost.
Als ik dan op een knop druk (op het scherm), dan wordt deze routine in de file gpio.php aangeroepen en komt meteen deze melding
Localhost meldt het volgende:
Something went wrong.

Toen heb ik dat opgezocht en er wordt iets verteld van development omgeving en productie omgeving.

Moet ik iets doen met 'make'? En met 'install'?
 
Ivo P

Ivo P

29/05/2019 12:57:02
Quote Anchor link
Lambert Mertens op 29/05/2019 12:26:58:

Moet ik iets doen met 'make'? En met 'install'?


Nee zeker niet: het herstarten van Apache, of je device, was al overbodig!

Draai eerst die verandering in je script eens terug, en kijk of alles dan weer werkt. Daarmee sluiten we eerst uit dat het aan het herstarten ligt.
 
Lambert Mertens

Lambert Mertens

29/05/2019 13:32:08
Quote Anchor link
Ik heb de verandering weggehaald en dat werkt alles weer. Ook zonder herstart van Apache.
Dit heb ik verschillende maken herhaald.
 
Ivo P

Ivo P

29/05/2019 13:56:49
Quote Anchor link
Dan is nu de vraag op welke plek je

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo 'button'; ?>
hebt toegevoegd.

Dat is niet per se op elke plek mogelijk.
Bijvoorbeeld niet in een class-definitie.

Maar het kan ook zijn, dat je nu een output gegenereerd hebt op een plek waar PHP nog verwacht dat de buffer nog leeg is.
Als daarna nog een cookie geset moet worden bijvoorbeeld, dan krijg je een fout.
Eigenlijk een niet-fatale fout, maar gezien de melding kan het ook zijn dat er nog een laag bovenop php ligt. Dat is namelijk niet de foutmelding zoals PHP die normaal geeft


Toevoeging op 29/05/2019 13:59:32:

Wat voor pakket is het eigenlijk?

Ik denk dat gpio.php een file is waar je niet te veel in moet veranderen.
Zou zo maar een class kunnen zijn.
 
Lambert Mertens

Lambert Mertens

29/05/2019 14:25:48
Quote Anchor link
Dit is de originele code van gpio.php. Lijke me recht-toe recht-aan code.
Ik had eerst aan het begin een echo-statement en daarna achteraan.
Ik heb ook een print-statement geprobeerd.
Het voorbeeldproject is:
https://www.instructables.com/id/Web-Controlled-8-Channel-Powerstrip/

Wat ik wil doen is, de code veranderen zodat er geen rechtstreekse koppeling meer is tussen de gebruikte knop en de IO-pin.
Bv nu is knop 0 gekoppeld aan IO-0.
Wil ik veranderen in: knop 0 is gekoppeld aan IO-2 (een klep) en aan IO-10 (de waterpomp)

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
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values

if (isset ( $_GET["pic"] )) {
    $pic = strip_tags ($_GET["pic"]);
    
    //test if value is a number
    if ( (is_numeric($pic)) && ($pic <= 7) && ($pic >= 0) ) {
        
        //set the gpio's mode to output        
        system("gpio mode ".$pic." out");
        //reading pin's status
        exec ("gpio read ".$pic, $status, $return );
        //set the gpio to high/low
        if ($status[0] == "0" ) { $status[0] = "1"; }
        else if ($status[0] == "1" ) { $status[0] = "0"; }
        system("gpio write ".$pic." ".$status[0] );
        //reading pin's status
        exec ("gpio read ".$pic, $status, $return );
        //print it to the client on the response
        echo($status[0]);
        
    }

    else { echo ("fail"); }
}
//print fail if cannot use values
else { echo ("fail"); }
?>
 
Ivo P

Ivo P

29/05/2019 14:39:59
Quote Anchor link
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
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values


define('KLEPJE', 2);
define('WATERPOMP', 10);

$koppelen = ['0' => [KLEPJE, WATERPOMP]];                


if (isset ( $_GET["pic"] )) {
    $pic = strip_tags ($_GET["pic"]);
    
    //test if value is a number
    if ( isset($koppelen[$pic]) ) {
        foreach($koppelen[$pic] as $pinout) {
        //set the gpio's mode to output        
        system("gpio mode ".$pinout." out");
        //reading pin's status
        exec ("gpio read ".$pinout, $status, $return );
        //set the gpio to high/low
        if ($status[0] == "0" ) { $status[0] = "1"; }
        else if ($status[0] == "1" ) { $status[0] = "0"; }
        system("gpio write ".$pinout." ".$status[0] );
        //reading pin's status
        exec ("gpio read ".$pinout, $status, $return );
        //print it to the client on the response
        echo('pin ' . $pinout . '  '.$status[0]);
        }
    }

    else { echo ("fail"); }
}
//print fail if cannot use values
else { echo ("fail"); }
?>


Toevoeging op 29/05/2019 14:43:26:

En als knop 3 gekoppeld moet worden aan pin 5 om een deur te openen dan worden de regels 6 tot en met 9

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

define('KLEPJE', 2);
define('DEUR', 5);
define('WATERPOMP', 10);

$koppelen = [
                '0' => [KLEPJE, WATERPOMP],
                '3' => [DEUR],
 
            ];


?>
Gewijzigd op 29/05/2019 14:44:03 door Ivo P
 
Lambert Mertens

Lambert Mertens

29/05/2019 15:03:13
Quote Anchor link
Dank je wel.!! Fantastisch.
Ga ik vanavond uitproberen.

Maar waarom deed het echo-statement het niet?

Kun je ook nog advies geven over een timer.

Uiteindelijk wil ik:
- knop 0 koppelen aan klep 0 en aan waterpomp, gedurende 30 minuten. (gras sproeien)
- Knop 1 koppelen aan klep 0 en aan waterpomp, gedurende 60 minuten (gras sproeien)
- Knop 2 koppelen aan klep 0 en aan waterpomp, gedurende 90 minuten (gras sproeien)
- Knop 3 koppelen aan klep 1 en aan waterpomp, gedurende 30 minuten (groententuin sproeien)
- Knop 4 koppelen aan klep 1 en aan waterpomp, gedurende 60 minuten (groententuin sproeien)
- Knop 5 koppelen aan klep 2 en aan waterpomp, gedurende 30 minuten (bloementuin sproeien)
- Knop 6 koppelen aan klep 2 en aan waterpomp, gedurende 60 minuten (bloementuin sproeien)

Als de timer afloopt kunnen alle outputs naar 0.
 
Thomas van den Heuvel

Thomas van den Heuvel

29/05/2019 15:11:23
Quote Anchor link
Enkel de cryptische melding "Something went wrong" lijkt mij iets dat een hogere laag in het systeem teruggeeft (of is dit een Internal Server Error (500) van je browser?).

Hoe dan ook, het directe euvel / de directe aanleiding zou als het goed is in een errorlog moeten staan, heb je daar al in gekeken? Deze zou ergens onder /var/log/ moeten staan. Documentatie van Apache zou je hier ook verder wegwijs in kunnen maken.
 
Ivo P

Ivo P

29/05/2019 15:28:42
Quote Anchor link
Wat betreft je tijdsduur: Dat is een "uitdaging", omdat je dan 2x moet schakelen. IN en later weer UIT.

Zelf doe ik zo iets met een poort: die heeft een puls nodig van 0.5 sec om te openen. (vergelijk deurbel)
en ook om te stoppen. (zolang hij niet vol open gaat na 10 sec.)

dus daar doe je dan bij te voet binnengaan:

PIN-0 naar 1
wacht 0.5 sec
PIN-0 naar 0
wacht 3 sec
PIN-0 naar 1
wacht 0.5 sec
PIN-0 naar 0


Dat heb jij ook nodig voor je sproeiers. Alleen: Apache is niet ingericht om zo lang als 30 minuten te gaan zitten wachten. Die is doorgaans na hooguit 30 sec. wel klaar.

Het kán wel, maar dan moet je een proces op de achtergrond aantrappen.
Dan kan Apache door en loopt het proces op de achtergrond door tot de tijd op is.

Bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php   $command = '/usr/bin/nohup /usr/bin/php  /path/naar/je/script.php ' . $pinout. ' '. $tijd .
              ' > /dev/null  & echo $!';
        $PID = shell_exec($command);
?>


In script.php moet je dan via je programmatje gpio de pinnen schakelen en dan met sleep en./of een while-lus wachten tot je tijd verstreken is.

Is te doen, maar wijkt wel zo veel af van standaard gebruik van PHP dat ik me afvraag of je dat als kennismaking met PHP wilt doen
 
Thomas van den Heuvel

Thomas van den Heuvel

29/05/2019 19:21:30
Quote Anchor link
Of je maakt een crontab die elke minuut een triggerscript aanroept, en dan maak je een soort van tijdsschema die controleert of er iets moet gebeuren in dat specifieke tijdvak. Zul je wel een en ander in een database moeten bijhouden waarschijnlijk.
 
Lambert Mertens

Lambert Mertens

29/05/2019 20:27:18
Quote Anchor link
Ik heb de code aangepast, maar krijg nog steeds dezelfde foutmeldinh:
Localhost meldt het volgende:
Something went wrong.

Als ik de originele file terugzet, werkt alles weer. De foutmelding komt op het moment dat ik een toets activeer en dus als de file gpio.php wordt aangeroepen.

Ik heb geen meldingen in de error.log file.

De code is nu:

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
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values


define ('grasklep',0);
define ('groenteklep',1);
define ('bloemenklep',2);
define ('waterpomp',3);

$koppelen = [
                '0' => [grasklep, waterpomp],
                '1' => [grasklep, waterpomp],
                '2' => [grasklep, waterpomp],
                '3' => [groenteklep, waterpomp],
                '4' => [groenteklep, waterpomp],
                '5' => [bloemenklep, waterpomp],
                '6' => [bloemenklep, waterpomp],
            ];


if (isset ( $_GET["pic"] )) {
    $pic = strip_tags ($_GET["pic"]);
    
    //test if value is a number
    if ( isset($koppelen[$pic]) ) {
        foreach ($koppelen[$pic] as $pinout) {
        
        //set the gpio's mode to output        
        system("gpio mode ".$pinout." out");
        //reading pin's status
        exec ("gpio read ".$pinout, $status, $return );
        //set the gpio to high/low
        if ($status[0] == "0" ) { $status[0] = "1"; }
        else if ($status[0] == "1" ) { $status[0] = "0"; }
        system("gpio write ".$pinout." ".$status[0] );
        //reading pin's status
        exec ("gpio read ".$pinout, $status, $return );
        //print it to the client on the response
        echo('pin' . $pinout . ' '.$status[0]);
    }
    }

    else { echo ("fail"); }
}
//print fail if cannot use values
else { echo ("fail"); }
?>


Ik heb gekeken naar de rechten van de files, en die liggen allemaal bij 'pi', dus dat klopt.


Toevoeging op 29/05/2019 21:33:51:

Ik heb eerst de declaraties toegevoegd, gesaved en getest. Toen kreeg ik geen fout.
Die kreeg ik pas toen ik de code veranderd had.
Betekent dit iets?
 
Thomas van den Heuvel

Thomas van den Heuvel

30/05/2019 01:07:30
Quote Anchor link
Ik zou uitzoeken waar deze foutmelding precies vandaan komt.

En hiermee bedoel ik in code, waar komt de frase "Something went wrong." precies vandaan.

Dat lijkt mij dan het startpunt van de verdere zoektocht.

Ook kan ik het mij niet voorstellen dat de error nergens gelogd wordt, dus daar zou ik nogmaals naar kijken. Of deze expliciet aanzetten, als je dat wel lukt zonder foutmeldingen :).
 
- Ariën  -
Beheerder

- Ariën -

30/05/2019 19:11:07
Quote Anchor link
Om de bron van die melding te zoeken, raad ik aan om even wat code tijdelijk te isoleren door wat comments te plaatsen.
 



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.