Carmen: Only variables should be passed by reference in

Hallo,

hier hat man mit empfohlen eine neuere PHP Version zu verwenden. Ich bin auf PHP 5.6 umgestiegen. Seite läuft noch, allerdings erhalte ich folgende Meldung

Only variables should be passed by reference

Die Funktion

 function userDaten($mysqli, $id) {
        $stmt = $mysqli->prepare("SELECT user_code, user_type, user_nickname, user_login, ud_name, ud_vorname 
                                  FROM users 
                                  LEFT JOIN users_detail ON users_detail.ud_Uid = users.user_code 
                                  WHERE user_session=?");
        $stmt->bind_param("s", session_id());
        $stmt->execute();
        $stmt->bind_result($user_code, $user_type, $user_nickname, $user_login, $ud_name, $ud_vorname);

        $stmt->fetch();
        
        $userDaten = array( 
                    'user_code'         => $user_code,
                    'user_type'         => $user_type,
                    'user_nickname'     => $user_nickname,
                    'user_login'        => $user_login,
                    'ud_name'           => $ud_name,
                    'ud_vorname'        => $ud_vorname 
                );
        
        return (object)$userDaten;
    }
  1. Tach!

    Only variables should be passed by reference

        $stmt->bind_param("s", session_id());
    

    Mit session_id() übergibst du ein Funktionsergebnis, keine Variable. Das Binden will immer eine Variable haben, weil es darauf eine Referenz legen möchte.

    Bitte immer angeben, welche Zeile betroffen ist. In dem Fall war das (für mich) recht einfach zu finden, aber das muss ja nicht immer so eindeutig sein.

    dedlfix.

    1. Hallo,

      Mit session_id() übergibst du ein Funktionsergebnis, keine Variable. Das Binden will immer eine Variable haben, weil es darauf eine Referenz legen möchte.

      das heißt also ich ändere die Zeile wie folgt ab?:

      function userDaten($mysqli, $id) {
      		
         $session = session_id();
         [....]
         $stmt->bind_param("s", $session);
      

      Bitte immer angeben, welche Zeile betroffen ist. In dem Fall war das (für mich) recht einfach zu finden, aber das muss ja nicht immer so eindeutig sein.

      Alles klar, merke ich mir für die Zukunft.

      1. Tach!

        das heißt also ich ändere die Zeile wie folgt ab?:

           $session = session_id();
           $stmt->bind_param("s", $session);
        

        Ja, damit gibt sich PHP zufrieden.

        dedlfix.

        1. Hallo,

          Ja, damit gibt sich PHP zufrieden.

          danke. Was ich nicht ganz verstehe, wenn ich die Fehlermeldungen ausblenden lasse:

          error_reporting(E_ALL);
          error_reporting(E_ALL ^  E_NOTICE); 
          ini_set('display_errors', 0);
          

          sind diese logischerweise weg, aber das Script funktioniert weiterhin. Das heißt also PHP möchte gerne eine Variable haben, meckert auch wenn diese nicht da, gibt sich aber auch mit einem Funktionsergebnis gezwungenermaßen zufrieden?

          Sprich ist sollte das Problem beheben kann aber erstmal alles so weiter laufen lassen und einfach die Fehlermeldungen nicht ausgeben, richtig?

          1. Tach!

            Was ich nicht ganz verstehe, wenn ich die Fehlermeldungen ausblenden lasse [...] sind diese logischerweise weg, aber das Script funktioniert weiterhin. Das heißt also PHP möchte gerne eine Variable haben, meckert auch wenn diese nicht da, gibt sich aber auch mit einem Funktionsergebnis gezwungenermaßen zufrieden?

            In dem Fall ja, es gibt aber andere Fehler, da gibt sich PHP zunächst auch erstmal zufrieden, kann dann aber später nicht mehr richtig arbeiten. Oder dein Programm kann nicht mehr das gewünschte Ergebnis erzeugen. Beispielswiese kannst du dich beim Variablennamen vertippen und so von einer nicht vorhandenen Variable lesen. Gibt auch nur eine Notice. Und eben einen falschen Wert im weiteren Verlauf.

            Sprich ist sollte das Problem beheben kann aber erstmal alles so weiter laufen lassen und einfach die Fehlermeldungen nicht ausgeben, richtig?

            Einfach, aber nicht ungefährlich. Man kann auch alle Verkehrsschilder ignorieren - kann gut gehen, muss aber nicht.

            dedlfix.

          2. Sprich ist sollte das Problem beheben kann aber erstmal alles so weiter laufen lassen und einfach die Fehlermeldungen nicht ausgeben, richtig?

            Niemals.

            Ein PHP-Skript ist fertig wenn weder Fehler noch Warnungen noch Notizen ausgegeben werden. Von dieser Regel gibt es nur sehr wenige Ausnahmefälle und selbst dann möchte man die Ausnahme (Exception) selbst abfangen. In anderen Sprachen gibt es sogar Konstrukte wie "use strict" oder "option explicit" welche dazu führen, dass der Ablauf nicht mit einer Warnung oder Notiz fortgesetzt, sondern mit einer Fehlermeldung abgebrochen wird.

            Eine Google-Suche nach "php use strict" oder "php option explicit" führt zu etlichen Quellen.