Mailinglist – php example code – part 6 – further small improvements

Article focus on small code improvements that can be extended by time. Our firs improvement is separation of database access constants into a appvars.php file. This file is included into a main code with require_once(); PHP function.

Better maintainability of of code is gained by separating all constants on one place. Then they can be invoked by include or require_once() PHP function. For further reading about diferences between these function, please visit as example this page.

File with defined constants, in our case database server access parameters is implemented in all .php files with require_once() statement.

appvars.php code

Next photo show content of mentioned file.

Example of appvars.php code

Example of changed parts of other pages follow.

<?php  // script for accessing database and first table structure establishement
require_once(appvars.php)// including variables for database

/* Attempt MySQL server connection. Assuming you are running MySQL
server with  (user ‚admin‘ with  password test*555) */
$dbc = mysqli_connect(DB_HOST, DB_USERDB_PWDB_NAME);
… next part omitted

Full application code of mailinglist can be obtained from github here.




Mailinglist – php example code – part 5 – unsubscribe by e-mail for users

Article focus on improvement mailinglist app for enabling access for common users only on by e-mail unsubscription without ability to see list of all subscribed users.

Goal of unsubscribe by user app extension

For further security hardening (not main improvement but first partialy update) we separate page for unsubscribing for admin (somebody who knows name of that page – no improvement in this way is done) and for unsubscribing for common user.

Users cannot see list of all subscribers names and email. But there is no way for refering any changes in the table. For better user experience, we expanded messaging output for information about:

  • that e-mail was found in database table – select query search database for appropriate e-mail
  • that e-mail was succesfully deleted from databse
  • or warning message that e-mail was not found (user with this e-mail is not subscribed for mailing)

Frontend of the page after inserting wrong e-mail looks like this

e-mail is not in subscribers list

or succesfull e-mail removed output

e-mail was found and removed from list

Main logic of script

Next code snipet contains logic for finding appropriate-mail and show message about succesfull search. Next deleting selected e-mail from subscribtion list.

<?php
    // two variables for message and styling of the mesage with bootstrap
    require_once(‚appvars.php‘); // including variables for database

 

    $msg = “;
    $msgClass = “;
    $msg_about_contains_email = “;
    $msgClass_email = “;

 

    // default values of auxiliary variables
    $email =““;
  

 

    $is_removed = false; //before hitting submit button no result is available
    $is_present = false; // email is not in the table – default before slecting against user submitted email for deletion
    
    if(filter_has_var(INPUT_POST, ‚submit‘)){
        // Data obtained from $_postmessage are assigned to local variables
        $email = htmlspecialchars($_POST[‚email‘]);
       
    
        // Controll if all required fields was written
        if(!empty($email) ) {
            // If check passed – all needed fields are written
            if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
                // E-mail is not walid
                $msg = ‚Please use a valid email‘;
                $msgClass = ‚alert-danger‘;
            } else {
                // E-mail is walid – now delete row with matching e-mail

 

                        // make database connection
                    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PW, DB_NAME);

 

                    // Check connection
                        if($dbc === false){
                            die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
                        }
                    
                    // get info if appropriate e-mail is in mailinglist
                       // create SELECT query
                        $sql = „SELECT email FROM mailinglist WHERE email = „.“‚$email'“;

                        if(($row[‚email‘] = mysqli_fetch_array($result = mysqli_query($dbc, $sql))) != ‚){
                            
                            $msg_about_contains_email = ‚Subscriber with e-mail: ‚.$email. ‚ was found in database for deletion.‘;
                            $msgClass_email = ‚alert-success‘;
                            $is_present = true;

 

                            // create DELETE query
                            $sql = „DELETE FROM mailinglist WHERE email = „.“‚$email'“.“ LIMIT 1″;
 
                            if(mysqli_query($dbc, $sql)){
                            
                                $msg = ‚Subscriber with e-mail: ‚.$email. ‚ has been succesfully removed from mailinglist.‘;
                                $msgClass = ‚alert-success‘;
                                $is_removed = true;
                                                      
                                };
                            
                                         
                        } else{
                            $msg_about_contains_email = ‚Subscriber with e-mail: ‚.$email. ‚ was not found in database for deletion. Probably was not subscribed for mailing.‘;
                            $msgClass_email ‚alert-warning‚;
                            $msg = „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc);
                            $msgClass = ‚alert-danger‘;
                            $is_present = false;
                        };

       

                    // end connection
                        mysqli_close($dbc);
                    };           
                
        } else {
            // Failed – if not all fields are fullfiled
            $msg = ‚Please fill in all fields‘;
            $msgClass = ‚alert-danger‘; // bootstrap format for allert message with red color
        }; 
    };  
    
    
    // if reset button clicked
    if(filter_has_var(INPUT_POST, ‚reset‘)){
        $msg = “;
        $msgClass = “; // bootstrap format for allert message with red color
        $subject =“;
        $email =“;
        $msg_about_contains_email = “;
        
    };
        
?>

Full code of page usrunsub.php can be obtained from github here.




Mailinglist – php example code – part 4 – unsubscribe by e-mail

Article focus on mechanism for unsubscribing users from mailinglist by their e-mails. Because this part is meant to by available for admin, full list of subscribers are shown after all removing action for further look.

Form part

Form part is simplest ever, because sonsist only from one inputfiled gaining e-mail address to usubscribe from mailinglist.

<form method=“post“ action=“<?php echo $_SERVER[‚PHP_SELF‘]; ?>“>
          <div class=“form-group“>
              <label>e-mail to unsubscribe:</label>
              <input type=“text“ onfocus=“this.value=’@'“  name=“email“ class=“form-control“ value=“<?php echo isset($_POST[‚email‘]) ? $email : ‚Write e-mail address to unsubscribe here‘; ?>“>
          </div>
          
         
     
          <button type=“submit“ name=“submit“ class=“btn btn-warning“> Unsubscribe </button>
          

Unsubscribe by e-mail php code

For finding and removing unwanted subscribers from a database table is used simple matching e-mail adress.

