article

Thursday, November 18, 2021

Vue.js Axios Autocomplete textbox with PHP and MySQL

Vue.js Autocomplete textbox with PHP and MySQL

Download or Include 

axios
https://github.com/axios/axios

Using jsDelivr CDN: https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js

VueJS 
https://vuejs.org/v2/guide/installation.html

CDN : https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js


index.html
//index.html
<!DOCTYPE html>
<html>
<head>
	<title>Vue.js Autocomplete textbox with PHP and MySQL</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link rel="stylesheet" type="text/css" href="style.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>
	<div id='myapp' style="padding:20px;">
		<p><h1>Vue.js Autocomplete textbox with PHP and MySQL</h1></p>
		<vueauto-complete v-model="country" @input="handleInput1()"></vueauto-complete>
		<p><b>Selected Country id : {{ country }}</b> </p>
	</div>
	
	<script >
	Vue.component('vueauto-complete', {
	  	data: function () {
	    	return {
	      		searchText:'',
        		suggestiondata:[]
	    	}
	  	},
	  	template: `<div class='vueautocomplete' > 
	  		<div>
		  		<input type='text' @keyup='loadSuggestions' placeholder='Enter some text' v-model='searchText'>	<br> 
		  		<div class='suggestionlist' v-if="suggestiondata.length" >
		  		<ul> 
		  			<li v-for= '(item,index) in suggestiondata' @click='itemSelected(index)'> 
		  				{{ item.name }} 
		  			</li>  
		  		</ul>
		  		</div>  
	  		</div>
	  	</div>`, 
	  	methods: {
			loadSuggestions: function(e){
				var el = this;
				this.suggestiondata = [];
				
				if(this.searchText != ''){

					axios.get('search.php', {
						params: {
							search: this.searchText
						}
					})
					.then(function (response) {
						el.suggestiondata = response.data;
					});
				}	
			},
			itemSelected: function(index){
				var id = this.suggestiondata[index].id;	
				var name = this.suggestiondata[index].name;	

				this.searchText = name;
				this.suggestiondata = [];

				this.$emit("input", id);
			}
		},
	})

	var app = new Vue({
	  	el: '#myapp',
	  	data: {
		    country: 0
		},
		methods: {
			handleInput1: function(){
				console.log("value : " + this.country);
			}
		}
	})
	</script>
</body>
</html>
search.php
//search.php
<?php
include "config.php";

if(isset($_GET['search'])){
	$search = mysqli_real_escape_string($con,trim($_GET['search']));

	$data = array();
	if(!empty($search)){

		$result = mysqli_query($con,"select * from country where country like '%".$search."%'");
		
		while ($row = mysqli_fetch_array($result)) {
		  	$data[] = array(
		  			"id" => $row['id'],
		  			"name"=>$row['country']
		  		);
		}
	}

	echo json_encode($data);
	exit;
}
config.php
//config.php
<?php
$host = "localhost";   
$user = "root";     
$password = "";       
$dbname = "testingdb"; 

// Create connection
$con = mysqli_connect($host, $user, $password,$dbname);

// Check connection
if (!$con) {
    die("Connection failed: " . mysqli_connect_error());
}
style.css
//style.css
.vueautocomplete,.vueautocomplete .suggestionlist{
    width: 300px;
}
.vueautocomplete input[type=text]{
    width: 100%;
    padding: 5px;
}
.suggestionlist{
    position: absolute;
}
.suggestionlist ul{
    width: 100%;
    background: whitesmoke;
    list-style: none;
    margin: 0;
    padding: 5px;
} 
.suggestionlist ul li{
    background: white;
    padding: 4px;
    margin-bottom: 1px;
}
.suggestionlist li:not(:last-child){
    border-bottom: 1px solid #cecece;
}
.suggestionlist ul li:hover{
    cursor: pointer;
    background: whitesmoke;
}

Related Post