PHP Probleme nach Update auf 5.0

Hi zusammen,

Ich habe gestern das Update auf 5.0 auf dem Raspi durchlaufen lassen.

seither bekommen ich folgende Meldung:

das Skript sieht so aus:
Skript strpos.png

Das Skript soll den String der von einem ESP8266 mit ESPEASY kommt zerlegen und die jeweiligen Variablen verändern.
Das klappte bisher so und aktuell funktioniert es auch, nur leider kommen nun diese meldungen.

laut Google heisst die Meldung, dass mein String angeblich zu lange ist… ???
wie jetz auf einmal?

Hat eine der funktionen strpos, strlen, oder substr seit PHP7.2 eine veränderte Funktion?

Lg Heisti

Dein String ist zu kurz.
Ob sich da etwas geändert hat, weiß ich gerade nicht.
Aber ich hätte das nie per Hand zerlegt.
Es gibt dafür fertige Funktionen in PHP.
PHP: parse_str - Manual
Michael

Hi,

Ja Cool, die Funktion kannte ich noch nicht…

hab grade auch schon gespielt damit.

Leider habe ich einen Wert: namens „swichtcmd=“ und dieser gibt „On“ oder „Off“ zurück.
GET /json.htm?type=command&param=switchlight&idx=44&switchcmd=Off&rssi=9 HTTP/1.1<CR><LF>Host: 192.168.XXX.XXX<CR><LF>Connection: close<CR><LF><CR><LF>

bei der versuchten rückgrabe mit

echo "Wert Switchcmd: ".$output["switchcmd"]."
";

bekomme ich zurück:


<br />
<b>Notice</b>:  Undefined index: switchcmd in <b>/var/lib/symcon/scripts/25363.ips.php</b> on line <b>13</b><br />
Wert Schalter: 
<br />

der wäre aber Wichtig…

Imho geht das nur mit dem eigentlichen Query. Den Rest musst du entfernen.
Hier kann man den Query-String mit extrahieren.
PHP: parse_url - Manual
Um an die URL zu kommen gibt es bestimmt auch andere Wege, aber um den Teil zwischen GET und das HTTP/1.1 zu kommen würde ich einfach str_split auf ein Leerzeichen nutzen.
Michael

Wenn denn dein String so ist, sollte es doch passen.

<?
$str = "GET /json.htm?type=command&param=switchlight&idx=44&switchcmd=Off&rssi=9 HTTP/1.1<CR><LF>Host: 192.168.XXX.XXX<CR><LF>Connection: close<CR><LF><CR><LF>";
parse_str($str, $output);echo $output['switchcmd'];  // Off

?>

Hallo zusammen,

ich häng mich hier auch mal dran. Habe selbiges Problem seit der Umstellung auf IPS 5.0. Nur frage ich keinen Switch ab sondern lasse mir Werte (Temp & Luftdruck) in Variablen ausgeben.

Hier die Meldung

27.08.2018, 10:30:21 | PHP | Error: Warning: strpos(): Offset not contained in string
   Error in Script /var/lib/symcon/scripts/19796.ips.php on Line 17
  134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   37 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
      in IPSLogger_PhpErrorHandler
   17 in 19796.ips.php (call strpos)

Hier das Skript


