• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Asynchroniczność [AJAX][JQUERY]

VPS Starter Arubacloud
0 głosów
307 wizyt
pytanie zadane 9 lipca 2020 w JavaScript przez Hardwell Dyskutant (8,960 p.)

Witam, mam mały problem, mam taki kodzik:

 

document.f.submit();
		
		add_id = $('.add_id').attr('id'),
		name = $('#name').val(),
		phone = $('#telephone').val()
		$.ajax({
			type: "POST",
		   url: "user_id.php",
		   data: {add_id:add_id,name:name,phone:phone},
		   success: function(data) {}
			  
		});

 

kod:

document.f.submit();

wysyła dane z formularza praktycznie do bazy, a kod:
 

		add_id = $('.add_id').attr('id'),
		name = $('#name').val(),
		phone = $('#telephone').val()
		$.ajax({
			type: "POST",
		   url: "user_id.php",
		   data: {add_id:add_id,name:name,phone:phone},
		   success: function(data) {}
			  
		});

ma się wykonać po tym jak powyższy kod (document.f.submit();) wstawi już dane do bazy, niestety nie wiem jak to osiągnąć, miał ktoś kiedyś podobny problem? Pozdrawiam

komentarz 9 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

Czy document.f.submit(); nie powoduje odświeżenia strony?

Czym właściwie jest ten document.f? Dostęp do formularza zazwyczaj bierze się albo pobierając jego referencję przez np. document.[querySelector/getElementById/getElementsBy*] lub z kolekcji wszystkich formularzy na stronie przez document.forms.

Jeśli document.f jest null lub undefined, to w konsoli powinienem być błąd.

komentarz 9 lipca 2020 przez Hardwell Dyskutant (8,960 p.)

Chyba nie w tym przypadku, (choć mogę się mylić), zaś bez document.f.submit(); nie wstawia mi danych do bazy z formularza, (ani faktycznie strona nie przeładowuje się)

komentarz 9 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

Czym właściwie jest ten document.f? Dostęp do formularza zazwyczaj bierze się albo pobierając jego referencję przez np. document.[querySelector/getElementById/getElementsBy*] lub z kolekcji wszystkich formularzy na stronie przez document.forms.

Jeśli document.f jest null lub undefined, to w konsoli powinienem być błąd.

komentarz 9 lipca 2020 przez Hardwell Dyskutant (8,960 p.)

formularz wygląda tak:
 

<form name="f" method='post' enctype="multipart/form-data" onSubmit="valForm(); return false;">

a kod, który podałem, w całości wygląda następująco:
 

function valForm(){
error = 0;
resetForm();

	if($('#name').val()==""){
		$('#val-name').addClass("error");
		$('#text-name').html('<?php echo $lang['ADMIN_STORE_NAME_VALIDATE']; ?>');
		error = 1;
	}
	
	if($('#address').val()==""){
		$('#val-address').addClass("error");
		$('#text-address').html('<?php echo $lang['ADMIN_STORE_ADDRESS_VALIDATE']; ?>');
		error = 1;
	}
	
	if($('#latitude').val()==""){
		$('#val-latitude').addClass("error");
		$('#text-latitude').html('<?php echo $lang['ADMIN_STORE_LATITUDE_VALIDATE']; ?>');
		error = 1;
	}
	
	if($('#longitude').val()==""){
		$('#val-longitude').addClass("error");
		$('#text-longitude').html('<?php echo $lang['ADMIN_STORE_LONGITUDE_VALIDATE']; ?>');
		error = 1;
	}
	
	if($('#email').val()!=""){
	if(!validateEmail($('#email').val())){
		$('#val-email').addClass("error");
		$('#text-email').html('<?php echo $lang['ADMIN_STORE_EMAIL_VALIDATE']; ?>');
		error = 1;
	}
	}
	
	
	tel = $('#telephone').val();
	if(tel!=""){
	if((!tel.match(/^\d+/))){
		$('#val-telephone').addClass("error");
		$('#text-telephone').html('<?php echo $lang['ADMIN_STORE_TELEPHONE_VALIDATE']; ?>');
		error = 1;
	}
	}
	
	if (jQuery('#ssf_gdpr_check').length>0) {
			if(jQuery('input#ssf_gdpr_check').is(':checked')){
				//continue
			}else{
				jQuery('input#ssf_gdpr_check').addClass('ssf_invalid');
				error = 1;
			}
		}
	
	if(error==0){
		
		document.f.submit();
		
		add_id = $('.add_id').attr('id'),
		name = $('#name').val(),
		phone = $('#telephone').val()
		$.ajax({
			type: "POST",
		   url: "user_id.php",
		   data: {add_id:add_id,name:name,phone:phone},
		   success: function(data) {}
			  
		});
		
		
	}


}

 

