Forum: PC-Programmierung [PHP] Unsupported operand types


von Kolja L. (kolja82)


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)


Lesenswert?

und was steht in Zeile 14 der index.php ?

von Kolja L. (kolja82)


Lesenswert?

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

Siehe auch hinter dem Link

von andreasgf (Gast)


Lesenswert?

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

von Kolja L. (kolja82)


Lesenswert?

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

Beim Copy&Paste sind wohl die Leerzeichen verloren geganden:
1
#!/usr/bin/php
2
<?php
3
  // Flash Air Auto Sync, copies all images from flash air card when it is available
4
  // and drops them in a local folder.
5
  // Default Settings override these by passing arguments at the command line
6
  // eg. php FlashAirSync.php --syncto=/home/boffin/Documents/FlashAir
7
  $defaults = [
8
        'flashairip' => '192.168.178.16',
9
        'syncfrom' => '/DCIM/110CANON',
10
        'syncto' => getenv('HOME') . '/FlashAir',
11
        'timezone' => 'GMT',
12
        'pingtimeout' => '5'
13
  ];
14
  $options = getopt('', ['flashairip::', 'syncfrom::', 'syncto::', 'timezone::', 'pingtimeout::']) + $defaults;
15
  $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")
16
  $SyncFrom    = $options['syncfrom'];         // Path on the sdcard to copy from (recursive)
17
  $SyncTo      = $options['syncto']; // Full path where it will copy to (recursive)
18
  $TZ          = $options['timezone'];          // Camera Timezone
19
  // If the camera isn't online, it quits.  If the camera goes offline during the processing, the next time it
20
  // will do a full update.
21
  // It only copies a file once.
22
  // Deletions on the camera will NOT propogate to the target - camera space is tight so you are free
23
  //   to delete files there without losing the off-camera copy.
24
  // If you delete a file from the target directory, that deletion WILL propogate to the camera
25
  //   because the assumption is, it's a junk image you don't want, so no need for it on camera either.
26
  // Modifications on the camera will NOT propogate to the target - you're not modifying images on the camera
27
  //   in any meaningful way.
28
  // Modifications in the target will NOT propogate to the camera - the camera will always have the "original".
29
  // Sample config which puts card in wifi client mode (so it connects to your existing wifi router/access point), with upload enabled
30
  //   the config file is SD_WLAN/CONFIG on the sdcard, just edit then turn off and on the card to reload.
31
  // For more info:
32
  //  https://flashair-developers.com/en/documents/
33
  //  https://flashair-developers.com/en/documents/api/
34
  //  http://www.extrud3d.com/flashair
35
  /*
36
[Vendor]
37
CIPATH=/DCIM/100__TSB/FA000001.JPG
38
APPMODE=5
39
APPNETWORKKEY=YOUR_NETWORK_KEY_HERE
40
APPSSID=YOUR_SSID_HERE
41
VERSION=F24A6W3AW1.00.03
42
CID=02544d5357303847075000c0bf00c801
43
PRODUCT=FlashAir
44
VENDOR=TOSHIBA
45
MASTERCODE=00216b97d78a
46
LOCK=1
47
APPNAME=flashair
48
UPLOAD=1
49
  */
50
  date_default_timezone_set($TZ);
51
  if(!file_exists($SyncTo))
52
  {
53
    mkdir($SyncTo);
54
  }
55
  $ForceUpdate = (!file_exists($SyncTo . '/.Last_Update'))
56
                 ||file_exists($SyncTo.'/.Force_Update') ;
57
  @unlink($SyncTo.'/.Force_Update');
58
  // Files which have been copied in the past, we use this when we see
59
  // a file not present on the local, if it was copied in the past it must have
60
  // been deleted, so we will propogate that deletion back to the card.
61
  function was_deleted($Destination)
62
  {
63
    if(file_exists($Destination)) return false;
64
    if(!file_exists(dirname($Destination) . '/.Manifest'))
65
    {
66
      mkdir(dirname($Destination) . '/.Manifest');
67
    }
68
    if(file_exists(dirname($Destination) . '/.Manifest/' . basename($Destination)))
69
    {
70
      return true;
71
    }
72
    return false;
73
  }
74
  function sync_for_file($From, $To, $Time)