<?
    if ($_IPS['SENDER'] == 'RegisterVariable'){
    $data = $_IPS['VALUE'];

    $Prefix1 = "&idx=";                                    // damit fängt der Datensatz an
    $Suffix1 = "&";
    $Prefix2 = "&svalue=";                                    // damit fängt der Datensatz an
    $Suffix2 = "HTTP/1.1";
    $Prefix3 = "&switchcmd=";                                    // damit fängt der Datensatz an
    $Suffix3 = "HTTP/1.1";

    //$Ende1nachZeichen = 2;                                       // und ist xx Zeichen lang
    $AnfangID = strlen($Prefix1)+(strpos($_IPS['VALUE'], $Prefix1));
    $EndeID = strpos($_IPS['VALUE'], $Suffix1, $AnfangID+1);
    $ID = substr($_IPS['VALUE'], $AnfangID, $EndeID-$AnfangID);

    $AnfangValue = strlen($Prefix2)+(strpos($_IPS['VALUE'], $Prefix2));
    $EndeValue = strpos($_IPS['VALUE'], $Suffix2, $AnfangValue);
    $Value = substr($_IPS['VALUE'], $AnfangValue, $EndeValue-$AnfangValue-1);

    switch ($ID) {
         case "31":
                    $aValue=explode(";", $Value);
                    SetValueFloat(55241, $aValue[0]);
                    SetValueFloat(21966, $aValue[1]);
					SetValueFloat(27266, $aValue[3]);
           break;
		   
		 case "32":
                    $aValue=explode(";", $Value);
                    SetValueFloat(26720, $aValue[0]);
            break;  
    }
}

?>

Der String sieht so aus

27.08.2018, 10:31:13 | RECEIVED [192.168.xxx.xxx:2901] | GET /json.htm?type=command&param=udevice&idx=31&svalue=22.35;42.87;0;971.16;0 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF>

Wo ist der String zu kurz?

Danke schon mal fürs Helfen :wink:

Teste das mal. :wink:

<?
$str = "GET /json.htm?type=command&param=udevice&idx=31&svalue=22.35;42.87;0;971.16;0 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF>";
parse_str($str, $output); echo $output['svalue']."
";
$data = explode(";" ,$output['svalue']);
unset ($data[4]);
print_r($data);
?>

Aus deinem ganzen Wirrwar komme ich nicht klar.
Wo steht in der Meldung was von zu kurz?

PS: Hab die letzte 0 unterschlagen.


$str = stristr($str, 'HTTP', true);
parse_str($str, $output); 
echo $output['svalue']."
";
$data = explode(";" ,$output['svalue']);
print_r($data);

Okay, ein ESP hat 2 Sensoren angeschlossen ID 31 und ID 32(hier muss also schon unterschieden werden). Der ESP sendet im Intervall die unten stehenden Strings Richtung IPS an einen Server Socket mit Register Variable. Die Werte im String nach „svalue=“ ändern sich somit auch. Die Daten der RegVar werden abgefragt und in den entsprechenden Variablen gespeichert.
Korrekte Werte werden ja noch geliefert aber seit IPS 5.0 eben mit Warnung im Log.

GET /json.htm?type=command&param=udevice&[b]idx=31[/b]&svalue=22.35;42.87;0;971.16;0 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF
GET /json.htm?type=command&param=udevice&[b]idx=32[/b]&svalue=23.25 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF>

Der TE hat das gleiche Skript, wie ich auch, hier aus dem Forum in Verwendung und Nall-chan meinte der String sei zu kurz.

So schwer ist es doch nicht.

<?
$str = "GET /json.htm?type=command&param=udevice&idx=32&svalue=22.35 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF>";
$str = stristr($str, 'HTTP', true);
parse_str($str, $output); 

switch($output['idx']) { 
case'31':     
   $data = explode(";" ,$output['svalue']);    
   print_r($data); 
break;
 case'32':     
   $data = explode(";" ,$output['svalue']);
    print_r($data); 
break;
}
?>

Jetzt bau es dir zusammen.:wink:

Zu deinem Problem überhaupt. Lies dir mal das durch, vielleicht kommst Du ja drauf. Wenn der Offset nicht exsitent ist kommt es zu solch einer Meldung.
PHP: strpos - Manual

Wenn in ID 32 immer der gleiche String vorhanden ist, kannst Du auch ohne explode direkt auswerten!

Hab gebaut, funktioniert auch, jedoch mit Notice im Log

