151

I would like to embed HTML inside a PHP if statement, if it's even possible, because I'm thinking the HTML would appear before the PHP if statement is executed.

I'm trying to access a table in a database. I created a pulldown menu in HTML that lists all the tables in the database and once I select the table from the pulldown, I hit the submit button.

I use the isset function to see if the submit button has been pressed and run a loop in PHP to display the contents of the table in the database. So at this point I have the complete table but I want to run some more queries on this table. Hence the reason I'm trying to execute more HTML inside the if statement. Ultimately, I'm trying to either update (1 or more contents in a row or multiple rows) or delete (1 or more rows) contents in the table. What I'm trying to do is create another pulldown that corresponded to a column in a table to make the table search easier and radio buttons that correspond to whether I'd like to update or delete contents in the table.

1

6 Answers 6

439
<?php if($condition) : ?>
    <a href="http://yahoo.com">This will only display if $condition is true</a>
<?php endif; ?>

By request, here's elseif and else (which you can also find in the docs)

<?php if($condition) : ?>
    <a href="http://yahoo.com">This will only display if $condition is true</a>
<?php elseif($anotherCondition) : ?>
    more html
<?php else : ?>
    even more html
<?php endif; ?>

It's that simple.

The HTML will only be displayed if the condition is satisfied.

Sign up to request clarification or add additional context in comments.

1 Comment

"...(which you can also find in [the docs][1])" Where exactly are these docs you speak of?
51

Yes,

<?php if ( $my_name == "someguy" ) { ?> 
    HTML GOES HERE 
<?php } ?>

Comments

17

Yes.

<?php if ($my_name == 'someguy') { ?>
        HTML_GOES_HERE
<?php } ?>

3 Comments

Some servers don't have libxml or pdo_mysql installed, but we can still recommend solutions using them.
I think this should've been just a comment for Jon's answer.
Mmmkay. You want to tell me how exactly I embed formatted code in a comment?
3

Using PHP close/open tags is not very good solution because of 2 reasons: you can't print PHP variables in plain HTML and it make your code very hard to read (the next code block starts with an end bracket }, but the reader has no idea what was before).

Better is to use heredoc syntax. It is the same concept as in other languages (like bash).

 <?php
 if ($condition) {
   echo <<< END_OF_TEXT
     <b>lots of html</b> <i>$variable</i>
     lots of text...
 many lines possible, with any indentation, until the closing delimiter...
 END_OF_TEXT;
 }
 ?>

END_OF_TEXT is your delimiter (it can be basically any text like EOF, EOT). Everything between is considered string by PHP as if it were in double quotes, so you can print variables, but you don't have to escape any quotes, so it very convenient for printing html attributes.

Note that the closing delimiter must begin on the start of the line and semicolon must be placed right after it with no other chars (END_OF_TEXT;).

Heredoc with behaviour of string in single quotes (') is called nowdoc. No parsing is done inside of nowdoc. You use it in the same way as heredoc, just you put the opening delimiter in single quotes - echo <<< 'END_OF_TEXT'.

3 Comments

Thank you very much for reminding me of this. Heredoc is extremely helpful for more complex HTML with multiple conditions, and much easier than escaping attributes and quotes!
(the next code block starts with an end bracket } is a very strange reasoning. This very { brace can be clearly seen right above the code block, so it didn't go anywhere. All you did is just add a lot of echo <<< END_OF_TEXT that indeed gets the way. So instead of just plain PHP/HTML template you've got exactly the same but with HEREDOC added everywhere. What gives?
@YourCommonSense not sure how todays code editors handle separate php blocks <?php ?> with html in between, but I guess it could be issue (in syntax highlighting) back in 2016.
1

So if condition equals the value you want then the php document will run "include" and include will add that document to the current window for example:

`

<?php
$isARequest = true;
if ($isARequest){include('request.html');}/*So because $isARequest is true then it will include request.html but if its not a request then it will insert isNotARequest;*/
else if (!$isARequest) {include('isNotARequest.html')}
?>

`

1 Comment

It will require a hundred small HTML files which is a maintenance hell
-1

I know this is an old post, but I really hate that there is only one answer here that suggests not mixing html and php. Instead of mixing content one should use template systems, or create a basic template system themselves.

In the php

<?php 
  $var1 = 'Alice'; $var2 = 'apples'; $var3 = 'lunch'; $var4 = 'Bob';

  if ($var1 == 'Alice') {
    $html = file_get_contents('/path/to/file.html'); //get the html template
    $template_placeholders = array('##variable1##', '##variable2##', '##variable3##', '##variable4##'); // variable placeholders inside the template
    $template_replace_variables = array($var1, $var2, $var3, $var4); // the variables to pass to the template
    $html_output = str_replace($template_placeholders, $template_replace_variables, $html); // replace the placeholders with the actual variable values.
  }

  echo $html_output;
?>

In the html (/path/to/file.html)

<p>##variable1## ate ##variable2## for ##variable3## with ##variable4##.</p>

The output of this would be:

Alice ate apples for lunch with Bob.

9 Comments

That's not a template system but a self-deception. Using a template system doesn't mean a conditional statement shouldn't be used in the template.
I vastly disagree with you. A template system does not require a framework of any kind. In php a template system is any system that allows you to separate your code logic from your HTML markup. If there are conditional statements in your template, you have no separated the HTML markup from the code logic.
It's not about agreement or disagreement :) It's about real life. In 20 years, I've been engaged in this kind of conversation dozens, if not hundreds, times. Strangely, this kind of theoretical templating is quite appealing. But easily curable. Just try to implement your approach for a more or less viable template, that contains at least one loop and one condition, like a list of site users. And you will see that in pursue of eliminating the logic from HTML you'll end up in HTML leaking into your logic, and/or splitting HTML into billion small bits, making it maintenance nightmare.
I have used this exact type of code in incredibly complex applications with foreach loops, while loops, for loops, if then statements, database calls and multiple conditions I have never seen a problem. shugs
So it seems you have each template split into many small files, just like that line shown in your answer. So it means that you have got all the markup logic leaked into the code logic. Which is exactly opposite to your intentions. For example, you cannot work with entire design in a single file. And in case you need to fix some HTML tag, you will have to browse through dozens small files. A nightmare.
|