Forum: PC-Programmierung [PHP] Unsupported operand types


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich versuche gerade ein Skript local (Xampp) bei mir auszuführen
und bekomme folgenden Fehler:


#!/usr/bin/php
Fatal error: Unsupported operand types in 
C:\xampp\htdocs\flashair\index.php on line 14

Das Skript ist hier zu finden:
https://github.com/sleemanj/FlashAirSync/blob/master/FlashAirSync.php

ich habe lediglich die IP angepasst (Zeile 8).

Welcher Operand wird nicht unterstützt?

gruß Kolja

von andreasgf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
und was steht in Zeile 14 der index.php ?

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
$options = getopt('', ['flashairip::', 'syncfrom::', 'syncto::', 
'timezone::', 'pingtimeout::']) + $defaults;

Siehe auch hinter dem Link

von andreasgf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
im Link ist es Zeile 18 ?!
Ohne den Inhalt deines Scriptes wird dir kaum einer helfen können.

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
andreasgf schrieb:
> Ohne den Inhalt deines Scriptes wird dir kaum einer helfen können.

Beim Copy&Paste sind wohl die Leerzeichen verloren geganden:
#!/usr/bin/php
<?php
  // Flash Air Auto Sync, copies all images from flash air card when it is available
  // and drops them in a local folder.
  // Default Settings override these by passing arguments at the command line
  // eg. php FlashAirSync.php --syncto=/home/boffin/Documents/FlashAir
  $defaults = [
        'flashairip' => '192.168.178.16',
        'syncfrom' => '/DCIM/110CANON',
        'syncto' => getenv('HOME') . '/FlashAir',
        'timezone' => 'GMT',
        'pingtimeout' => '5'
  ];
  $options = getopt('', ['flashairip::', 'syncfrom::', 'syncto::', 'timezone::', 'pingtimeout::']) + $defaults;
  $FlashAirIP  = $options['flashairip']; // IP address of the flashair card, if the card is running in the default host mode you could just use the hostname ("flashair")
  $SyncFrom    = $options['syncfrom'];         // Path on the sdcard to copy from (recursive)
  $SyncTo      = $options['syncto']; // Full path where it will copy to (recursive)
  $TZ          = $options['timezone'];          // Camera Timezone
  // If the camera isn't online, it quits.  If the camera goes offline during the processing, the next time it
  // will do a full update.
  // It only copies a file once.
  // Deletions on the camera will NOT propogate to the target - camera space is tight so you are free
  //   to delete files there without losing the off-camera copy.
  // If you delete a file from the target directory, that deletion WILL propogate to the camera
  //   because the assumption is, it's a junk image you don't want, so no need for it on camera either.
  // Modifications on the camera will NOT propogate to the target - you're not modifying images on the camera
  //   in any meaningful way.
  // Modifications in the target will NOT propogate to the camera - the camera will always have the "original".
  // Sample config which puts card in wifi client mode (so it connects to your existing wifi router/access point), with upload enabled
  //   the config file is SD_WLAN/CONFIG on the sdcard, just edit then turn off and on the card to reload.
  // For more info:
  //  https://flashair-developers.com/en/documents/
  //  https://flashair-developers.com/en/documents/api/
  //  http://www.extrud3d.com/flashair
  /*
[Vendor]
CIPATH=/DCIM/100__TSB/FA000001.JPG
APPMODE=5
APPNETWORKKEY=YOUR_NETWORK_KEY_HERE
APPSSID=YOUR_SSID_HERE
VERSION=F24A6W3AW1.00.03
CID=02544d5357303847075000c0bf00c801
PRODUCT=FlashAir
VENDOR=TOSHIBA
MASTERCODE=00216b97d78a
LOCK=1
APPNAME=flashair
UPLOAD=1
  */
  date_default_timezone_set($TZ);
  if(!file_exists($SyncTo))
  {
    mkdir($SyncTo);
  }
  $ForceUpdate = (!file_exists($SyncTo . '/.Last_Update'))
                 ||file_exists($SyncTo.'/.Force_Update') ;
  @unlink($SyncTo.'/.Force_Update');
  // Files which have been copied in the past, we use this when we see
  // a file not present on the local, if it was copied in the past it must have
  // been deleted, so we will propogate that deletion back to the card.
  function was_deleted($Destination)
  {
    if(file_exists($Destination)) return false;
    if(!file_exists(dirname($Destination) . '/.Manifest'))
    {
      mkdir(dirname($Destination) . '/.Manifest');
    }
    if(file_exists(dirname($Destination) . '/.Manifest/' . basename($Destination)))
    {
      return true;
    }
    return false;
  }
  function sync_for_file($From, $To, $Time)
  {
    global $FlashAirIP;
    if(was_deleted($To))
    {
      // Delete from card
      echo "Delete {$From}\n";
      command("upload.cgi", array('DEL' => $From));
      unlink(dirname($To) . '/.Manifest/'.basename($To));
    }
    elseif(!file_exists($To))
    {
      if(copy("http://{$FlashAirIP}".$From, $To))
      {
        echo "Copy {$From}\n";
        touch($To, $Time);
        // Add it to the manifest
        touch(dirname($To) . '/.Manifest/'.basename($To), $Time);
      }
      else
      {
        if(!alive())
        {
          force_next_update();
          exit;
        }
      }
    }
  }
  // Check to see if the card is on the network
  function alive()
  {
    global $FlashAirIP, $options;
    $timeout = $options['pingtimeout'];
    $RC = 1;
    exec('ping -c 1 -t ' . $timeout . ' ' . $FlashAirIP,$retArr, $RC);
    return !$RC;
  }
  // Write a flag to fo a forced update the next time
  // this happens if we are interrupted by the camera going
  // into power down during a sync
  function force_next_update()
  {
    global $SyncTo;
    touch($SyncTo . '/.Force_Update');
    echo "Interrupted during processing.\n";
  }
  function command($Op, $Args = array())
  {
    global $FlashAirIP;
    if(!alive())
    {
      force_next_update();
      exit;
    }
    $Command = is_numeric($Op) ? "http://{$FlashAirIP}/command.cgi?op=$Op" : "http://{$FlashAirIP}/{$Op}?__DUMMY__=1";
    foreach($Args as $k => $v)
    {
      $Command .= "&$k=".rawurlencode($v);
    }
    $Contents = file_get_contents($Command);
    if($Contents === FALSE)
    {
      force_next_update();
      exit;
    }
    return $Contents;
  }
  if(!alive())
  {
    echo "Not Online\n";
    exit;
  }
  if(!$ForceUpdate && command(102) == 0)
  {
    echo "No Changes\n";
    exit;
  }
  function sync_dir($Dir, $To)
  {
    global $FlashAirIP, $TZ;
    $List = command(100, array('DIR' => $Dir));
    $List = preg_split('/\r?\n/', $List);
    foreach($List as $r)
    {
      $r = str_getcsv($r);
      if(count($r) < 3) continue;
      if($r[3] & 16) // bit 5 = Directory
      {
        if(!file_exists($To . '/'.$r[1])) mkdir($To . '/' . $r[1]);
        sync_dir($Dir . '/' . $r[1], $To . '/' . $r[1]);
        continue;
      }
      // Else normal file
      $Day     =  ($r[4] & 0b0000000000011111);
      $Month   =  ($r[4] & 0b0000000111100000) >> 5;
      $Year    = (($r[4] & 0b1111111000000000) >> 9)+1980;
      $Seconds = ($r[5] & 0b0000000000011111) * 2;
      $Minutes = ($r[5] & 0b0000011111100000) >> 5;
      $Hours   = ($r[5] & 0b1111100000000000) >> 11;
      // echo "{$r[1]} {$Year}-{$Month}-{$Day} {$Hours}:{$Minutes}:{$Seconds}\n";
      // $Time = mktime($Hours, $Minutes, $Seconds, $Month, $Day, $Year);
      $Time = strtotime("{$Year}-{$Month}-{$Day} {$Hours}:{$Minutes}:{$Seconds} {$TZ}");
      sync_for_file($Dir . '/' . $r[1], $To . '/' . $r[1], $Time);
    }
  }
  sync_dir($SyncFrom, $SyncTo);
  touch($SyncTo . '/.Last_Update');