komentarz 9 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

formularz wygląda tak

 Ten formularz jest pusty i nie zawiera zamykającego znacznika </form>.

komentarz 9 lipca 2020 przez Hardwell Dyskutant (8,960 p.)

Wybacz, nie sprostowałem, chodziło o to, że tak wygląda początek form,

całość form:
 

<form name="f" method='post' enctype="multipart/form-data" onSubmit="valForm(); return false;">
				<fieldset>

						<div id="val-name" class="control-group">
						<label><?php echo $lang['ADMIN_NAME']; ?>: <span class='required'>*</span></label>
						<div class="controls">
						<input style='background-color: white;' type='text' name='name' id='name' value='<?php echo $fields['name']['value']; ?>' required />
						<span id="text-telephone" class="help-inline">Proszę podać samo imię bez nazwiska.</span>
						
						 </div>
						</div>
						
						<?php 
							$db = db_connect();
							mysqli_query($GLOBALS["___mysqli_ston"], "SET NAMES utf8");
							$cats = $db->get_rows("SELECT categories.* FROM categories WHERE categories.id!='' ORDER BY categories.cat_name ASC");

						?>
						
						<label>Kategoria: <span class='required'>*</span></label>
						<select name="cat_id" class="form-select" id="cat_id" required >
						<option value="" selected disabled >Wybierz kategorię:</option>
						 <?php if(!empty($cats)): ?>
							<?php foreach($cats as $k=>$v): ?>
							<option value="<?php echo $v['id']; ?>"><?php echo $v['cat_name']; ?></option>
							<?php endforeach; ?>
							<?php endif; ?>
						 </select>
							<span id="text-telephone" class="help-inline">Proszę Wybrać kategorię.</span>
						<div id="val-address" class="control-group">
						<label><?php echo $lang['ADMIN_ADDRESS']; ?>: <span class='required'>*</span></label>
						<div class="controls">
						<input style='background-color: white;' type='text' name='address' id='address' value='<?php echo $fields['address']['value']; ?>' required />
						<span id="text-telephone" class="help-inline">Wprowadź adres (przykład: ulica, miasto - <font color='red'>bez numeru domu/bloku!)</font></span>
						
						 </div>
						</div>
						<span class="help-block"><?php echo $lang['ADMIN_LAT_LANG_AUTO']; ?></span>
					<div id="val-telephone" class="control-group">
						<label><?php echo $lang['ADMIN_TELEPHONE']; ?>:</label>
						<div class="controls">
						<input style='background-color: white;' type='text' name='telephone' id='telephone' value='<?php echo $fields['telephone']['value']; ?>' required />
						
						
						 </div>
						</div>
					
					
					<div id="val-email" class="control-group">
						<label><?php echo $lang['ADMINISTRATOR_EMAIL']; ?>:</label>
						<div class="controls">
						<input type='text' name='email' id='email' value='<?php echo $fields['email']['value']; ?>' />
						
						
						 </div>
						</div>
					
					
						<label><?php echo $lang['ADMIN_WEBSITE']; ?>:</label>
						<input type='text' name='website' id='website' value='<?php echo $fields['website']['value']; ?>' />
					
						<label><?php echo $lang['ADMIN_DESCRIPTION']; ?>:</label>
						<textarea name='description' id='description' rows="4" cols="40"><?php echo $fields['description']['value']; ?></textarea>
					
						<label><?php echo $lang['ADMIN_STORE_IMAGE']; ?>:</label>
						<input style='background-color: white;' type="file" name="file" id="file" class="File" required />
						<span id="text-telephone" class="help-inline">Wymagane conajmniej jedno zdjęcie (max 4), System automatycznie wygeneruje miniaturkę.</span>
					<?php if(!empty($images)): ?>
					<div class="input">
						<?php foreach($images as $k=>$v): ?>
						<div class="image">
							<img src="<?php echo $v; ?>" alt="Image" />
							<button type="submit" name="delete_image[<?php echo basename($v); ?>]" id="delete_image" class="btn btn-danger" value="<?php echo basename($v); ?>"><?php echo $lang['ADMIN_DELETE']; ?></button>
						</div>
						<?php endforeach; ?>
					</div>
					<?php endif; ?>

					<br /><br />
					
					
					<div class='input first'>
					<div id="val-latitude" class="control-group">
						<label><?php echo $lang['ADMIN_LATITUDE']; ?>:</label>
						<div class="controls">
						<input type='text' name='latitude' id='latitude' value='<?php echo $fields['latitude']['value']; ?>' style="width:206px !important;" required />
						
						
						 </div>
						</div>
					</div>
					<div class='input second'>
					<div id="val-longitude" class="control-group">
						<label><?php echo $lang['ADMIN_LONGITUDE']; ?>:</label>
						<div class="controls">
						<input type='text' name='longitude' id='longitude' value='<?php echo $fields['longitude']['value']; ?>' style="width:206px !important;" required />
						
						
						 </div>
						</div>
					</div>
					
					<?php echo $ssf_accept_privacy; ?>
					<div class='input first'><div><br><br></div></div>
					<div class='input buttons'>
					<button type="button" name="op" onclick="document.location.href='index.php'" value="Cancel" class="btn btn-Finder"><?php echo $lang['ADMIN_CANCEL']; ?></button>&nbsp;
						<button type='submit' name='save' class="add_id" id='<?php echo $_SESSION['user_id']; ?>'><?php echo $lang['ADMIN_SAVE']; ?></button>
					</div>
				</fieldset>
			</form>

 

