Rolf B: Wert geht verloren, wenn ein anderer Wert mit . angehängt wird

Beitrag lesen

Hallo Linuchs,

Dir fehlen Klammern. Du musst die komplette zweite Zeile nochmal einklammern.

Grund: der ;? Operator hat in PHP die niedrigste Priorität. Alles, was vor dem ? steht, wird deshalb zuerst ausgewertet.

Das ist ohne zusätzliche Klammern dies:

$row_vip['email'] . ( $row_vip['email_2'] && strpos( $row_vip['email_2'], "@" ))

In der Klammer steht ein boolescher Ausdruck, der zu TRUE auswertet (email_2 ist gefüllt und ein @ ist drin), das kettest Du an email an (wobei aus dem TRUE eine 1 wird) und erhältst jan@example.com1.

Das ist truthy, deswegen wird der Teil zwischen ? und : erstellt und an $mailEmail zugewiesen.

Das ist ein typischer Fall, wo man einen Ausdruck besser aufbricht statt eine lange Wurst zu konstruieren. ICH würde hier eine Funktion is_valid_email schreiben.

$mailEmail = $row_vip['email'] 
           . (is_valid_email($row_vip['email_2']) ? ",".$row_vip['email_2'] : '');

Oder vielleicht sogar besser noch

$mailEmail = $row_vip['email'];
if (is_valid_email($row_vip['email_2']))
{
   $mailEmail .= "," . $row_vip['email_2'];
}

Das sind zwar vier Zeilen statt zwei, aber VIEL besser lesbar. Und der von PHP daraus erstellte Bytecode dürfte nicht ineffizienter sein als der inline-Ausdruck.

Die is_valid_email Funktion kann deine eigenen Abfragen enthalten. Oder Du verwendest eine fertige PHP Funktion:

function is_valid_email($mail) {
   return filter_var($mail, 
                     FILTER_VALIDATE_EMAIL, FILTER_NULL_ON_FAILURE) !== NULL;
}

Ist eigentlich garantiert, dass $row_vip['email'] immer gefüllt ist und ist nur email_2 optional?

Rolf

--
sumpsi - posui - obstruxi