<?php
    // two variables for message and styling of the mesage with bootstrap
    $msg = “;
    $msgClass = “;

    // default values of auxiliary variables
    $email =““;
  

    $is_removed = false; //before hitting submit button no result is available
    
    if(filter_has_var(INPUT_POST, ‚submit‘)){
        // Data obtained from $_postmessage are assigned to local variables
        $email = htmlspecialchars($_POST[‚email‘]);
       
          
        // Controll if all required fields was written
        if(!empty($email) ) {
            // If check passed – all needed fields are written
            if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
                // E-mail is not walid
                $msg = ‚Please use a valid email‘;
                $msgClass = ‚alert-danger‘;
            } else {
                // E-mail is valid – now delete row with matching e-mail

                        // make database connection
                    $dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);

                    // Check connection
                        if($dbc === false){
                            die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
                        }
                    
                  

                    // create DELETE query
                    $sql = „DELETE FROM mailinglist WHERE email = „.“‚$email'“ ;

                        if(mysqli_query($dbc, $sql)){
                            
                            $msg = ‚Subscriber with e-mail: ‚.$email. ‚ has been succesfully removed from mailinglist.‘;
                            $msgClass = ‚alert-success‘;
                            $is_removed = true;

                            // clear entry fields after sucessfull deleting from database
                            
                                         
                        } else {
                            
                            $msg = „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc);
                            $msgClass = ‚alert-danger‘;
                            $is_removed = false;
                        }

                    // end connection
                        mysqli_close($dbc);

                    };           
                
        } else {
            // Failed – if not all fields are fullfiled
            $msg = ‚Please fill in all fields‘;
            $msgClass = ‚alert-danger‘; // bootstrap format for allert message with red color
        }; 

    };  
    
  
    
    // if reset button clicked
    if(filter_has_var(INPUT_POST, ‚reset‘)){
        $msg = “;
        $msgClass = “; // bootstrap format for allert message with red color
        $subject =“;
        $email =“;
        
    };
        
?>

Full code of mailinglist app can be obtained from here.




Mailinglist – php example code – part 3 – mailer page

Article focus on part responsible for creating a post and resending them to a subscribers. List of subscribers is also shown.

Form part

Sending of separate information messages to subscribers is enabled by mailer.php page. Form part of the page consist from two filed. Simple input text filed for subject. Second much bigger textarea for gaining text of message from page admin.

Look at GUI of mailer.php page

 <form method=“post“ action=“<?php echo $_SERVER[‚PHP_SELF‘]; ?>“>
          <div class=“form-group“>
              <label>Subject of send message:</label>
              <input type=“text“ onfocus=“this.value=““  name=“subject“ class=“form-control“ value=“<?php echo isset($_POST[‚firstname‘]) ? $subject : ‚Subject of message:‘; ?>“>
 
              <label>Message to send:</label>
              <textarea onfocus=“this.value=““ id=“message“ name=“message“ class=“form-control“ rows=“10″ cols=“50″><?php echo isset($_POST[‚message‘]) ? $message : ‚Your text goes here …‘; ?></textarea>
          </div>
          
              
          <button type=“submit“ name=“submit“ class=“btn btn-warning“> Send to subscribers </button>
          <button type=“submit“ name=“reset“ class=“btn btn-info“> Reset form </button>

Interesting part of code is inserted in input tag  onfocus=“this.value=““ that enable clearing information „value“ text inserted into a form field.

Sending e-mail-s

Part for sending a e-mails is inserted into a HTML body because we will produce messages after all succesfully sent e-mails. Full code can be obtainted for further reference and study from github here.

 <?php // if message to send was submitted then emails are sent mail by mail

      // Control if data was submitted
    if(filter_has_var(INPUT_POST, ‚submit‘)){
        // $subject and $message was aded to variables in scrit on upper part of page, because we expect outpu about sending email
        // in body of page thic code is inserted in html body part of code
        

        // Controll if all required fields was written
        if(!empty($subject) && !empty($message)) {
            // If check passed – all needed fields are written
            $is_result = true;
            // send e-mail to all subscribers

                // connect to database
                $dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);
 
                // Check connection
                    if($dbc === false){
                        die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
                    }
            
                // read all e-mails from database – create query and pass it to database server

                $sql = „SELECT DISTINCT email FROM mailinglist“;

                if($output = mysqli_query($dbc, $sql)){
                    if(mysqli_num_rows($output) > 0){  // if any record obtained from SELECT query
                        
                        // create  and send email one by one
                        
                        echo „<h4>Sending e-mails</h4>“;
                        echo „<br>“;
    
                        while($row = mysqli_fetch_array($output)){ //send email by email and output message
                            // create email structure
                            // E-mail is ok
                                $fromEmail = ‚ciljak@localhost.org‘; //!!! e-mail address from message is send – change for your needs!!!
                                $toEmail = $row[‚email‘];
                                $body = $message;

                                // Email Headers
                                $headers = „MIME-Version: 1.0″ .“\r\n“;
                                $headers .=“Content-Type:text/html;charset=UTF-8″ . „\r\n“;

                                // Additional Headers
                                $headers .= „From: CDesigner.eu  <„.$fromEmail.“>“. „\r\n“;

                                if(mail($toEmail, $subject, $body, $headers)){
                                    // Email Sent
                                    echo „<p> Email to: „;
                                    echo “ „ . $row[‚email‘] . “ „;
                                    echo “  has been sent … </p>„;
                                   
                                } else {
                                    // Failed
                                    echo „<p> Email to: „;
                                    echo “ “ . $row[‚email‘] . „ „;
                                    echo “  cannot be send, please examine your email server connection! </p>„;
                                }

                            
                                
                        }
                        echo „<br>“;
                        // Free result set – free the memory associated with the result
                        mysqli_free_result($output);
                    } else{
                        echo „There is no subscriber in mailinglist. Please add them.“; // if no records in table
                    }
                } else{
                    echo „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc); // if database query problem
                }
    
                // Close connection
                mysqli_close($dbc);
               
                
        } else {
            // Failed – if not all fields are fullfiled
            $msg = ‚Please fill in all contactform fields‘;
            $msgClass = ‚alert-danger‘; // bootstrap format for allert message with red color
        }; 

    };  

      ?>

Listener of subscribers part

Our next php code part is responsible for showing list of subscribers in form of a table. For styling of the output, some css was added to style.css file (github link is here).

<?php // code showing all subscribers in form of a table at end of the page

            /* Attempt MySQL server connection. Assuming you are running MySQL
            server with default setting (user ‚root‘ with no password) */
            $dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);
            
            // Check connection
            if($dbc === false){
                die(„ERROR: Could not connect to database – stage of article listing. “ . mysqli_connect_error());
            }
            
            
                
                        
            // read all rows (data) from guestbook table in „test“ database
            $sql = „SELECT FROM mailinglist ORDER BY id DESC„;  // read in reverse order – newest article first
            /*****************************************************************/
            /*   Output in Table – solution 1 – for debuging data from database     */
            /*****************************************************************/
            // if data properly selected from mailinglist database tabele
            
            echo „<h4>Our subscribers mailinglist</h4>„;
            echo „<br>„;
            echo ‚ <button class=“btn btn-secondary btn-lg “ onclick=“location.href=\’unsubscribe.php\'“ type=“button“>  Unsubscribe by e-mail -> </button>‚;
            
            echo „<br>“; echo „<br>„;
            
                if($output = mysqli_query($dbc, $sql)){
                    if(mysqli_num_rows($output) > 0){  // if any record obtained from SELECT query
                        // create table output
                        echo „<table>“; //head of table
                            echo „<tr>„;
                                echo „<th>id</th>„;
                                echo „<th>firstname</th>„;
                                echo „<th>lastname</th>„;
                                echo „<th>date</th>„;
                                echo „<th>email</th>„;
                                
                            echo „</tr>„;
                        while($row = mysqli_fetch_array($output)){ //next rows outputed in while loop
                            echo “ <div class=\“mailinglist\“> “ ;
                            echo „<tr>„;
                                echo „<td>“ . $row[‚id‘] . „</td>„;
                                echo „<td>“ . $row[‚firstname_of_subscriber‘] . „</td>„;
                                echo „<td>“ . $row[‚secondname_of_subscriber‘] . „</td>„;
                                echo „<td>“ . $row[‚write_date‘] . „</td>„;
                                echo „<td>“ . $row[‚email‘] . „</td>„;
                            echo „</tr>„;
                            echo “ </div> “ ;
                        }
                        echo „</table>„;
                        // Free result set
                        mysqli_free_result($output);
                    } else{
                        echo „There is no postmessage in Guestbook. Please wirite one.„; // if no records in table
                    }
                } else{
                    echo „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc)// if database query problem
                }
            
            

            // Close connection
            mysqli_close($dbc);
            ?>

