Salut.
Am un formular de inregistrare scris in PHP. Toate datele introduse sunt validate pe server cu php iar daca este o eroare, dupa ce user-ul a dat click pe submit, apare. Vreau ca atunci cand un utilizator da click pe un input de tip text, introduce ceva ce nu este valid sau il lasa gol iar apoi da click alt undeva (nu mai este selectat input-ul respectiv) sa se schimbe css-ul input-ului respectiv. Problema este ca validarea vreau sa fie facuta cu php si sa fie trimisa cu ajax pentru a afisa daca este o eroare, fara a reincarca intreaga pagina. Cum pot face asta ? Am cautat pe google diferite tutoriale si plugin-uri jQuery dar toate valideaza datele client-side.
Un exemplu cu ceea ce vreau eu este pe pagina de Sign Up al celor de la google:
accounts.google.com/SignUp
Validare input prin AJAX cu PHP la pierdere selectare
-
- Mesaje:11
Validare input prin AJAX cu PHP la pierdere selectare
MarPlo
Mesaje:4343
Salut
Cu evenimentul "onblur" se poate executa un anumit cod cand elementul pierde selectarea (clic in afara lui).
Cu acesta poti apela o functie Ajax care preia acel input, trimite valoarea din el la php, iar daca raspunsul de la php este "error" schimba stilul CSS al acelui element.
Un exemplu e acesta. Mai mult, il poti modifica, extinde si adapta cum stii la ce iti trebuie.
- La "fisier.php" se trimite prin POST numele casutei input si valoarea ei. Se preia cu $_POST['nume_casuta'] valoarea, se face verificarea, iar daca nu e valida, aplica: echo 'error';
Cu evenimentul "onblur" se poate executa un anumit cod cand elementul pierde selectarea (clic in afara lui).
Cu acesta poti apela o functie Ajax care preia acel input, trimite valoarea din el la php, iar daca raspunsul de la php este "error" schimba stilul CSS al acelui element.
Un exemplu e acesta. Mai mult, il poti modifica, extinde si adapta cum stii la ce iti trebuie.
Cod: Selectaţi tot
<form action="fisier.php" method="post">
Parola: <input type="password" id="pass" name="pass" onblur="fAjax(this);" />
</form>
<script>
// change the element style
var setelm = function(elm, val) {
if(val == 'error') elm.style.border = '2px dashed red';
else elm.style.border = 'none';
}
// create the XMLHttpRequest object, according browser
function getXmlHttp() {
// create the variable that will contain the instance of the XMLHttpRequest object (initially with null value)
var xmlHttp = null;
if(window.XMLHttpRequest) { // for Forefox, IE7+, Opera, Safari, ...
xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject) { // for Internet Explorer 5 or 6
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlHttp;
}
// sends data to a php file, via POST, and displays the received answer
function fAjax(elm) {
if(elm.value != '') {
var request = getXmlHttp(); // call the function for the XMLHttpRequest instance
// create pairs index=value with data that must be sent to server
var datatosend = elm.name +'='+ elm.value;
request.open("POST", 'fisier.php', true); // set the request to 'fisier.php'
// adds a header to tell the PHP script to recognize the data as is sent via POST
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send(datatosend); // calls the send() method with datas as parameter
// Check request status
request.onreadystatechange = function() {
if (request.readyState == 4) setelm(elm, request.responseText);
}
}
else setelm(elm, 'error');
}
</script>
Mezuky
Mesaje:11
Am incercat cum ai spus tu dar nu imi merge si nu imi dau seama unde am gresit. Am creat un nou fisier unde am pus codul js dat de tine iar apoi l-am inclus in pagina html in sectiunea <head></head>. Am adaugat evenimentul onblur la input-ul care vreau sa il verific dar la partea cu php este ceva gresit.
Am un fiser numit Registration.class.php in care se afla validarea input-urilor (in OOP) si care il includ intr-o pagina register.php.
Cand un input nu este valid, adaug un mesaj de eroare intr-un array.
Mai jos este o parte din codul de validare:
Pentru a vedea daca este o eroare verific in pagina register.php cu urmatorul cod:
Am incercat sa schimb, in loc de mesajul eroare sa pun cum ai spus tu 'error' dar tot nu merge. Cum pot rezolva ? Mersi.
Am un fiser numit Registration.class.php in care se afla validarea input-urilor (in OOP) si care il includ intr-o pagina register.php.
Cand un input nu este valid, adaug un mesaj de eroare intr-un array.
Mai jos este o parte din codul de validare:
Cod: Selectaţi tot
private function registerNewUser() {
if (empty($_POST['user_name'])) {
$this->errors[] = "Empty Username";
} elseif (empty($_POST['user_password_new']) || empty($_POST['user_password_repeat'])) {
$this->errors[] = "Empty Password";
}
Cod: Selectaţi tot
if ($registration->errors) {
foreach ($registration->errors as $error) {
echo $error;
}
}
MarPlo
Mesaje:4343
Trebuie sa faci verificari la datele primite, de exemplu in functia fAjax() sa testezi cu alert(request.responseText); sa vezi ce date sunt primite de la PHP. Iar in functie de astea trebuie rescrisa functia setelm() ca sa afecteze caseta input.
Trebuie doar sa stii cat de cat JavaScript /Ajax si te descurci; daca nu, poti invata din lectiile si tutorialele de pe site.
- Vezi daca iti e de folos scriptul de aici: Check and Validate input field when loses focus, with PHP via Ajax .
Trebuie doar sa stii cat de cat JavaScript /Ajax si te descurci; daca nu, poti invata din lectiile si tutorialele de pe site.
- Vezi daca iti e de folos scriptul de aici: Check and Validate input field when loses focus, with PHP via Ajax .
Mezuky
Mesaje:11
Am reusit sa fac aproape tot cu ajutorul tutorialului dat de tine dar mai este un lcuru care nu il pot face. Vreau ca atunci cand se da click pe un input (onfocus) care nu a fost completat bine sa ravina la css-ul initial (sa nu mai fie folosit css-ul pentru eroare). Am reusit sa fac asta pentru stilul input-ului dar textul afisat atunci cand un camp este completat gresit nu stiu cum sa il fac sa nu mai fie afisat. Am incercat sa fac o functie cu care apoi sa o apelez la evenimentul "onfocus" dar nu merge.
Imi pare rau daca te deranjez cu niste intrebari prostesti, dar sunt incepator cu JavaScript-ul. Multumesc.
Cod: Selectaţi tot
elm.parentNode.querySelector('.err').innerHTML = '';
Imi pare rau daca te deranjez cu niste intrebari prostesti, dar sunt incepator cu JavaScript-ul. Multumesc.
MarPlo
Mesaje:4343
Pote iti e de folos exemplu acesta ca sa adaugi si functie pentru "onfocus":
Cod: Selectaţi tot
<form action="some_script.php" method="post">
<label for="id_input">Name: <input type="text" id="id_input" name="id_input" /><span class="err">err</span></label>
</form>
<script type="text/javascript">
// to reset element style
function resetElm(elm) {
elm.className = 'clasa_initiala';
elm.parentNode.querySelector('.err').innerHTML = '';
}
// register onfocus
document.getElementById('id_input').onfocus = function() { resetElm(this); }
</script>
Mezuky
Mesaje:11
Acum merge, dar mai este inca o problema. Codul functioneaza doar daca un input nu este completat. Daca este completat necorespunzator, nu functioneaza. De exemplu, daca se introduce un username care deja exista, clasa php salveaza intr-o variabila array un mesaj de eroare, gen "Username already exists" care normal ar trebui trimis ca raspuns la cererea ajax si afisat in pagina, doar ca nu se afiseaza nimic.
Scriptul php pentru inregistrare si validarea datelor functioneaza doar daca a fost apasat butonul submit.
Cu ce as putea inlocui conditia if (isset($_POST["register"])) ca sa se faca validarea si la onblur?
Apoi, nu stiu daca am setat corect script-ul care sa valideze date:
Structura fisierelor este urmatoarea:
register.php (aici este inclus fiserul classes/Registration.php si views/register.php)
classes/Registration.php (aici este clasa pentru validarea datelor si introducerea in baza de date)
views/register.php (aici se afla javascript-ul si html-ul pentru formular)
Scriptul php pentru inregistrare si validarea datelor functioneaza doar daca a fost apasat butonul submit.
Cod: Selectaţi tot
public function __construct() {
if (isset($_POST["register"])) {
$this->registerNewUser();
}
}
Apoi, nu stiu daca am setat corect script-ul care sa valideze date:
Cod: Selectaţi tot
var phpcheck = 'classes/Registration.php'; // Here add the php file that validate the form element
register.php (aici este inclus fiserul classes/Registration.php si views/register.php)
classes/Registration.php (aici este clasa pentru validarea datelor si introducerea in baza de date)
views/register.php (aici se afla javascript-ul si html-ul pentru formular)