?>

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
Kolja L. schrieb:
> Welcher Operand wird nicht unterstützt?

Kann es sein, dass Xampp unter Windows mit getenv nichts anfangen kann?

von Toni Tester (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Welche PHP-Version, welches Betriebssystem usw., welche Extensions sind 
aktiviert?

Kolja L. schrieb:
> Kann es sein, dass Xampp unter Windows mit getenv nichts anfangen kann?

Lt. PHP-Doku ist getopt seit PHP-Version 5.3.0 
betriebssystemunabhängig ("now works on Windows, too") => Gehe zu meiner 
ersten Frage.

Der Array-Union-Operator ("+") sieht auch okay aus.

=> Vermutung: Du übergibst keine Kommandozeilenparameter, daher liefert 
getopt einen booleschen Wert FALSE statt eines Arrays, richtig?

- Merke: RTFM. Always, First.
- Abhilfe: Rückgabewert von getopt zwischenspeichern und auf gültiges 
Array überprüfen.

von Kolja L. (kolja82)


Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfestellung!

So were ich zumindest die Fehlermeldung los:

  $FlashAirIP  = '192.168.178.16'; // IP address of the flashair card, 
if the card is running in the default host mode you could just use the 
hostname ("flashair")
  $SyncFrom    = '/DCIM';         // Path on the sdcard to copy from 
(recursive)
  $SyncTo      = '/FlashAir'; // Full path where it will copy to 
(recursive)
  $TZ          = 'GTM';          // Camera Timezone


Aber jetzt ist die Antwort im Browser:

Not Online

obwohl ich im Browser über die IP auf die Karte komme.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.