Full mailinglist app code is available from here.




Mailinglist – php example code – part 2 – subscribtion page

Article describe database table design and appropriate parts of index.php responsible for subsribtion of user into a mailinglist.

Before preparation of php code for our subscribtion page, we must do some consideration about data that will by stored from users subsribing into mailinglist.

Establishment of database table

In our mailinglist database table will hold ifo about:

  • first name of subscriber
  • lastname of subscriber
  • current date of subscribtion (now() function produce current timestamp)
  • e-mail of subcriber – UNIQUE value allowed only!!
  • GDPR true/ flase hold in tiny INT filed
  • Newsletter subscribed info – true/false hold in tiny INT field
  • ID

Next picture shows structure of table mailinglist in PHPmyadmin

For simplified perparation of database table is prepared creational script createdatabase.php with content:

<!– ****************************************************************** –>
<!– PHP  code for automation of preparation databasetable for mailinglist app     –>
<!– ********************************************************************* –>
<!– Vrsion: 1.0        Date: 8.9.2020 by CDesigner.eu                                            –>
<!– ********************************************************************* –>

<?php // script for accessing database and first table structure establishement

/* Attempt MySQL server connection. Assuming you are running MySQL
server with  (user ‚admin‘ with  password test*555) */
$dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);
 
// Check connection
if($dbc === false){
    die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
}
 
// Attempt create table query execution
$sql = „CREATE TABLE mailinglist(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    firstname_of_subscriber VARCHAR(40) NOT NULL,
    secondname_of_subscriber VARCHAR(40) NOT NULL,
    write_date DATETIME NOT NULL,
    email VARCHAR(70) NOT NULL UNIQUE, /* UNIQUE e-mails enabled only as security befor sending duplicite messages */
   /* message_text TEXT */ /* optionally add boolean fields for subscription */
    GDPR_accept BOOLEAN, /* BOOLEAN value if user accepted GDPR */
    news_accept BOOLEAN  /* BOOLEAN value if user accepted newsletter */
)“;
if(mysqli_query($dbc, $sql)){
    echo „Table created successfully.“;
} else{
    echo „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc);
}
 
// Close connection
mysqli_close($dbc);
?>

Form part of php code

Our form code looks like

<form method=“post“ action=“<?php echo $_SERVER[‚PHP_SELF‘]; ?>„>
          <div class=“form-group“>
              <label>Please provide Your first name:</label>
              <input type=“text“ onfocus=“this.value='<?php echo isset($_POST[‚firstname‘]) ? $firstname : “; ?>'“ name=“firstname“ class=“form-control“ value=“<?php echo isset($_POST[‚firstname‘]) ? $firstname : ‚Your Firstname‘; ?>“>

              <label>Please provide Your last name:</label>
              <input type=“text“ onfocus=“this.value='<?php echo isset($_POST[‚firstname‘]) ? $lastname : “; ?>'“ name=“lastname“ class=“form-control“ value=“<?php echo isset($_POST[‚lastname‘]) ? $lastname : ‚Your Lastname‘; ?>“>
          </div>
          <div class=“form-group“>
            <label>E-mail:</label>
            <input type=“text“ onfocus=“this.value='<?php echo isset($_POST[‚email‘]) ? $email : ‚@‘; ?>'“name=“email“ class=“form-control“ value=“<?php echo isset($_POST[‚email‘]) ? $email : ‚@‘; ?>“>
          </div>

          <div class=“form-group“>
            
            <input type=“checkbox“ name=“gdpr“ class=“form-control“ value=“<?php echo isset($_POST[‚gdpr‘]) ? $gdpr : ‚gdpr‘; ?>“>
            <label>I agree with GDPR regulations</label>

              
            <input type=“checkbox“ name=“newsletter“ class=“form-control“ value=“<?php echo isset($_POST[‚newsletter‘]) ? $newsletter : ‚newsletter‘; ?>“> 
            <label>I subscribe to Newsletter:</label>
          </div>

         
     
          <button type=“submit“ name=“submit“ class=“btn btn-warning“> Subscribe to mailinglist </button>
          
          <button type=“submit“ name=“delete“ class=“btn btn-danger“> Unsubscribe now </button>

          <button type=“submit“ name=“reset“ class=“btn btn-info“> Reset form </button>
          <br>

For outputting of succesfull message after adding e-mail into a list is used

<?php   //part displaying info after succesfull added subscriber into a mailinglist
                 if ($is_result ) {
                    

                        echo „<br> <br>„;
                        echo „ <table class=\“table table-success\“> „;
                        echo „ <tr>
                               <td><h5> <em> E-mail: </em> $email </h5> <h5> succesfully added to mailinglist and granted these privileges </h5> „;
                        if ($gdpr == true ) { echo „<h5> GDPR accepted </h5>„;  } ; //if GDPR rights granted
                        if ($newsletter == true ) { echo „<h5> Newsletter subscribed </h5>„;    } ; //if subscribed to a newsletter    
                        echo “     <td>   </tr> „; 
                        echo “ </table> „;
                    
                    //echo “ <input type=“text“ id=“result_field“ name=“result_field“ value=“$result“  >  <br>“ ;
                } ; 
                 ?>

Main script on index.php page

Main sript is located on upper part of index.php page. This code is responsible for obtaining POST submitted data (self submission). Next make validation and injection preventing by simple htmlspecialchar(). Only valid e-mails can pass to next stage.

Next parts make solution for database subscriber inserting, deletion of current unwanted subscriber (at time of current opened subsribe form, user can make quick remove decision).

If user will remove next time, must contact admin or in future code will by expaned about separate page for removing by e-mail but without listening table of currently subscribed user (GDPR data lost prevention). But keep in mind our apps are only for demonstration, before proper ussage must be security hardened in a much deeper way (use it on your own risk).

