Bernd: Berechnung

Hallo,

warum funktioniert folgendes nicht:

echo "Div: " . $gesamtZeit - $zu1;

dieses hingegen schon

$testAusgabe = $gesamtZeit - $zu1;
echo "Div: " . $testAusgabe;

Im ersten wird $gesamtZeit überhaupt nicht berücksichtigt.

  1. Tach!

    Im ersten wird $gesamtZeit überhaupt nicht berücksichtigt.

    Liegt vermutlich an der Operatorenrangfolge. Klammern machen den Wunsch deutlicher.

    dedlfix.

    1. Liegt vermutlich an der Operatorenrangfolge. Klammern machen den Wunsch deutlicher.

      Danke, mit den Klammern geht es

      echo "Div: " . ($gesamtZeit - $zu1);
      
  2. Hallo Bernd,

    um Dedlfixens Aussage zu konkretisieren:

    http://php.net/manual/en/language.operators.precedence.php

    Da stehen + - . in einer Zeile, haben also gleichen Rang. Bei gleichem Rang erfolgt die Auswertung in der Reihenfolge der Assoziativität. Die Tabelle sagt "links", d.h. die Operatoren werden von links nach rechts ausgewertet.

    Die beiden folgenden Zeilen sind demzufolge gleichwertig:

    echo "Div: " . $gesamtZeit - $zu1;
    echo ("Div: " . $gesamtZeit) - $zu1;
    

    Wenn also in $gesamtZeit bspw. 100 steht und in $zu1 steht 17, dann sollte die Ausgabe

    -17
    

    lauten. Und wenn du die Ausgabe von Warnungen einschaltest, wie es sich während der Entwicklungszeit eigentlich gehört, dann lautet die Ausgabe

    **Warning**:  A non-numeric value encountered in ... on line ...
    -17
    

    Was Dir sagen will: Die Subtraktion einer Zahl von einem String ist undefiniert und darum werden String und Subtraktionsoperator schnöde ignoriert.

    Dir hätte beim eigenen Testen auffallen können, dass nicht nur die Gesamtzeit, sondern auch der Text "Div: " nicht ausgegeben worden ist.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo,

      **Warning**:  A non-numeric value encountered in ... on line ...
      -17
      

      wenn die meine Fehler einschalte

      error_reporting(E_ALL);
      ini_set('display_errors', 1);
      

      kommt nichts.

      Dir hätte beim eigenen Testen auffallen können, dass nicht nur die Gesamtzeit, sondern auch der Text "Div: " nicht ausgegeben worden ist.

      jetzt wo du es sagst fällt mir es tatsächlich auf.

      1. Hallo Bernd,

        wenn die meine Fehler einschalte (...) kommt nichts.

        Hä? Ich habe die PHP Sandbox von onlinephpfunctions verwendet, da sind die Warnings automatisch an und von da habe ich die erwähnte Meldung kopiert.

        display_errors ist hier nicht relevant, da geht's um Meldungen der Kategorie "Error", die das Script abbrechen.

        Wenn ich in der Sandbox error_reporting(E_ERROR) setze, verschwindet die Meldung. Mit error_reporting(E_ALL) kommt sie wieder. Bist Du sicher, dass Du nicht irgendwo das error_reporting wieder anders einstellst? Hast Du überhaupt schon mal Warnmeldungen von PHP gesehen, zumindest auf einer minimalen Testseite?

        Verwirrt
        Rolf

        --
        sumpsi - posui - clusi
        1. Tach!

          display_errors ist hier nicht relevant, da geht's um Meldungen der Kategorie "Error", die das Script abbrechen.

          Mit deaktiviertem display_errors werden gar keine Meldungen in die Ausgabe geschrieben, egal welches error_reporting-Level eingestellt ist. Man bekommt die Meldungen dann nur dorthin geliefert, was im error_log eingestellt ist.

          dedlfix.

          1. Hallo dedlfix,

            stimmt, das habe ich bei Kommandozeilentests falsch mitbekommen. Unabhängig von display_errors schreibt PHP auf der Kommandozeile den Fehler immer nach stderr, und das habe ich gesehen.

            Und die stderr-Ausgabe überklatscht dann die Ausgabe an den Browser. Wenn man im IIS FastCGI dem stderr-Modus als ReturnStdErrIn500 einstellt… Ihr Winnetou-Fans kennt sowas nicht 😉

            Rolf

            --
            sumpsi - posui - clusi
            1. hi,

              Und die stderr-Ausgabe überklatscht dann die Ausgabe an den Browser. Wenn man im IIS FastCGI dem stderr-Modus als ReturnStdErrIn500 einstellt… Ihr Winnetou-Fans kennt sowas nicht 😉

              Doch. Kennen wir. MFG

    2. Hi,

      Was Dir sagen will: Die Subtraktion einer Zahl von einem String ist undefiniert und darum werden String und Subtraktionsoperator schnöde ignoriert.

      Nö. Der String wird in eine Zahl umzuwandeln versucht, bei Mißerfolg wird 0 benutzt.

      echo "4"."2" - 17; ergibt 25. Weil der String "42" eben nicht ignoriert wird.

      cu,
      Andreas a/k/a MudGuard

  3. Fehlerhaft:

    $gesamtZeit = 3;
    $zu1 = 1;
    echo 'Div: ' . $gesamtZeit - $zu1 . PHP_EOL;
    
    PHP Warning:  A non-numeric value encountered in Standard input code on line 4
    PHP Stack trace:
    PHP   1. {main}() Standard input code:0
    -1
    

    Mit Komma statt Punkt (echo-parts):

    $gesamtZeit = 3;
    $zu1 = 1;
    echo 'Div: ' , $gesamtZeit - $zu1 , PHP_EOL;
    
    Div: 2
    

    Mit Klammern beim Verbinden des Strings:

    $gesamtZeit = 3;
    $zu1 = 1;
    echo 'Div: ' . ( $gesamtZeit - $zu1 ) . "\n";
    
    Div: 2
    

    Vermutlich beste Variante für solche Ausgaben: mit printf() und setlocale()

    setlocale( LC_ALL, 'de_DE' );
    $gesamtZeit = 3;
    $zu1 = 1;
    printf ( 'Div: %1.2f' . PHP_EOL, $gesamtZeit - $zu1 ) ;
    
    Div: 2,00