Validare username transmis cu cel actual

Discutii si intrebari legate de scripturi si functii JavaScript, jQuery si Ajax, cod JavaScript in general.
Stefan
Mesaje:117

Validare username transmis cu cel actual

Salut, cum as putea valida cu jquery si cu php datele dintr-un formular de contact? Am reusit in mare parte dar mai am nevoie de inca ceva.
Cum as putea verifica cu "remote" mai multe conditii pentru un singur input (fara a mai creea reguli noi). Sau daca nu se poate sa verific mai multe lucruri cu un singur remote, cum creez o regula prin care sa verific ceva?

Exemplu:
- Am o pagina de editare a datelor la un anumit cont, si de exemplu pentru input-ul "username" verific cu jquery si php daca username-ul introdus afla in baza de date (cu remote). Asta functioneaza, dar cum as putea verifica daca username-ul introdus este acelasi cu username-ul actual al contului?

edit.php:

Cod: Selectaţi tot

$( document ).ready( function () {
  jQuery.validator.addMethod("special_chars", function(value, element) {
     return this.optional( element ) || /^[a-zA-Z0-9- ]*$/.test( value );
  }, "<span style='color:#EF5350'>Ați introdus caractere interzise!</span>.");
      
  $( "#principal" ).validate( {
    rules: {
      username: {
        required: true,
        minlength: 3,
        maxlength: 15,
        remote: {
          url: "sadmin/actiuni/profil/username.php",
          type: "POST",
          data: { token: $('#token').val() }
        },
        special_chars : true
      }
      messages: {
        username: {
          required  : "<span style='color:#EF5350'>Introduceți username-ul!</span>",
          minlength : "<span style='color:#EF5350'>Username-ul trebuie să conțină minim 3 caractere!</span>",
          maxlength : "<span style='color:#EF5350'>Username-ul trebuie să conțină maxim 15 caractere!</span>",
          remote    : "<span style='color:#EF5350'>Acest username există deja!</span>"
        }
        }
      }
    } );
});
username.php:

Cod: Selectaţi tot

if(!isset($_SESSION)) session_start();
 
if(isset($_SESSION['token']) && isset($_POST['token']) && $_SESSION['token'] == $_POST['token'] && $_SESSION['token']>=(time()-600)){
    include('../../../core/database/connect.php');
    $sql = mysqli_query($con, "SELECT `username` FROM `utilizatori` WHERE `username` = '" . $_POST["username"] . "'");
 
    $exista = mysqli_num_rows($sql);
    if($exista) echo 'false';
    else echo 'true';
}

MarPlo Mesaje:4343
Depinde cum /unde e retinut username-ul actual.
Daca e in sesiune (cum ar fi indicat), de exemplu $_SESSION['username'], verifici in "username.php" daca numele transmis ($_POST['username']) e acelasi cu cel din sesiune.
Cam asa:

Cod: Selectaţi tot

if(!isset($_SESSION)) session_start();
 
if($_SESSION['username']==$_POST['username'] && isset($_SESSION['token']) && isset($_POST['token']) && $_SESSION['token'] == $_POST['token'] && $_SESSION['token']>=(time()-600)){
  //etc..
}

Stefan Mesaje:117
Nu la asta ma refeream, am o pagina de editare a utilizatorilor, cand selectez un utilizator ma trimite la pagina de ediare a contului cu id-ul respectiv: imgur.com/a/R7N1D

Cu jquery vreau sa validez datele, dupa ce se trimite formularul, username-ul vreau sa il verific daca este diferit de cel actual (cel actual fiind "admin").
Am cautat o multime de metode cu jQuery.validator.addMethod() dar nu ma ajuta mai niciuna. Cum as putea crea o regula cu "jQuery.validator.addMethod()" si cu ajax care sa trimita datele la un fisier php (exemplu, username_diferit.php) in care sa verifice daca valoarea introdusa este diferita de username-ul actual, iar daca este adevarat sa nu se intample nimic, iar daca este fals sa se afiseze o eroare.

Am incercat sa fac asa

Cod: Selectaţi tot

$( document ).ready( function () {
	jQuery.validator.addMethod("special_chars", function(value, element) {
		 return this.optional( element ) || /^[a-zA-Z0-9- ]*$/.test( value );
	}, "<span style='color:#EF5350'>Ați introdus caractere interzise!</span>.");
	
	jQuery.validator.addMethod("test", function(value, element) {
		$.ajax({
			type : "POST",
			url : "sadmin/actiuni/profil/username_diferit.php",
			data : {
				token: $('token').val(),
				username: $('username').val(),
				id: $('id').val()
			},
			dataType : "html",
			success : function(msg) {
				if (msg == 'true') return false;
				else return true;
			}
		})
	}, "This username is already taken.");
	
	$( "#principal" ).validate( {
		rules: {
			username: {
				required: true,
				minlength: 3,
				maxlength: 15,
				test: true,
				remote: {
					url: "sadmin/actiuni/profil/username.php",
					type: "POST",
					data: { token: $('#token').val() }
				},
				special_chars : true
			},
			messages: {
					username: {
						required  : "<span style='color:#EF5350'>Introduceți username-ul!</span>",
						minlength : "<span style='color:#EF5350'>Username-ul trebuie să conțină minim 3 caractere!</span>",
						maxlength : "<span style='color:#EF5350'>Username-ul trebuie să conțină maxim 15 caractere!</span>",
						remote    : "<span style='color:#EF5350'>Acest username există deja!</span>"
					},
Dar mereu imi returneaza "false", adica imi afiseaza eroare. Cred ca e de la acel "test: true", dar e ciudat fiindca asa am facut si la "special_chars : true" si acolo functioneaza. Cum as putea face?
M-am uitat si pe: jQuery.validator.addMethod(), dar nu prea am inteles cum sa fac si cu ajax.
Si scuzati, momentan sunt incepator in jquery/ajax si incerc sa invat si sa inteleg cat mai mult

MarPlo Mesaje:4343
Nu stiu cum functioneaza acel plugin jquery pt. validare date.
In general am folosit propria functie ajax si reguli de validare create direct cu javascript (fara plughin-uri).
Incearca sa scoti cel "test: true" care banuiesti ca ar fi cauza.

- Cred ca metoda jQuery.validator.addMethod() nu merge cu ajax, fiindca ea returneaza un raspuns true/false syncron, dar ajax se executa asyncron. Adica, pana e primit raspunsul de la server, acea metoda nu "asteapta", continua executia restului de cod, cu raspuns neprimi (false).

- Ca idee, ar trebui sa retii dinainte intr-o variabila in javascript username-ul actual, si verifici cu el.
Cam asa:

Cod: Selectaţi tot

var user_valid ='admin';
//your code..
jQuery.validator.addMethod('test', function(value, element) {
  return ($('username').val()==user_valid) ?true :false;
}

Stefan Mesaje:117
Chiar nu m-am gandit la asta, multumesc mult!