<?php
    // two variables for message and styling of the mesage with bootstrap
    $msg = “;
    $msgClass = “;

    // default values of auxiliary variables
    $email = „“;
    $firstname = „“;
    $lastname = „“;
    $gdpr = ‚0‘;
    $newsletter = ‚0‘;
    $is_result = false; //before hitting submit button no result is available
    
    // Control if data was submitted
    if(filter_has_var(INPUT_POST, ‚submit‘)){
        // Data obtained from $_postmessage are assigned to local variables
        $firstname = htmlspecialchars($_POST[‚firstname‘]);
        $lastname = htmlspecialchars($_POST[‚lastname‘]);
        $email = htmlspecialchars($_POST[‚email‘]);
        $gdpr = isset($_POST[‚gdpr‘]); // checkbox doesnot send post data, they must be checked for its set state !!!
        $newsletter = isset($_POST[‚newsletter‘]); 
        
        

        // Controll if all required fields was written
        if(!empty($email) && !empty($firstname) && !empty($lastname)){
            // If check passed – all needed fields are written
            // Check if E-mail is valid
            if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
                // E-mail is not walid
                $msg = ‚Please use a valid email‘;
                $msgClass = ‚alert-danger‘;
            } else {
                // E-mail is ok
                $is_result = true;
                $toEmail = ‚ciljak@localhost.org‘; //!!! e-mail address to send to – change for your needs!!!
                $subject = ‚Guestbook entry from ‚.$firstname.‘ ‚.$lastname;
                $body = ‚<h2>To your Guestbook submitted:</h2>
                    <h4>Name</h4><p>‘.$firstname.'</p>
                    <h4>Email</h4><p>‘.$email.'</p>
                    ‚;

                // Email Headers
                $headers = „MIME-Version: 1.0″ .“\r\n“;
                $headers .=“Content-Type:text/html;charset=UTF-8″ . „\r\n“;

                // Additional Headers
                $headers .= „From: “ .$lastname. „<„.$email.“>“. „\r\n“;

              
                   // insert into databse 

                        // make database connection
                        $dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);
 
                        // Check connection
                            if($dbc === false){
                                die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
                            }
                        
                        // INSERT new entry
                      
                        $sql = „INSERT INTO mailinglist (firstname_of_subscriber, secondname_of_subscriber, write_date, email, GDPR_accept, news_accept) 
                        VALUES (‚$firstname‚, ‚$lastname‚, now() , ‚$email‚ , ‚$gdpr‚ , ‚$newsletter‚)“;

                        if(mysqli_query($dbc, $sql)){
                            
                            $msg = ‚new subscriber‘.$email.‘ succesfully added‘;
                            $msgClass = ‚alert-success‘;
                        } else{
                            
                            $msg = „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc);
                            $msgClass = ‚alert-danger‘;
                        }

                        // end connection
                            mysqli_close($dbc);
                if(mail($toEmail, $subject, $body, $headers)){
                    // Email Sent
                    $msg .= ‚Your postmessage was sucessfully send via e-mail‘;
                    $msgClass = ‚alert-success‘;
                } else {
                    // Failed
                    $msg = ‚Your postmessage was not sucessfully send via e-mail‘;
                    $msgClass = ‚alert-danger‘;
                }
            }
        } else {
            // Failed – if not all fields are fullfiled
            $msg = ‚Please fill in all contactform fields‘;
            $msgClass = ‚alert-danger‘; // bootstrap format for allert message with red color
        }

    };  
  
    // if delete button clicked
    if(filter_has_var(INPUT_POST, ‚delete‘)){
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
            // E-mail is not walid
            $msg = ‚Please use a valid email‘;
            $msgClass = ‚alert-danger‘;
        } else {

            $msg = ‚Delete last mesage hit‘;
            $msgClass = ‚alert-danger‘; // bootstrap format for allert message with red color
        
            // delete from database

            // make database connection
            $dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);

            // Check connection
                if($dbc === false){
                    die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
                }
            
            // DELETE last input by matching your written message
               // obtain message string for comparison

               $email = htmlspecialchars($_POST[‚email‘]); 
               $postmessage = trim($postmessage);

               // create DELETE query
               $sql = „DELETE FROM mailinglist WHERE email = „.“‚$email‚“ ;

                if(mysqli_query($dbc, $sql)){
                    
                    $msg = ‚Last subscriber sucessfully removed from database.‘;
                    $msgClass = ‚alert-success‘;

                    // clear entry fileds after sucessfull deleting from database
                    $firstname =“;
                    $lastname =“;
                    $email =“;
                    $gdpr = false; 
                    $newsletter = false; 
                } else{
                    
                    $msg = „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc);
                    $msgClass = ‚alert-danger‘;
                }

            // end connection
                mysqli_close($dbc);

            }
            

    };

    // if reset button clicked
    if(filter_has_var(INPUT_POST, ‚reset‘)){
        $msg = “;
        $msgClass = “; // bootstrap format for allert message with red color
        $firstname =“;
        $lastname =“;
        $email =“;
        $gdpr = false; 
        $newsletter = false; 
    };
        
?>

Current version of mailingapp can be obtained from github here.




Mailinglist – php example code – part 1 – app decomposition

Article descreibes decomposition of problem for mailinglist app. Users can subscribe for newsletter, grant GDPR. Admin can send mass emails to subscreibers an remove them by e-mail.

Our goals are:

  1. Users of app can subscribe into a mailinglist. Optionaly current subscribtion can be removed just in time. If user will be removed from mailinglist. Then only admin can remove them. (our first demonstration does not solve security at login level – admins only know names of files on server, that is not wery hard solution).
  2. Admin use separate page for writing subject and main message. After wiriting these parts, e-mail are send one by one. For consideration is how to prevent to send duplicate e-mails. Two sulution can be used – UNIQUE keyword for email database field and during queriing database for result DISTINCT for emails.
    For better insight in what is goin on are outputed infos about sending e-mails and also list of subscreibers is on bottom part of page. For unsubscribing users is on bottom of the page available button referencing on thirt page of app.
  3. App for unsubscribing users by e-mail for administrator of mailinglist. One field gain email that must be removed from subscription. After submitting appropriate e-mail is removed and new listing of subscribed user is showed for further verification.
  4. Optionaly will by added simplified verion page for unsubscribe user by e-mail. This page does not show list of all subscreibers, only say that appropriate email was found on database and was succesfully removed from them.

Next pictures shows GUI of appropriate page from final mailinglist app:

  1. Subscribtion into mailinglist page

  1. Admin for sending e-mails into a subscreibers

  1. Page for unsubscreibing by an e-mail

In a further articles we will take a closer look at appropriate pages. Current version of mailingapp can be obtained from github here.




Guestbook – php example code

This article show php code of simple guestbook with adding post, remove latest post and form reset functionality. All content of article is saved in database.

Guestbook is a simple php application with ability:

  • Post user commit into guestbook – data are stored in mariadb/ mysql database
  • Remove latest user post – latest message in form is used for matching database row in DELETE sql query
  • Reset button reinitialize all displayed messages in space of submit form (upper part of page)

Next picture show final state of our aplication

Guestbook – GUI of application

Basic prerequisities

Before creating our application, we must consider all requirements for data stored in database.