75
  {
76
    global $FlashAirIP;
77
    if(was_deleted($To))
78
    {
79
      // Delete from card
80
      echo "Delete {$From}\n";
81
      command("upload.cgi", array('DEL' => $From));
82
      unlink(dirname($To) . '/.Manifest/'.basename($To));
83
    }
84
    elseif(!file_exists($To))
85
    {
86
      if(copy("http://{$FlashAirIP}".$From, $To))
87
      {
88
        echo "Copy {$From}\n";
89
        touch($To, $Time);
90
        // Add it to the manifest
91
        touch(dirname($To) . '/.Manifest/'.basename($To), $Time);
92
      }
93
      else
94
      {
95
        if(!alive())
96
        {
97
          force_next_update();
98
          exit;
99
        }
100
      }
101
    }
102
  }
103
  // Check to see if the card is on the network
104
  function alive()
105
  {
106
    global $FlashAirIP, $options;
107
    $timeout = $options['pingtimeout'];
108
    $RC = 1;
109
    exec('ping -c 1 -t ' . $timeout . ' ' . $FlashAirIP,$retArr, $RC);
110
    return !$RC;
111
  }
112
  // Write a flag to fo a forced update the next time
113
  // this happens if we are interrupted by the camera going
114
  // into power down during a sync
115
  function force_next_update()
116
  {
117
    global $SyncTo;
118
    touch($SyncTo . '/.Force_Update');
119
    echo "Interrupted during processing.\n";
120
  }
121
  function command($Op, $Args = array())
122
  {
123
    global $FlashAirIP;
124
    if(!alive())
125
    {
126
      force_next_update();
127
      exit;
128
    }
129
    $Command = is_numeric($Op) ? "http://{$FlashAirIP}/command.cgi?op=$Op" : "http://{$FlashAirIP}/{$Op}?__DUMMY__=1";
130
    foreach($Args as $k => $v)
131
    {
132
      $Command .= "&$k=".rawurlencode($v);
133
    }
134
    $Contents = file_get_contents($Command);
135
    if($Contents === FALSE)
136
    {
137
      force_next_update();
138
      exit;
139
    }
140
    return $Contents;
141
  }
142
  if(!alive())
143
  {
144
    echo "Not Online\n";
145
    exit;
146
  }
147
  if(!$ForceUpdate && command(102) == 0)
148
  {
149
    echo "No Changes\n";
150
    exit;
151
  }
152
  function sync_dir($Dir, $To)
153
  {
154
    global $FlashAirIP, $TZ;
155
    $List = command(100, array('DIR' => $Dir));
156
    $List = preg_split('/\r?\n/', $List);
157
    foreach($List as $r)
158
    {
159
      $r = str_getcsv($r);
160
      if(count($r) < 3) continue;
161
      if($r[3] & 16) // bit 5 = Directory
162
      {
163
        if(!file_exists($To . '/'.$r[1])) mkdir($To . '/' . $r[1]);
164
        sync_dir($Dir . '/' . $r[1], $To . '/' . $r[1]);
165
        continue;
166
      }
167
      // Else normal file
168
      $Day     =  ($r[4] & 0b0000000000011111);
169
      $Month   =  ($r[4] & 0b0000000111100000) >> 5;
170
      $Year    = (($r[4] & 0b1111111000000000) >> 9)+1980;
171
      $Seconds = ($r[5] & 0b0000000000011111) * 2;
172
      $Minutes = ($r[5] & 0b0000011111100000) >> 5;
173
      $Hours   = ($r[5] & 0b1111100000000000) >> 11;
174
      // echo "{$r[1]} {$Year}-{$Month}-{$Day} {$Hours}:{$Minutes}:{$Seconds}\n";
175
      // $Time = mktime($Hours, $Minutes, $Seconds, $Month, $Day, $Year);
176
      $Time = strtotime("{$Year}-{$Month}-{$Day} {$Hours}:{$Minutes}:{$Seconds} {$TZ}");
177
      sync_for_file($Dir . '/' . $r[1], $To . '/' . $r[1], $Time);
178
    }
179
  }
180
  sync_dir($SyncFrom, $SyncTo);
181
  touch($SyncTo . '/.Last_Update');
182
?>

von Kolja L. (kolja82)


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)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.