Php 7.4

Moin zusammen,

habe im TelegramMessenger Modul das Problem, dass dies wohl mit der alten PHP Version geschrieben wurde und nun spuckt er den Fehler aus:

<b>Notice</b>: Trying to access array offset on value of type bool in <b>/var/lib/symcon/modules/jmc-symcon-modules/TelegramMessenger/module.php</b> on line <b>62</b><br />
<br />

Ich bin jetzt kein Profiprogrammierer und stoße hier an meine Grenzen, denn wie ich es auch mache, schmeißt er mit Fehler raus.

Das Problem liegt in der FETT geschriebenen Zeile:

public function SendImage($text, $image_path, $userid) {
		include_once(__DIR__ . "/Telegram.php");
		$telegram = new Telegram($this-&gt;ReadPropertyString("BotID"));
		$img_info = getimagesize($image_path);
	[b]	$mime = $img_info['mime'];[/b]
		if ($mime == "image/jpeg" or $mime == "image/jpg") [
			$ext = ".jpg";
		] else if ($mime == "image/png") [
			$ext = ".png";
		] else if ($mime == "image/gif") [
			$ext = ".gif";
		] else [
			return false;
		]
		$img = curl_file_create($image_path, $mime , md5($image_path.time()).$ext);
		$content = array('chat_id' =&gt; $userid, 'caption' =&gt; $text, 'photo' =&gt; $img);
		return $telegram-&gt;sendPhoto($content);
	}

Wäre nett, wenn mir hier kurz einer helfen könnte.

Hallo
Ich wuerde vor die Fehlerzeile mal mir ausgeben was in $img_info steht.

print_r($img_info);

Es gibt auch noch ein Arrayfeld wo der Typ als Zahl drin steht. ( 2 = jpg )

Frage mich grad, wie ich printr ausgeben soll, es handelt sich ja um die modul.php und die gibt nur aus, wenn ich einen Telegramm Befehl sende. Müsste wenn dann das Ergebnis vermutlich in eine Datei bzw. Variable schreiben?
Es lief ja vor der php umstellung reibungslos.

hier mal die komplette Modul.php:

<?
    // Klassendefinition
    class TelegramMessenger extends IPSModule {
 
        public function __construct($InstanceID) {
            // Diese Zeile nicht löschen
            parent::__construct($InstanceID);
        }
 
        // Überschreibt die interne IPS_Create($id) Funktion
        public function Create() {
            parent::Create();                       
			$this->RegisterPropertyString("BotID", "123456789:JHJ56HJJHJ78778JKLKJKLJ8798JHJahjhw");
			$this->RegisterPropertyString("Recipients", "123456789,987654321");   
			$this->RegisterPropertyBoolean("FetchIncoming", true);
			$this->RegisterPropertyBoolean("ProcessIncoming", false);
			$this->RegisterPropertyInteger ("ProcessIncomingSkript", 0);
			$this->RegisterPropertyBoolean("HTML", false);
			$this->RegisterTimer("GetUpdates", 15000, 'Telegram_GetUpdates($_IPS[\'TARGET\']);');
		}
		
		
        // Überschreibt die intere IPS_ApplyChanges($id) Funktion
        public function ApplyChanges() {
            // Diese Zeile nicht löschen
            parent::ApplyChanges();

        }
 
        /**
        * Die folgenden Funktionen stehen automatisch zur Verfügung, wenn das Modul über die "Module Control" eingefügt wurden.
        * Die Funktionen werden, mit dem selbst eingerichteten Prefix, in PHP und JSON-RPC wiefolgt zur Verfügung gestellt:
        *
        * ABC_MeineErsteEigeneFunktion($id);
        *
        */
		
		public function SendTextToAll($text) {
			$recips = explode(",",$this->ReadPropertyString("Recipients"));
			$retVal = true;
			foreach($recips as $r) {
				$retVal &= $this->SendText($text, $r);
			}
			return $retVal;
		}
		
		public function SendText($text, $userid) {
			include_once(__DIR__ . "/Telegram.php");
			$frmt = "Markdown";
			if ($this->ReadPropertyBoolean("HTML") == true) {
				$frmt = "HTML";
			}
			$telegram = new Telegram($this->ReadPropertyString("BotID"));
			$content = array('chat_id' => $userid, 'text' => $text, 'parse_mode' => $frmt);
			return $telegram->sendMessage($content);
		}
		
		public function SendImage($text, $image_path, $userid) {
			include_once(__DIR__ . "/Telegram.php");
			$telegram = new Telegram($this->ReadPropertyString("BotID"));
			$img_info = getimagesize($image_path);
			$mime = $img_info['mime'];
			if ($mime == "image/jpeg" or $mime == "image/jpg") {
				$ext = ".jpg";
			} else if ($mime == "image/png") {
				$ext = ".png";
			} else if ($mime == "image/gif") {
				$ext = ".gif";
			} else {
				return false;
			}
			$img = curl_file_create($image_path, $mime , md5($image_path.time()).$ext);
			$content = array('chat_id' => $userid, 'caption' => $text, 'photo' => $img);
			return $telegram->sendPhoto($content);
		}
		
		public function SendImageToAll($text, $image_path) {
			include_once(__DIR__ . "/Telegram.php");
			$telegram = new Telegram($this->ReadPropertyString("BotID"));
			$recips = explode(",",$this->ReadPropertyString("Recipients"));
			$retVal = true;
			foreach($recips as $r) {
				$retVal &= $this->SendImage($text, $image_path, $r);
			}
			return $retVal;
		}
		
		public function SendDocument($text, $document_path, $mimetype, $userid) {
			include_once(__DIR__ . "/Telegram.php");
			$telegram = new Telegram($this->ReadPropertyString("BotID"));
			$ext = pathinfo($document_path);
			$doc = curl_file_create($document_path, $mimetype , md5($document_path.time()).".".$ext['extension']);
			$content = array('chat_id' => $userid, 'caption' => $text, 'document' => $doc);
			return $telegram->sendDocument($content);
		}
		
		public function SendDocumentToAll($text, $document_path, $mimetype) {
			include_once(__DIR__ . "/Telegram.php");
			$telegram = new Telegram($this->ReadPropertyString("BotID"));
			$recips = explode(",",$this->ReadPropertyString("Recipients"));
			$retVal = true;
			foreach($recips as $r) {
				$retVal &= $this->SendDocument($text, $document_path, $mimetype, $r);
			}
			return $retVal;
		}
		
		public function GetUpdates() {
			if ($this->ReadPropertyBoolean("FetchIncoming")) {
				include_once(__DIR__ . "/Telegram.php");
				$telegram = new Telegram($this->ReadPropertyString("BotID"));
				$req = $telegram->getUpdates();

				for ($i = 0; $i < $telegram->UpdateCount(); $i++) {
					// You NEED to call serveUpdate before accessing the values of message in Telegram Class
					$telegram->serveUpdate($i);
					$text = $telegram->Text();
					$chat_id = $telegram->ChatID();
					$date = $telegram->Date();
					IPS_LogMessage("Telegram", "Update von " . $chat_id . " -> " . $text . " / " . $date . " / " . print_r($telegram,true));
					// Verarbeiten von Nachrichten (aber nur wenn aktiviert und Nachricht nicht älter als 1 Minute);
					if ($this->ReadPropertyBoolean("ProcessIncoming") && (time() - $date) < 60) {
						// Ist der User bekannt?
						$recips = explode(",",$this->ReadPropertyString("Recipients"));
						foreach($recips as $r) {
							if ($r == $chat_id) {
								IPS_RunScriptEx(
									$this->ReadPropertyInteger("ProcessIncomingSkript"),
									array("SENDER" => "Telegram", "INSTANCE" => $this->InstanceID, "CHAT" => $chat_id, "VALUE" => $text)
								);
								break;
							}
						}						
					}
				}
			}
		}
    }
?>

Du könntest dir mit $this->SendDebug() etwas ins Debuglog schreiben.

z.B.


$this->SendDebug(__FUNCTION__, json_encode($image_info), 0);

Ich vermute, dass die Funktion getimagesize() mit false zurückkommt und daher die nachfolgende Anweisung Probleme macht. PHP 7 ist da nun kritischer und macht dich darauf aufmerksam („Notice“).
Zum Abbruch kommt es aber nicht dabei.

Burkhard

es ist tatsächlich so, dass er mir nachdem ich die Zeile von bumaas eingefügt habe im Debuglog false ausspuckt.

Kann ich das definieren, dass er die Befehle trotzdem weiter ausführt und mir mein Bild entsprechend zuschickt?

Wenn ich nur den Befehlt SendText nehme, funktioniert alles problemlos

Hab das Problem gelöst.

Das Problem war nicht das Modul, sondern die falsche Camauswahl.

Jedoch bin ich der Meinung, dass man das mit der Änderung von PHP7.4 bestimmt noch ändern sollte, dann gibts auch keine Fehlermeldung