Our database table Guestbook will store:

  • id (uniqe self incrementing number)
  • name_of_writer – text up to 30 chars,
  • write_date – date/ time type generated by script along current time
  • email – text up to 70 chars,
  • message_text – large text with minimal 65 535 chars.

For firstime database and table creation was used phpMyAdmin in XAMPP environment.

Setup data for database access are:

server: localhost or 127.0.0.1

database: test

name: admin

password: test*555

Database and user account is created in phpMyAdmin and first result is shown on next picture.

For quick database table creation we prepared php script with name createdatabase.php with content:

<?php // script for accessing database and first table structure establishement

/* Attempt MySQL server connection. Assuming you are running MySQL
server with default setting (user ‚root‘ with no password) */
$dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);
 
// Check connection
if($dbc === false){
    die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
}
 
// Attempt create table query execution
$sql = „CREATE TABLE guestbook(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name_of_writer VARCHAR(30) NOT NULL,
    write_date DATETIME NOT NULL,
    email VARCHAR(70) NOT NULL, /*  UNIQUE removed because posts with same e-mails must be anabled */
    message_text TEXT
)“;
 
if(mysqli_query($dbc, $sql)){
    echo „Table created successfully.“;
} else{
    echo „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc);
}
 
// Close connection
mysqli_close($dbc);
?>

After sucessfull run of script can be obtained message:

Form part of the main application page

Form part consist from input fields and one big textarea for input of text message.

 <form method=“post“ action=“<?php echo $_SERVER[‚PHP_SELF‘]; ?>“>
          <div class=“form-group“>
              <label>Please provide Your name:</label>
              <input type=“text“ name=“name“ class=“form-control“ value=“<?php echo isset($_POST[‚name‘]) ? $name : ‚Your Name‘; ?>“>
          </div>
          <div class=“form-group“>
            <label>E-mail:</label>
            <input type=“text“ name=“email“ class=“form-control“ value=“<?php echo isset($_POST[‚email‘]) ? $email : ‚e-mail‘; ?>“>
          </div>
          <div class=“form-group“>
            <label>Your message for Guestbook:</label>  <!– textera for input large text –>
            <textarea id=“postmessage“ name=“postmessage“ class=“form-control“ rows=“6″ cols=“50″><?php echo isset($_POST[‚postmessage‘]) ? $postmessage : ‚Your text goes here …‘; ?></textarea>
          </div>
     
          <button type=“submit“ name=“submit“ class=“btn btn-warning“> Send your post </button>
          
          <button type=“submit“ name=“delete“ class=“btn btn-danger“> Delete latest message </button>

          <button type=“submit“ name=“reset“ class=“btn btn-info“> Reset form </button>

          <?php   //($is_result == „true“) ? {          
                
                 if ($is_result ) {
                    

                 echo „<br> <br>“;
                 echo “ <table class=\“table table-success\“> „;
                 echo “ <tr>
                               <td><h5> <em> Yours currently written text is: </em>$postmessage</h5> <td>
                              </tr> „; 
                              echo “ </table> „;
                   
                } ; 
                 ?>
                 <br>
        
      </form>

PHP code for submitted data

After submitting of form data take place these operations:

  • check of presence data in all fields of form – name, e-mail and message
  • validation of e-mail
  • preparation of e-mail to page admin about adding post in to a guestbook
  • inserting data with INSERT query in to a Gusetbook table of test database
  • messaging about success or failure during above mentioned operations

This code follow:

// Control if data was submitted
    if(filter_has_var(INPUT_POST, ‚submit‘)){
        // Data obtained from $_postmessage are assigned to local variables
        $name = htmlspecialchars($_POST[‚name‘]);
        $email = htmlspecialchars($_POST[‚email‘]);
        $postmessage = htmlspecialchars($_POST[‚postmessage‘]); 
        
        $is_result = „true“;

        // Controll if all required fields was written
        if(!empty($email) && !empty($name) && !empty($postmessage)){
            // If check passed – all needed fields are written
            // Check if E-mail is valid
            if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
                // E-mail is not walid
                $msg = ‚Please use a valid email‘;
                $msgClass = ‚alert-danger‘;
            } else {
                // E-mail is ok
                $toEmail = ‚ciljak@localhost.org‘; //!!! e-mail address to send to – change for your needs!!!
                $subject = ‚Guestbook entry from ‚.$name;
                $body = ‚<h2>To your Guestbook submitted:</h2>
                    <h4>Name</h4><p>‘.$name.'</p>
                    <h4>Email</h4><p>‘.$email.'</p>
                    <h4>Message</h4><p>‘.$postmessage.'</p>
                ‚;

                // Email Headers
                $headers = „MIME-Version: 1.0″ .“\r\n“;
                $headers .=“Content-Type:text/html;charset=UTF-8″ . „\r\n“;

                // Additional Headers
                $headers .= „From: “ .$name. „<„.$email.“>“. „\r\n“;

                // !!! Add entry to the database 

                   // insert into databse 

                        // make database connection
                        $dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);
 
                        // Check connection
                            if($dbc === false){
                                die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
                            }
                        
                        // INSERT new entry
                        $date = date(‚Y-m- H:i:s‘); // get current date to log into databse along postmessage written
                        $sql = „INSERT INTO guestbook (name_of_writer, write_date, email, message_text)                   VALUES (‚$name‘, ‚$date‘, ‚$email‘ , ‚$postmessage‘)“;

                        if(mysqli_query($dbc, $sql)){
                            
                            $msg = ‚postmessage sucessfully added to database.‘;
                            $msgClass = ‚alert-success‘;
                        } else{
                            
                            $msg = „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc);
                            $msgClass = ‚alert-danger‘;
                        }

                        // end connection
                            mysqli_close($dbc);
                if(mail($toEmail, $subject, $body, $headers)){
                    // Email Sent
                    $msg .= ‚Your postmessage was sucessfully send via e-mail‘;
                    $msgClass = ‚alert-success‘;
                } else {
                    // Failed
                    $msg = ‚Your postmessage was not sucessfully send via e-mail‘;
                    $msgClass = ‚alert-danger‘;
                }
            }
        } else {
            // Failed – if not all fields are fullfiled
            $msg = ‚Please fill in all contactform fields‘;
            $msgClass = ‚alert-danger‘;  // bootstrap format for allert message with red color
        }

    };  

PHP code for last entry data delete

Simple delete functionality for current post is creted by removing row witch matching message asi in current submitted article. Solution follow

