0

I have this function in my HTML body:

      <ul>
        <!-- Dynamic insertion of projects with PHP function -->
        <?php projectGallery(); ?>
      </ul>

And this is the PHP function itself:

// This function shows a list of projects on our home page
function projectGallery(){
    include 'includes/config.php';
    $result = mysqli_query($con,"SELECT * FROM project");

    while($row = mysqli_fetch_array($result)) {

        echo "<li>
                  <a href='#' data-reveal-id='".$row['project_id']."' data-animation='fade'>
                    <div class='project'>
                      <img class='project_image' src='images/upload/".$row['project_afbeelding']. "' />
                        <h2 class='title'>".$row['project_titel']."</h2>
                    </div>
                  </a>
             </li>" ;

    };
};

Well, if you're still reading despite the ugliness... My question is, would there be a cleaner way to write this echo part? Without the endless HTML string.

7 Answers 7

3

You have a few options. The first is to simply end the PHP tags:

function projectGallery(){
include 'includes/config.php';
$result = mysqli_query($con,"SELECT * FROM project");

    while($row = mysqli_fetch_array($result))
    {
    ?>

    <li>
        <a href='#' data-reveal-id='<?php echo $row['project_id']; ?>' data-animation='fade'>

            <div class='project'>
                <img class='project_image' src='images/upload/<?php echo $row['project_afbeelding']; ?>' />
                <h2 class='title'><?php echo $row['project_titel']; ?></h2>
            </div>
        </a>
    </li>

    <?php
    };
};

Another would be to create a string that you echo, which allows for greater editing in the future:

function projectGallery(){
include 'includes/config.php';
$result = mysqli_query($con,"SELECT * FROM project");
$output = '';
    while($row = mysqli_fetch_array($result))
    {
    $output .= "<li>";
    $output .= "<a href='#' data-reveal-id='".$row['project_id']."' data-animation='fade'>";

    $output .= "<div class='project'>";
    $output .= "<img class='project_image' src='images/upload/".$row['project_afbeelding']. "' />";
    $output .= "<h2 class='title'>".$row['project_titel']."</h2>";
    $output .= "</div>";

    $output .= "</a>";
    $output .= "</li>";

    };
echo $output;
};

Both have their merits, both are easier to manage and adapt at a later date

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

2 Comments

Hi! Even though everyone provided great solutions, I ended up using your $output string. Thanks for taking the time to help me out, and others who might find my question on stackoverflow. Big up!
Is there a name for the first technique? Saw a few examples and wanted to learn more about it - it looks very weird to someone from a non-php background!
2

Personally, I always do this. I love when there's a clean HTML source.

function projectGallery(){
 include 'includes/config.php';
 $result = mysqli_query($con,"SELECT * FROM project");

 while($row = mysqli_fetch_array($result)) { ?>

 <li><a href="#" data-reveal-id="<?php echo $row['project_id']; ?>" data-animation="fade">
  <div class="project">
   <img class="project_image" src="images/upload/<?php echo $row['project_afbeelding']; ?>" />
   <h2 class="title"><?php echo $row['project_titel']; ?></h2>
  </div>
 </a>
</li><?php
} ?>

That way, your IDE will recognize both the HTML and PHP content separately, giving you less chance of errors. This, however, if expanded upon, is a source of clutter. But as I said, for me, it's the source code above a lot of things.

Comments

1

You should never echo html code at all in PHP mode. This makes your code hard readable, you get crazy placing ' or " and your IDE (if you have one) cannot help you with HTML auto completion anymore).

You should always go like this:

<?php while($row = mysqli_fetch_array($result)) { ?>
    <li>
        <a href="#" data-reveal-id="<?=$row['project_id']?>" data-animation="fade">
            <div class="project">
                <img class="project_image" src="images/upload/<?=$row['project_afbeelding']?>" />
                <h2 class="title"><?=$row['project_titel']?></h2>
            </div>
        </a>
    </li>
<?php } ?>

So just open and close PHP again whenever you need it and leave it closed for a while.

Is equivalent to and exactly the same as:

<?="123"?>

But beware that some webservers are configured that short tags

Comments

0

try it

In html:

<?php echo projectGallery(); ?>

In function:

return "<li><a href='#' data-reveal-id='".$row['project_id']."' data-animation='fade'><div class='project'><img class='project_image' src='images/upload/".$row['project_afbeelding']. "' /><h2 class='title'>".$row['project_titel']."</h2></div></a></li>" ;

Comments

0
function projectGallery(){
include 'includes/config.php';
$result = mysqli_query($con,"SELECT * FROM project");

while($row = mysqli_fetch_array($result)) {
?>
   <li>
              <a href='#' data-reveal-id='<?=$row['project_id']?>' data-animation='fade'>
                <div class='project'>
                  <img class='project_image' src='images/upload/<?=$row['project_afbeelding']?>' />
                    <h2 class='title'><?=$row['project_titel']?></h2>
                </div>
              </a>
         </li>

Comments

0

You can create a function that takes a file and an array of values and extract those values into a variables within a confined context, include a file, capture the resulting output, and return as string:

function render_with_values($file, array $variables = null) {

     if (!file_exists($file)) { 
         throw new Exception('Template cant be found.'); 
     }

     if ($variables !== null)
         extract($variables); //Extract array values to variables; array('foo' => 'bar') will result to $foo = 'bar'; and will be avaiable in the template you are including below but will not leak outside a function call.

     ob_start(); //Supress output

     include $file; //File 

     $content = ob_get_contents(); //Retrieve supressed output.
     ob_end_clean(); //End output supression.

     return $content;

}

The change your code to:

function projectGallery(){
    include 'includes/config.php';
    $result = mysqli_query($con,"SELECT * FROM project");

    while($row = mysqli_fetch_array($result)) {

        echo render_with_values('path/to/gallery_item_template.php', $result)

    };
};

In path/to/gallery_item_template.php:

<li>
    <a href="#" data-reveal-id="<?php echo $project_id; ?>" data-animation="fade">
        <div class="project">
            <img class="project_image" src="images/upload/<?php echo $project_afbeelding; ?>" />
            <h2 class="title"><?php echo $project_title; ?></h2>
        </div>
    </a>
</li>

But seriously, read up on MVC and the concept of separation of concerns. You could check out templating engines like Twig.

Comments

0

Not necessarily the prettiest but it has not been mentioned yet, the fastest way (performance wise) way to concatenate some strings in PHP is to join an array.

function projectGallery(){

    // You should probably require that, not merely include.
    require_once 'includes/config.php';

    $result = mysqli_query($con, 'SELECT * FROM project');

    $buffer = array();

    while($row = mysqli_fetch_array($result)) {
        $buffer[] = '<li>';
        // You're using double quotes, so you can put variables directly
        // in your string, no need to concatenate with a dot. The missing
        // quotes in the array index key (project_id) are intentionnal
        // and valid PHP.
        $buffer[] = "<a href=\"#\" data-reveal-id=\"$row[project_id]\" data-animation=\"fade\">";
        $buffer[] = '<div class="project">';
        ...
        $buffer[] = '<li>';
    };

    echo implode('', $bufffer);
}

You should also keep in mind the difference between single and double quotes. Single quotes are processed faster because they can't contain variables. So, if you chose to use double quotes, you'd better have some variables in it instead of concatenating them with the dot operator.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.