komentarz 9 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

Ten kod jest wycinkiem z PHP? Bo zapisy typu:

<label><?php echo $lang['ADMIN_NAME']; ?>: <span class='required'>*</span></label>

w HTML i:

        $('#text-name').html('<?php echo $lang['ADMIN_STORE_NAME_VALIDATE']; ?>');

w JS świadczą, że całość jest tworzona w PHP lub próbuje być.

Powyższy kod JS się nie wykonuje, rzucając błąd:

Uncaught SyntaxError: missing ) after argument list


Poza tym metoda submit użyta na formularzu powinna odświeżyć stronę, a w takim przypadku kod JS wysyłający zapytanie Ajaxowe z tej funkcji już się nie zdąży wykonać.

Dlaczego zamiast programowalnie submitować formularz nie wyślesz Ajaxa, który w pozytywnym przypadku wyśle drugiego (decelowego?) Ajaxa?

komentarz 9 lipca 2020 przez Hardwell Dyskutant (8,960 p.)

Dla tego tutaj piszę, nie wiem jak się za to zabrać, 
 

onSubmit="valForm(); return false;"

w formularzu jedynie mi podpowiedział, że wysyłane jest to poprzez jakąś funkcję, chciałem dodać jeszcze jednego inputa, ale nie wiedziałem w jaki sposób jest to wysyłane, aby zawartość tego inputa "dokleić", nigdzie nie widzę zapytań "INSERT" ani nic podobnego, więc chciałem, aby po wstawieniu danych do bazy, ajax wysłał update z resztą danych.

 

EDIT.

Znalazłem jeden plik, w dosyć dziwny sposób (dla mnie) wysyła zapytania do bazy,:

 