// if delete button clicked
    if(filter_has_var(INPUT_POST, ‚delete‘)){

            $msg = ‚Delete last mesage hit‘;
            $msgClass = ‚alert-danger‘;  // bootstrap format for allert message with red color
        
            //delete from databse 

            // make database connection
            $dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);

            // Check connection
                if($dbc === false){
                    die(„ERROR: Could not connect to database. “ . mysqli_connect_error());
                }
            
            // DELETE last input by matching your written message
               // obtain message string for comparison

               $postmessage = htmlspecialchars($_POST[‚postmessage‘]); 
               $postmessage = trim($postmessage); // trim possible leading whitespaces

               // create DELETE query
               $sql = „DELETE FROM guestbook WHERE message_text = „.“‚$postmessage'“ ;

                if(mysqli_query($dbc, $sql)){
                    
                    $msg = ‚Last message sucessfully removed from database.‘;
                    $msgClass = ‚alert-success‘;

                    // clear entry fileds after sucessfull deleting from database
                    $name =“;
                    $email =“;
                    $postmessage = “; 
                } else {
                    
                    $msg = „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc);
                    $msgClass = ‚alert-danger‘;
                }

            // end connection
                mysqli_close($dbc);

    };

PHP code for form reset

In some case is good way to reset all error messages displayed in form area. Following code is handy

// if reset button clicked
    if(filter_has_var(INPUT_POST, ‚reset‘)){
        $msg = “;
        $msgClass = “; // bootstrap format for allert message with red color
        $name = “;
        $email = “;
        $postmessage = “;
    };

Outputting article stored in the database in to a Guestbook

Solution for displaying all post messages stored in a database is this. Use SELECT query SELECT * FROM guestbook ORDER BY id DESC. Last part order data in descending manner for showing latest article as first.

Then store result in output variable and fetch them row by row with while loop as it show next code:

<?php  // script for accessing database for all records and then output them in page

            /* Attempt MySQL server connection. Assuming you are running MySQL
            server with default setting (user ‚root‘ with no password) */
            $dbc = mysqli_connect(„localhost“, „admin“, „test*555“, „test“);
            
            // Check connection
            if($dbc === false){
                die(„ERROR: Could not connect to database – stage of article listing. “ . mysqli_connect_error());
            }
                                
            // read all rows (data) from guestbook table in test database
            $sql = „SELECT * FROM guestbook ORDER BY id DESC„;  // read in reverse order – newest article first
/*******************************************************************/
/*   Output in form of Article – solution 2 – for Guestbook functionality  */        /*******************************************************************/
            // if data properly selected from guestbook database table
            if($output = mysqli_query($dbc, $sql)){
                if(mysqli_num_rows($output) > 0)
                     {   // if any record obtained from SELECT query
                    
                    // create Guestbook articles on page
                    
                    echo „<h4>Our cutomers written into the Guestbook</h4>“;
                    echo „<br>“;

                    while($row = mysqli_fetch_array($output)) {  //next rows outputed in while loop
                        
                   // echo „<td>“ . $row[‚id‘] . „</td>“;  //id is not important for common visitors
                     echo “ <div class=\“guestbook\“> “ ;
                     echo „<h4>“ .“<b>From: </b>“ . $row[‚name_of_writer‘] . „</h4>“;
                     echo „<h6>“ .“<b>Date of postmessage: </b>“ . $row[‚write_date‘] . „</h6>“;
                     echo „<h5>“ .“ <b>E-mail of sender: </b>“ . $row[‚email‘] . „</h5>“;
                     echo „<p id=\“guestbooktext\“>“ . “  <b>Text of the message: </b> <em>“ . $row[‚message_text‘] . „</em></p>“;
                            //echo „<br>“;
                     echo “ </div> “ ;

                     echo “ <div class=\“guestbookbreak\“> “ ;
                         echo „<br>“;
                      echo “ </div> “ ;
                    }
                    echo „<br>“;
                    // Free result set – free the memory associated with the result
                    mysqli_free_result($output);
                } else {
                    echo „There is no postmessage in Guestbook. Please wirite one.“; // if no records in table
                }
            } else {
                echo „ERROR: Could not able to execute $sql. “ . mysqli_error($dbc); // if database query problem
            }

            // Close connection
            mysqli_close($dbc);
            ?>

Full code for further study can be obtained from github here.




Simple calc – php example code

Example of using form input for two numbers and selection of one of nine possible arithmetic operation or function.

Our php application frontend is on next picture:

Our code is located in one index.php file and consist from:

  • HTML part with input form – obtain data from user, contain submit button and last part show result in two posiblle way. If there is no error message and result ist generated, then well formatted number (2 decimal numbers) is shown. Else (if number was not calculated and result is not prepared or error output message was set) warning text of red color take output (formating is created with alert message of bootstrap linked style).
  • PHP code – obtain numbers from submitted post form, controll if data available with filter_has_var(); prevent for injecting sql with simple htmlspecialchars($_POST[‚nr1‘]); and calculate result along submitted $operator = htmlspecialchars($_POST[‚operation‘]); . As demonstration for controll of user inputed data dividing by zero check take place.

Form code part of index.php follow.

<form method=“post“ action=“<?php echo $_SERVER[‚PHP_SELF‘]; ?>“>
          <div class=“form-group“>
              <label>First number – n1:</label>
              <input type=“text“ name=“nr1″ class=“form-control“ value=“<?
                    php echo isset($_POST[‚nr1‘]) ? $nr1 : ‚0‘; ?>“>
          </div>
          <div class=“form-group“>
            <label>Second number – n2:</label>
            <input type=“text“ name=“nr2″ class=“form-control“ value=“<?
            php echo isset($_POST[‚nr2‘]) ? $nr2 : ‚0‘; ?>“>
          </div>
          
          <div class=“form-group“>
              <label>Select your operation:</label> <br>
              <table class=“table table-secondary „>
                <tr>
                    <td>
                    <input class=“inputSelector“ type=“radio“ id=“+“ name=“operatio
                      n“ value=“+“  checked> 
                    <label> <h4> n1 + n2 </h4></label>
                    </td>
                    <td>
                    <input class=“inputSelector“ type=“radio“ id=“-
                     “ name=“operation“ value=“-“  <?php echo ($operator == „-„) ?
                       „checked“ : “; ?> >  
                    <label><h4> n1 – n2</h4></label>
                    </td>
                    <td>
                    <input class=“inputSelector“ type=“radio“ id=“Power“ 
                     name=“operation“ value=“Power“  <?php echo ($operator ==
                     „Power“) ? „checked“ : “; ?> > 
                    <label><h4> Power n1 on n2 </h4></label> 
                    </td>
               </tr>
                <tr>        
                    <td>
                    
                    <input class=“inputSelector“ type=“radio“ id=“*“ 
                   name=“operation“ value=“*“  <?php echo ($operator == „*“) ?
                   „checked“ : “; ?>  >  
                    <label><h4> n1 * n2</h4></label>
                    </td>
                    <td>
                    <input class=“inputSelector“ type=“radio“ id=“/“ name=“operation
                     “ value=“/“  <?php echo ($operator == „/“) ? „checked“ : “; ?> > 
                    <label><h4>/</h4></label> 
                    </td>
                    <td>
                    <input class=“inputSelector“ type=“radio“ id=“Log10″ 
                      name=“operation“ value=“Log10″  <?php echo ($operator ==
                      „Log10“) ? „checked“ : “; ?> >  
                    <label><h4>log10(n1)</h4></label>
                    </td>
                </tr>   
                <tr>        
                    <td>
                    <input class=“inputSelector“ type=“radio“ id=“sin“ 
                     name=“operation“ value=“sin“  <?php echo ($operator == „sin“) ?
                     „checked“ : “; ?>  >  
                    <label><h4> sin(n1)</h4></label>
                    </td>
                    <td>
                    <input class=“inputSelector“ type=“radio“ id=“cos“ 
                      name=“operation“ value=“cos“  <?php echo ($operator == „cos“)
                        ? „checked“ : “; ?> > 
                    <label><h4>cos(n1)</h4></label> 
                    </td>
                    <td>
                    <input class=“inputSelector“ type=“radio“ id=“tg“ 
                     name=“operation“ value=“tg“  <?php echo ($operator == „tg“) ?
                      „checked“ : “; ?> >  
                    <label><h4>tg(n1)</h4></label>
                    </td>
                </tr>   
              </table>
            </div>
          <br>

          <button type=“submit“ name=“submit“ class=“btn btn-primary“> Calculate result </button>

          <?php   //($is_result == „true“) ? {          
                
                 if ($is_result && $msg == “) {
                    $result = number_format($result, 2, ‚,‘, ‚ ‚); // formating number refer to https://www.php.net/manual/en/function.number-format.php

                        echo „<br> <br>“;
                         echo “ <table class=\“table table-success\“> „;
                        echo “ <tr>
                               <td><h3> = $result</h3> <td>
                              </tr> „; 
                              echo “ </table> „;
                    
                    
                } ; 
                 ?>
                 <br>
                    
                     
                    <?php if($msg != “): ?>  <!– This part show error or warning message if one of the operand does not meet calculations requirements – dividing by zero –>
                        <br><br>    
                    <div class=“alert <?php echo $msgClass; ?>“><?php echo $msg; ?></div>
                    <?php endif; ?>
                    
      </form>

