Bootstrap 4.0 Version
https://getbootstrap.com/docs/4.0/getting-started/introduction/
https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css
vuejs
https://v2.vuejs.org/v2/guide/installation.html
CDN : https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js
Axios
https://www.npmjs.com/package/axios
CDN : https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js
index.php
//index.php
<!DOCTYPE html>
<html>
<head>
<title>Vue.js PHP Input Validation</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light navbar-cairocoders">
<div class="container">
<a class="navbar-brand" href="#">Cairocoders</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="#">Login</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Register</a>
</li>
</ul>
</div>
</div>
</nav>
<main class="my-form" id="validate">
<div class="cotainer">
<div class="row justify-content-center">
<div class="col-md-8"><h1 class="page-header text-center">Vue.js PHP Input Validation </h1>
<div class="card">
<div class="card-header">Register</div>
<div class="card-body">
<div class="alert alert-success text-center" v-if="successMessage">
<button type="button" class="close" @click="clearMessage();"><span aria-hidden="true">×</span></button>
<span class="glyphicon glyphicon-check"></span> {{ successMessage }}
</div>
<div class="form-group row">
<label class="col-md-4 col-form-label text-md-right">Username</label>
<div class="col-md-6">
<input type="text" ref="username" class="form-control" v-model="forValidation.username">
<div v-if="errorUsername" class="error">{{ errorUsername }}</div>
</div>
</div>
<div class="form-group row">
<label class="col-md-4 col-form-label text-md-right">Password</label>
<div class="col-md-6">
<input type="password" ref="password" class="form-control" v-model="forValidation.password">
<div v-if="errorPassword" class="error">{{ errorPassword }}</div>
</div>
</div>
<div class="form-group row">
<label class="col-md-4 col-form-label text-md-right">Firstname</label>
<div class="col-md-6">
<input type="text" ref="firstname" class="form-control" v-model="forValidation.firstname">
<div v-if="errorFirstname" class="error">{{ errorFirstname }}</div>
</div>
</div>
<div class="form-group row">
<label class="col-md-4 col-form-label text-md-right">Lastname</label>
<div class="col-md-6">
<input type="text" ref="lastname" class="form-control" v-model="forValidation.lastname">
<div v-if="errorLastname" class="error">{{ errorLastname }}</div>
</div>
</div>
<div class="form-group row">
<label class="col-md-4 col-form-label text-md-right">Email</label>
<div class="col-md-6">
<input type="text" ref="email" class="form-control" v-model="forValidation.email">
<div v-if="errorEmail" class="error">{{ errorEmail }}</div>
</div>
</div>
<div class="form-group row">
<label class="col-md-4 col-form-label text-md-right">Website</label>
<div class="col-md-6">
<input type="text" ref="website" class="form-control" v-model="forValidation.website">
<div v-if="errorWebsite" class="error">{{ errorWebsite }}</div>
</div>
</div>
<div class="col-md-6 offset-md-4">
<button class="btn btn-primary" @click="validateInput();"><span class="glyphicon glyphicon-check"></span> Validate</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<script src="app.js"></script>
<style>
body{
margin: 0;
font-size: .9rem;
font-weight: 400;
line-height: 1.6;
color: #212529;
text-align: left;
background-color: #f5f8fa;
}
.navbar-cairocoders
{
box-shadow: 0 2px 4px rgba(0,0,0,.04);
}
.navbar-brand , .nav-link, .my-form, .login-form
{
font-family: Raleway, sans-serif;
}
.my-form
{
padding-top: 1.5rem;
padding-bottom: 1.5rem;
}
.my-form .row
{
margin-left: 0;
margin-right: 0;
}
.login-form
{
padding-top: 1.5rem;
padding-bottom: 1.5rem;
}
.login-form .row
{
margin-left: 0;
margin-right: 0;
}
.error{
font-size:13px;color:red;
}
</style>
</body>
</html>
app.js
//app.js
var app = new Vue({
el: '#validate',
data:{
forValidation: {username: '', password: '', firstname:'', lastname:'', email:'', website:''},
errorUsername: "",
errorPassword: "",
errorFirstname: "",
errorLastname: "",
errorEmail: "",
errorWebsite: "",
successMessage: ""
},
methods:{
validateInput: function(){
var valForm = app.toFormData(app.forValidation);
axios.post('validate.php', valForm)
.then(function(response){
//console.log(response);
if(response.data.username){
app.errorUsername = response.data.message;
app.focusUsername();
}
else if(response.data.password){
app.errorPassword = response.data.message;
app.errorUsername = '';
app.focusPassword();
}
else if(response.data.firstname){
app.errorFirstname = response.data.message;
app.errorUsername = '';
app.errorPassword = '';
app.focuFirstname();
}
else if(response.data.lastname){
app.errorLastname = response.data.message;
app.errorUsername = '';
app.errorPassword = '';
app.errorFirstname = '';
app.focusLastname();
}
else if(response.data.email){
app.errorEmail = response.data.message;
app.errorUsername = '';
app.errorPassword = '';
app.errorFirstname = '';
app.errorLastname = '';
app.focusEmail();
}
else if(response.data.website){
app.errorWebsite = response.data.message;
app.errorEmail = response.data.message;
app.errorUsername = '';
app.errorPassword = '';
app.errorFirstname = '';
app.errorLastname = '';
app.errorEmail = '';
app.focusWebsite();
}
else{
app.successMessage = response.data.message;
app.errorUsername = '';
app.errorPassword = '';
app.errorFirstname = '';
app.errorLastname = '';
app.errorEmail = '';
app.errorWebsite = '';
}
});
},
focusUsername: function(){
this.$refs.username.focus();
},
focusPassword: function(){
this.$refs.password.focus();
},
focusFirstname: function(){
this.$refs.firstname.focus();
},
focusLastname: function(){
this.$refs.lastname.focus();
},
focusEmail: function(){
this.$refs.email.focus();
},
focusWebsite: function(){
this.$refs.website.focus();
},
toFormData: function(obj){
var form_data = new FormData();
for(var key in obj){
form_data.append(key, obj[key]);
}
return form_data;
},
clearMessage: function(){
app.successMessage = '';
}
}
});
validate.php
//validate.php
<?php
$out = array('username' => false, 'password' => false, 'firstname' => false, 'lastname' => false, 'email' => false, 'website' => false);
function check_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$username=check_input($_POST['username']);
$password=check_input($_POST['password']);
$firstname=check_input($_POST['firstname']);
$lastname=check_input($_POST['lastname']);
$email=check_input($_POST['email']);
$website=check_input($_POST['website']);
if($username==''){
$out['username']=true;
$out['message']='Username is required';
}
elseif (!preg_match("/^[a-zA-Z_1-9]*$/",$username)) {
$out['username']=true;
$out['message'] = "Only letters, numbers and underscore allowed";
}
elseif($password==''){
$out['password']=true;
$out['message']='Password is required';
}
elseif($firstname==''){
$out['firstname']=true;
$out['message']='Firstname is required';
}
elseif (!preg_match("/^[a-zA-Z ]*$/",$firstname)) {
$out['firstname']=true;
$out['message'] = "Only letters and white space allowed";
}
elseif($lastname==''){
$out['lastname']=true;
$out['message']='Lastname is required';
}
elseif (!preg_match("/^[a-zA-Z ]*$/",$lastname)) {
$out['lastname']=true;
$out['message'] = "Only letters and white space allowed";
}
elseif($email==''){
$out['email']=true;
$out['message']='Email is required';
}
elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$out['email']=true;
$out['message']='Invalid Email Format';
}
elseif($website==''){
$out['website']=true;
$out['message']='Website is required';
}
elseif (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$out['website']=true;
$out['message']='Invalid URL';
}
else{
$out['message']='Form Validated';
}
header("Content-type: application/json");
echo json_encode($out);
die();
?>