phpconcatenationconditional-operatorternaryexpression-evaluation

Concatenated string with ternary expression gives unexpected evaluation and error


This works:

<input type="text" name="foo" value="<?php echo isset($_POST['foo']) ? $_POST['foo'] : '' ?>"/>

This does not:

echo('<input type="text" name="foo" value="' . isset($_POST['foo']) ? $_POST['foo'] : '' . '"/>');

Notice: Undefined index: foo in /srv/www/form.php on line 15


Solution

  • PHP's operator precedence rules make it evaluate your second example as follows:

    echo(
      ('<input type="text" name="foo" value="'.isset($_POST['foo']))
        ? $_POST['foo']
        : (''.'"/>')
    );
    

    That doesn't make a lot of sense in several ways. And since the result of isset() is essentially disregarded, this always ends up just trying to print $_POST['foo']. And that results in a notice when it's not set, of course.

    Add parentheses around the actual ternary expression. I.e.

    (isset($_POST['foo']) ? $_POST['foo'] : '')