PHP code for result calculation follow

<?php
    // two variables for message and styling of the mesage with bootstrap
    $msg = “;
    $msgClass = “;

    // default values of auxiliary variables
    $operator = “; // at the beggining is no operator selected
    $is_result = „false“; //before hitting submit button no result is available
    $result = 0; // result and boath number are by default at zero values initialized
    // Control if data was submitted
    if(filter_has_var(INPUT_POST, ‚submit‘)){
        // Data obtained from $_POST are assigned to local variables
        $nr1 = htmlspecialchars($_POST[‚nr1‘]);
        $nr2 = htmlspecialchars($_POST[‚nr2‘]);
        $operator = htmlspecialchars($_POST[‚operation‘]); 
        
        $is_result = „true“;

        // calculation of appropriate results
        /* if ($operator == „+“) {          
            $result = $nr1 + $nr2;     
        };
        if ($operator == „-„) {          
            $result = $nr1 – $nr2;     
        };
        if ($operator == „*“) {          
            $result = $nr1 * $nr2;     
        };
        if ($operator == „/“) {          
            $result = $nr1 / $nr2;     
        };
        */
        //this part can be reworked for switch command for educational purposes like this
        switch ($operator) {
          case „+“: {          
                       $result = $nr1 + $nr2;     
                    }; break;
          case „-„: {          
                        $result = $nr1 – $nr2;     
                     }; break;
          case „*“: {          
                        $result = $nr1 * $nr2;     
                     }; break;
          case „/„: {   
                        if ($nr2 != 0)  { //dividing by zero mittigation, if nr2 is zero then
                                                      error message is outputed
                            $result = $nr1 / $nr2;
                            $msg = “;} 
                            else { 
                                $msg = ‚Dividing by zero NaN‘; // text of the message
                                $msgClass = ‚alert-danger‘; // bootstrap type alert-
                                                                                       danger is outputed
                             } ;  
                             
                     }; break;  
          case „Power“: {          
                        $result = Pow($nr1, $nr2);     
                     }; break;  
          case „Log10“: {          
                        $result = Log10($nr1);     
                     }; break;  
          case „sin“: {          
                        $result = sin($nr1);     
                     }; break;  
          case „cos“: {          
                        $result = cos($nr1);     
                     }; break;  
          case „tg“: {          
                        $result = tan($nr1);     
                     }; break;                       
        };
        
    }
?>
 

For main formating was used bootstrap code obtained from https://bootswatch.com/.

Small altering is created by own style.css that follow

.navbar  {
    background-color: #325d88;
    margin-bottom: 25px ;
    
}

.navbar-brand {
   
    color: white;
}

/* set midle container to width 580px */
.container {
   
    width: 580px;
    margin-left: 240px;
  
}

/* add margin to both sides in calculator input fields */
.inputSelector {
   
    
    margin-left: 20px;
    margin-right: 15px;
  
}
/* colorizing backround and change font-size of input number fields n1 and n2 partialy alter bootstrap css */
.form-control {
   
    background-color: rgb(250, 250, 131);
    font-size:25px
}

/* aboolute positioning of image on calc frontend – on left side */
#calcimage {
   
    position: absolute;
  top: 80px;
  left: 20px;
  right: 0;
  
  
}

/* change wight of label text before input field of form */
label {
   
    font-weight: bold;
}
.footer {
    background-color: #325d88;
    margin-top: 25px;
    padding-left: 15px;
    height: auto;
    
}

Full code for further study can be obtained from github here.




Submit form – example php code

This article contains example of simple submit form with control of fulfilment of all fields and valdation. For proper testing of our code is used mercury e-mail server build in in XAMPP environment.

Next picture show visual look of submit form frontend that use bootstrap stylesheet downloaded from https://bootswatch.com/.

Example of our final submit form in php

HTML code part with submiting form consist from

<!– **************************************** –>
<!– HTML code containing Form for submitting –>
<!– **************************************** –>
<!DOCTYPE html>
<html>
<head>
    <title>Contact Form</title>
    <link rel=“stylesheet“ href=“./css/bootstrap.min.css“> 
                                                           <!– bootstrap mini.css file –>
    <link rel=“stylesheet“ href=“./css/style.css“> <!– my local.css file –>
</head>
<body>
    <nav class=“navbar navbar-default“>
      <div class=“container“>
        <div class=“navbar-header“>    
          <a class=“navbar-brand“ href=“index.php“>Submit form example</a>
        </div>
      </div>
    </nav>
    <div class=“container“> 
        <?php if($msg != “): ?>
            <div class=“alert <?php echo $msgClass; ?>“><?php echo $msg; ?></div>
        <?php endif; ?>
    <form method=“post“ action=“<?php echo $_SERVER[‚PHP_SELF‘]; ?>“>
          <div class=“form-group“>
              <label>Your Name:</label>
              <input type=“text“ name=“name“ class=“form-control“ value=“<?
                php echo isset($_POST[‚name‘]) ? $name : “; ?>“>
          </div>
          <div class=“form-group“>
            <label>Your e-mail:</label>
            <input type=“text“ name=“email“ class=“form-control“ value=“<?
              php echo isset($_POST[‚email‘]) ? $email : “; ?>“>
          </div>
          <div class=“form-group“>
            <label>Please writte your mesage:</label>
            <textarea name=“message“ class=“form-control“><?
              php echo isset($_POST[‚message‘]) ? $message : “; ?></textarea>
          </div>
          <br>
          <button type=“submit“ name=“submit“ class=“btn 
            btn-primary“> Send message … </button>
      </form>
    </div>
    
       <div class=“footer“> 
          <a class=“navbar-brand“ href=“https://cdesigner.eu“> Visit us on CDesigner.eu </a>
        </div>
      