27.08.2018, 15:31:46 | PHP | Error: Notice: Undefined index: idx
   Error in Script /var/lib/symcon/scripts/41880.ips.php on Line 7
  134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   44 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
    7 in 41880.ips.php (call IPSLogger_PhpErrorHandler)
<?
if ($_IPS['SENDER'] == 'RegisterVariable'){
$data = $_IPS['VALUE'];
$str = stristr($data, 'HTTP', true);
parse_str($str, $output); 

switch($output['idx']) { 
case'31':     
   $data = explode(";" ,$output['svalue']);
    SetValueFloat(55241, $data[0]);
    SetValueFloat(21966, $data[1]);  
    SetValueFloat(27266, $data[3]);    
   //print_r($data); 
break;
 case'32':     
   $data = explode(";" ,$output['svalue']);
   SetValueFloat(26720, $data[0]);
    //print_r($data); 
break;
    }
}
?>

Jetzt bin ich genauso weit wie am Anfang, nur mit nem kürzeren Skript :banghead:

Error: Notice: Undefined index: idx

Dann ist doch idx gar nicht vorhanden.
Wie kommen denn die Daten rein. In einem String oder gestückelt.?

So kommen die Daten rein und „idx“ ist doch auch im String vorhanden. Keine Ahnung warum er das nicht kennt?:confused:

ID31


GET /json.htm?type=command&param=udevice&idx=31&svalue=22.35;42.87;0;971.16;0 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF

oder für ID32


GET /json.htm?type=command&param=udevice&idx=32&svalue=23.25 HTTP/1.1<CR><LF>Host: 192.168.xxx.xxx<CR><LF>Connection: close<CR><LF><CR><LF>

Nie und nimmer.
Mach mal den Debug der Registervariable auf. Alles was Du dort siehst rauscht durch das Script. Mal mit mal ohne idx

Gesendet von iPad mit Tapatalk

Dann prüf ob idx überhaupt gesetzt ist.


$str = stristr($str, 'HTTP', true);
if(strpos($str, "idx") !== false) {
    parse_str($str, $output); 


    switch($output['idx']) {
     case'31':
         $data = explode(";" ,$output['svalue']);
        print_r($data);
     break;
     case'32':
         $data = explode(";" ,$output['svalue']);
        print_r($data);
     break;
    }
}

Die beiden geposteten Strings waren aus dem Debug kopiert und mehr kommt da auch nicht :wink:
Okay, jeweils der gleiche String für Received, Connected, Processed, Disconnected aber das war dann auch.

Egal, jetzt läuft es jedenfalls sauber :loveips:

Danke fürs Helfen Rainer!!

Hier das Script wenns noch wer brauchen kann


<?
if ($_IPS['SENDER'] == 'RegisterVariable'){
$data = $_IPS['VALUE'];
if(strpos($data, "idx") !== false) {
    parse_str($data, $output);  

switch($output['idx']) { 
case'31':     
   $data = explode(";" ,$output['svalue']);
        SetValueFloat(55241, $data[0]);
        SetValueFloat(21966, $data[1]);  
        SetValueFloat(27266, $data[3]);    
        //print_r($data); 
break;
 case'32':     
   $data = explode(";" ,$output['svalue']);
        SetValueFloat(26720, $data[0]);
        //print_r($data); 
break;
        }
    }
}
?>

Schön, wäre es ja wenn Du jetzt verstanden hast warum die/der Fehler auftritt auch der TE.

PHP 7 ist da strenger geworden. Das ganze Script hat quasi nie richtig funktioniert, weil einfach Regeln die vorgegeben sind von PHP nicht eingehalten wurden.
strpos gibt es schon ewig und auch mit der selben Prüfung.

Man sollte wenn man etwas kopiert zumindest versuchen warum es so funktioniert oder auch nicht. Da ist die PHP Bibel nun mal das A&O.

Im Endeffekt hat das ganze absolut nix mit der Umstellung auf IPS V5 zutun. :wink:

Du kannst auch gerne noch mal ein else dran hängen.


break;    }
} else {
    echo "invalid String, No 'idx' found!";
    }

hi zusammen,

Also, das Problem lag tatsächlich daran, dass der ESP immer wieder „leere“ oder unvollständige nachrichten geschickt hat, und PHP 7 (wie vorher schon erwähnt) hier strenger geworden ist.

Ich wollte es dann auch mit dem Verkürzten Skript basteln, habs aber nicht hin bekommen :mad:

Hab das ganze dann sein lassen, da ich nun prüfe ob „IDX“ vorhanden ist. wenn nicht, dann breche ich die Scriptausführung ab.

Danke für eure hilfen, ich werden nun auch auf das kurze Sript versuchen ein zu binden.

Lg

Ich hänge mich mal an das Thema: PHP Probleme nach Update auf 5.0 dran.

Obwohl ich vorsichtig war und erst mal die Raspis ohne Probleme auf die 5.0 upgedated habe, orakelt das Log auf meinen Win7 Haupt-Server nach dem Update mit einer Flut von Warnungen:

Typ 1+2:

29.08.2018 00:10:10 | 39366 | WARNING | ScriptEngine         | Ergebnis für Skript 39366
<br />
<b>Deprecated</b>:  Methods with the same name as their class will not be constructors in a future version of PHP; xmlrpc_client has a deprecated constructor in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>730</b><br />
<br />
<b>Deprecated</b>:  Methods with the same name as their class will not be constructors in a future version of PHP; xmlrpcresp has a deprecated constructor in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>1624</b><br />
<br />
<b>Deprecated</b>:  Methods with the same name as their class will not be constructors in a future version of PHP; xmlrpcmsg has a deprecated constructor in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>1756</b><br />
<br />
<b>Deprecated</b>:  Methods with the same name as their class will not be constructors in a future version of PHP; xmlrpcval has a deprecated constructor in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>2275</b><br />
<br />
<b>Warning</b>:  count(): Parameter must be an array or an object that implements Countable in <b>D:\IPS-Steigerts\scripts\xmlrpc.inc.php</b> on line <b>2195</b><br />


Typ 2+3 :

29.08.2018 01:42:39 | 57936 | WARNING | ScriptEngine         | Ergebnis für Skript 57936
<br />
<b>Notice</b>:  A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>:  A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>:  A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>:  A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>:  A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>:  A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>415</b><br />
<br />
<b>Notice</b>:  A non well formed numeric value encountered in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>354</b><br />
<br />
<b>Warning</b>:  Variable has no profile assigned in <b>D:\IPS-Steigerts\scripts\HzMonitor.ips.php</b> on line <b>277</b><br />

Bekrittelt werden Skripte, die ich schon seit mindestens 3 Jahren nicht mehr angefasst habe und bisher problemlos durchliefen.
Selbstverständlich werde ich allen Beanstandungen nachgehen, aaaber:

Gibt es im PHP-Setting einen Switch, der diese Warnungsflut erst mal vorerst abstellt ?

Viele Grüsse
Harald

@T30: Du musst diese Skripte anpassen, da diese nicht mehr mit PHP7 kompatibel sind. Google mal die jeweiligen Fehlermeldungen - es sind immer nur „kleine“ Handgriffe nötig, um die Fehlermeldungen weg zu bekommen.

paresy

So hab den Umstieg auf 5.0 auch hinter mir und leider jetzt auch Probleme mit dem PHP Update und zwar in der xmlrpc.php Datei.

Das Problem mit den Konstruktoren hab ich ja noch bereinigen können aber jetzt bekomme ich eine Warnung, die ich leider nicht zuordnen kann:

Warning: count(): Parameter must be an array or an object that implements Countable
Error in Script C:\IP-Symcon\scripts\xmlrpc.inc.php on Line 2610

Kann mir jemand sagen, wie ich das gefixed bekomme?