Matthias Apsel: PHP Warnmeldung nach trim()

Hallo alle,

vorher: bindParam(':klassenstufe', $_POST['klassenstufe'])

jetzt: bindParam(':klassenstufe', trim($_POST['klassenstufe']))

Das führt zu folgender Warnung:

Strict Standards: Only variables should be passed by reference

Muss ich da wirklich dies draus machen

$_POST['klassenstufe'] = trim($_POST['klassenstufe']);
bindParam(':klassenstufe', $_POST['klassenstufe']);

oder gibt es einen anderen Weg? Welchen tieferen Sinn hat diese Warnung?

Bis demnächst
Matthias

--
Rosen sind rot.

akzeptierte Antworten

  1. Hallo Matthias,

    Das führt zu folgender Warnung:

    Strict Standards: Only variables should be passed by reference

    Muss ich da wirklich dies draus machen

    $_POST['klassenstufe'] = trim($_POST['klassenstufe']);
    bindParam(':klassenstufe', $_POST['klassenstufe']);
    

    oder gibt es einen anderen Weg?

    Du musst den Rückgabewert von trim() wieder in eine Variable packen. Das geht nicht anders. Du kannst aber auf bindParam() verzichten.

    Welchen tieferen Sinn hat diese Warnung?

    Du bindest die Variable an den Platzhalter, nicht den Wert. Konkret heisst das, dass du z.B. bindParam() auf ein prepared Statement anwendest und dann in einer Schleife nur den Wert der Variablen änderst:

    $stmt = $db->prepare("INSERT INTO foo (:a, :b)");
    
    $a = null;
    $b = null;
    $stmt->bindParam(":a", $a);
    $stmt->bindParam(":b", $b);
    
    while($line = fgets($handle)) {
      list($a,$b) = explode(",", $line);
      $stmt->execute();
    }
    

    LG,
    CK

    1. Hallo Christian Kruse,

      Welchen tieferen Sinn hat diese Warnung?

      Du bindest die Variable an den Platzhalter, nicht den Wert.

      Ja. Ich erinnere mich wieder. Das hatten wir hier auch schon mal. bindParam() vs. bindValue() https://forum.selfhtml.org/m1676025 Wenn man sich nicht jeden Tag damit beschäftigt …

      Dankeschön.

      Bis demnächst
      Matthias

      --
      Rosen sind rot.
  2. Tach!

    vorher: bindParam(':klassenstufe', $_POST['klassenstufe'])

    jetzt: bindParam(':klassenstufe', trim($_POST['klassenstufe']))

    Das führt zu folgender Warnung:

    Strict Standards: Only variables should be passed by reference

    Muss ich da wirklich dies draus machen

    $_POST['klassenstufe'] = trim($_POST['klassenstufe']);
    bindParam(':klassenstufe', $_POST['klassenstufe']);
    

    oder gibt es einen anderen Weg? Welchen tieferen Sinn hat diese Warnung?

    bindParam() bindet eine Variable per Referenz und übergibt nicht nur eine Kopie des Wertes. Wenn du später den Variableninhalt änderst, wird der geänderte Wert genommen, an der Stelle, die auf diese gebundene Variable zugreift, in dem Fall das Execute.

    Du sollst da kein Funktionsergebnis übergeben, weil das keine Variable ist. Es kann aber sein, dass das trotzdem läuft, solange du nicht mehrfach Execute aufrufen möchtest.

    Du nimmst doch PDO, oder? Alternativ kannst du dann die bindParam-Geschichte weglassen und stattdessen die Werte dem Execute in Form eines Arrays übergeben. Zum Erstellen des Arrays kannst du auch Funktionsergebnisse direkt verwenden.

    dedlfix.