</body>
</html>

PHP code grab $_POST[] submited variables, assign them into php code variables and test its content against filtering rules. First test detect content of all needed values as name, e-mail and mesage text. Next verifies e-mail against rules expected from valid e-mails.

If something is missing or e-mail is incorrect red (bootstrap alerted style) highlight in outputed text is used.

Also our code test sucessfull e-mail sending, if sendig finished correct green message display with text

$msg = ‚Your e-mail has been sent‘;       
$msgClass = ‚alert-success‘;             

if sending was unsuccessful red message is displayed

$msg = ‚Your e-mail was not sent‘;                   
 $msgClass = ‚alert-danger‘;

PHP code looks like

<!– ************************************************* –>
<!– PHP „self“ code handling e-mailing submit request   –>
<!– ************************************************* –>
<!–         Code remastered by cdesigner.eu along               –>

<?php
    // two variables for message and styling of the mesage with bootstrap
    $msg = “;
    $msgClass = “;

    // Control if data was submitted
    if(filter_has_var(INPUT_POST, ‚submit‘)){
        // Data obtained from $_POST are assigned to local variables
        $name = htmlspecialchars($_POST[‚name‘]);
        $email = htmlspecialchars($_POST[‚email‘]);
        $message = htmlspecialchars($_POST[‚message‘]);

        // Controll if all required fields was written
        if(!empty($email) && !empty($name) && !empty($message)){
            // If check passed – all needed fields are written
            // Check if E-mail is valid
            if(filter_var($email, FILTER_VALIDATE_EMAIL) === false){
                // E-mail is not walid
                $msg = ‚Please use a valid email‘;
                $msgClass = ‚alert-danger‘;
            } else {
                // E-mail is ok
                $toEmail = ‚ciljak@localhost.org‘; //!!! e- mail address to send to – change for your needs!!!
                $subject = ‚Contact Request From ‚.$name;
                $body = ‚<h2>Contact Request</h2>
                    <h4>Name</h4><p>‘.$name.'</p>
                    <h4>Email</h4><p>‘.$email.'</p>
                    <h4>Message</h4><p>‘.$message.'</p>
                ‚;

                // Email Headers
                $headers = „MIME-Version: 1.0″ .“\r\n“;
                $headers .=“Content-Type:text/html;charset=UTF-8″ . „\r\n“;

                // Additional Headers
                $headers .= „From: “ .$name. „<„.$email.“>“. „\r\n“;

                if(mail($toEmail, $subject, $body, $headers)){
                    // Email Sent
                    $msg = ‚Your e-mail has been sent‘;
                    $msgClass = ‚alert-success‘;
                } else {
                    // Failed
                    $msg = ‚Your e-mail was not sent‘;
                    $msgClass = ‚alert-danger‘;
                }
            }
        } else {
            // Failed – if not all fields are fullfiled
            $msg = ‚Please fill in all contactform fields‘;
            $msgClass = ‚alert-danger‘; // bootstrap format for allert message with red color
        }
    }
?>

Full example code can be obtained from from github location https://github.com/ciljak/phpsubmit .

For proper work of this code you must use appropriate webhosting or use XAMPP with runing mercury e-mail server. After enabling mercury through xamp control-panel go to administration and add new user. In our case we used account with name ciljak. local domain aliases that are posible to use are localhost (can not be validate with this code), localhost.net or localhost.org. Next picture show example of mercury enabled features in XAMPP server

Mercury e-mail server in XAMPP



For versioning of our code can be used git with github service. Mouch simpler graphical tool for commiting changes and share your code with team is gitkraken https://www.gitkraken.com/. For further reading please wisit next tutorial.



Our project setup screen in gitkraken looks like next picture

Setup of new project with gitkraken




Introduction to web developement technology

From the early years of www new technology will arisen. As fundamental building bocks of all web can be recongnized HTML and CSS.

HTML or Hypertext Markup Language is content descripting markup language for description of appropriate building blocks of all webpages. Today longterm supported version is 5.0. This version is meant to be open standard – new improvements are continualy added to its syntax.

For styling or visual theming is used CSS standard (standard for Cascade Style sheets). Actual verion is 3.0. HTML+CSS introduced separation of content and look of a pages. Content is more rigid bud external styles enable quick change of look of your page from one location on your webserver.

We can say that only HTML and CSS are main building blocks of all webpages but today webs are mor dynamic and adaptive. You can make administration from web backends, or you can make subscription and then gain access to elevated content of pages.

These improvements enable scripting technologies. These technologies can be divided on two main parts:

a) scripting technologies on server side – for a long time and beacause wide support in hosting houses wide spreaded technology is PHP. For PHP is common that generate pure HTML as interpreted output. Today standardized version is 7.4 but version 8.0 is in development. More reading about PHP can be found on https://www.php.net/docs.php or in more descriptive way on wiki https://en.wikipedia.org/wiki/PHP .

PHP is not only server side technology – for bigger projects but with lover support at hosting company are node.js (server side scripting with javascript), java jsp or servlets or microsoft asp.

b) scripting technology on client side – widely used is javascript (not confuse with java because this scripting languahe has nothing with java/ jsp as its name will sugest). Difference between server side and client side scripting is that client script must be downloaded to the browser and interpreted by them. Taht lead to possible problems with code confidentiality and posible blocking features on browser/ client side. Output of server scripting technology can by pure HTML/ CSS pages.

If you are involved in bigger projects or make common web for larger public existing frameworks will accelerate development. When you use framework you can obtain generated parts and use prepared parts of web. Most frameworks insist on design patterns named MVC (model – view – controller). MVC concept separate building parts of code in to:

  • model – driving logic of aplication, how are data handled and stored with database
  • view – visual part of aplication
  • controller – part handling requests from the clients and event generated by states of application

Well known frameworks are:

  • symfony for PHP scripting language – more reading at https://symfony.com/
  • bootstrap – for frontend developement – for furter reading https://getbootstrap.com/
  • angular – used by google, big framewor for creation robust application, based on javascriptsyntax https://angular.io/docs
  • react – frontend development framwork used by facebook, based on javascript syntax (user friendlier as angular) https://reactjs.org/
  • jQuery – small framework for web scripting and DOM manipulation (separtaion of parts of page and manipuating them). Can be used for srooling menu creation, animation of galeries … .For furter reading you can visit https://jquery.com/ .