<?php
date_default_timezone_set('Europe/London');
class DB {
	var $hostname 	= 'localhost';
	var $username 	= 'root';
	var $password 	= '';
	var $db_name	= '';
	var $connection;
	var $errors		= array();
	var $queries	= array();
	var $query		= '';
	var $insert_id	= 0;
	var $debug		= 1;
	
	
	public function __construct($params=array()) {
		if(!empty($params)) {
			foreach($params as $k=>$v) {
				if(isset($this->{$k})) {
					$this->{$k} = $v;
				}
			}
		}
		
		if($this->hostname != '' && $this->username != ''  && $this->db_name != '') {
			$this->connection = ($GLOBALS["___mysqli_ston"] = mysqli_connect($this->hostname, $this->username, $this->password));
			if(!$this->connection) {
				$this->errors[] = 'Could not connect: '.((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false));
				return FALSE;
			}

				if(!((bool)mysqli_query($this->connection, "USE " . $this->db_name))) {
				$this->errors[] = 'Database error: '.((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false));
				return FALSE;
			}
		} else {
			$this->errors[] = 'Wrong database information';
			return FALSE;
		}
		
		if($this->debug && !empty($this->errors)) {
			$this->print_debug($this->errors);
		}
		
	return TRUE;
	}
	
	
	function query($sql) {
		$this->queries[] = $sql;
		$result = mysqli_query($GLOBALS["___mysqli_ston"], $sql);
		if(!$result) {
			$this->errors[] = 'Invalid query: '.((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false));
		}
		if($result===TRUE) {
			$this->insert_id = ((is_null($___mysqli_res = mysqli_insert_id($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
		}
		
		if($this->debug && !empty($this->errors)) {
			$this->print_debug($this->errors);
			$this->print_debug($sql);
		}
		
	return $result;
	}
	
	
	function get_rows($sql) {
		$result = $this->query($sql);
		$rows = array();
		if($result !== FALSE) {
			while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
				$rows[] = $row;
			}
		}
	return $rows;
	}
	
	
	function get_row($sql) {
		$result = $this->query($sql);
		$row = array();
		if($result !== FALSE) {
			$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
		}
	return $row;
	}


	function escape($str) {
		return $str;
	}
	
	
	function insert($table, $data) {

		foreach($data as $k=>$v) {
			$data[$k] = $this->escape($v);
		}

		if(!isset($data['created'])) {
			$data['created'] = date("Y-m-d H:i:s");
		}
		

		$fields = $this->get_sql_field_names($table);
		foreach($data as $k=>$v) {
			if(!in_array($k,$fields)) {
				unset($data[$k]);
			}
		}

		$keys 	= array_keys($data);
		$values = array_values($data);

		$sql = "INSERT INTO ".$this->escape($table)." (".implode(',',$keys).") VALUES('".implode("','",$values)."')";
		
	return $this->query($sql);
	}
	
	
	function update($table, $data, $id) {

		if(!isset($data['modified'])) {
			$data['modified'] = date("Y-m-d H:i:s");
		}

		$fields = $this->get_sql_field_names($table);
		$update = '';
		foreach($data as $k=>$v) {
			if(in_array($k,$fields)) {
				$update .= "`$k`='".$this->escape($v)."', ";
			}
		}

		$update = substr($update, 0, strrpos($update, ','));
		

		$sql = "UPDATE ".$this->escape($table)." SET ".$update." WHERE id=".$this->escape($id);

	return $this->query($sql);
	}

	
	function delete($table, $id) {
		

		$sql = "DELETE FROM ".$this->escape($table)." WHERE id=".$this->escape($id);

	return $this->query($sql);
	}

	function get_insert_id() {
		return $this->insert_id;
	}


	function get_sql_field_names($table) {
		$columns = array();
		$rows = $this->get_rows("SHOW COLUMNS FROM ".$table);
		foreach($rows as $k=>$v) {
			if(!in_array($v['Field'], $columns)) {
				$columns[] = $v['Field'];
			}
		}
	return $columns;
	}


	function print_debug($debug) {
		echo '<pre>';
		if(is_string($debug)) {
			echo $debug;
		} else {
			print_r($debug);
		}
		echo '</pre>';
	}
}

 

komentarz 9 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

Czy w Twoim kodzie document.f.submit() w ogóle wysyła formularz?

Nowe pola do formularza możesz wstawić przez <input>y odpowiedniego typu, nadając im atrybuty name oraz value, które będą stanowić parę klucz-wartość w wysłanym formularzu.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 135 wizyt
pytanie zadane 31 marca 2022 w JavaScript przez Klaudiaaa Początkujący (390 p.)
0 głosów
1 odpowiedź 248 wizyt
0 głosów
1 odpowiedź 162 wizyt
pytanie zadane 2 lipca 2020 w JavaScript przez Bartek12 Mądrala (5,510 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...