Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Передача переменных из <form> (https://javascript.ru/forum/events/21339-peredacha-peremennykh-iz-form.html)

SunTechnique 05.09.2011 20:43

Передача переменных из <form>
 
привет всем. я тут пытаюсь из формы передать переменные ее элеиментов в ява скрипт и передать это все в PHP обработчик. что бы понятней было что я делаю выпишу код:

<form id="formPostRequestID" name="formPostRequestName" method="post">
          ФИО:
          <p><input type="text" name="textSurname" id="textSurname" value=""/></p>
          <p><input type="text" name="textFirstName" id="textFirstName" value=""//></p>
          <p><input type="text" name="textLastName" id="textLastName" value=""/></p>
          Адрес:
          <p><input type="text" name="textAdress" id="textAdress" value=""/></p>
          Тема запроса:
          <p><input type="text" name="textRequestTheme" id="textRequestTheme" value=""/></p>
          <p>Сообщение:</p>
          <p><textarea name="textRequestData" id="textRequestData" cols="45" rows="10"></textarea></p>
          <p>
</form>
<input type="button" name="btnPost" id="btnPost" value="Отправить" onclick="fOnClkPost(formPostRequestID)" formmethod="post"/>


по кнопке отправить вызывается функция fOnClkPost с ID формы(<form>)

var h;
function fOnClkPost(id){
	var eLen = id.elements.length;
	var queryStr = "http://dreamw/drw/clt_form.php?";
	for(var i = 0; i < eLen; i++){
		queryStr = queryStr + id.elements.item(i).value;
		if(i < (eLen - 1)){queryStr = queryStr + "&";}
	}
	alert('text: ' + queryStr);
	h = new XMLHttpRequest();
	h.open("POST",queryStr,true);
	h.onreadystatechange = fXMLEvent;
	//h.setRequestHeader('Content-Type',  "text/xml");
	//http.onreadystatechange = handleResponse;
	h.send();
}

function fXMLEvent(){
	try{
		if(h.readyState == 4){
			if(h.status == 200){
				alert('h.responseText_1: ' + h.responseText);
			}else{
				//alert("h.statusText " + h.statusText);
			}
		}else{
			//alert('h.responseText 2: ' + h.responseText);
		}
	}catch(e){
		alert('Connection Error ' + e.description + h.readyState);
	}
}


и так, что вы тут видите, ну а видите вы конечно корявое формирование запроса который в итогде будет выглядить примерно так:
dreamw/drw/clt_form.php?surname&firstname&lastname... и т.д

в пхп обработчеке я естественно зная в каком порядке придут переменные просто хочу разделить через explode значения и отправить в БД.
вроде бы все ок, пусть даже и такой корявый запрос, но суть в том что если писать на русском языке получаются кракозябры, то есть непонятная кодировка.
а вообще все же хочется увидеть кто как делается более правильно.
ну и заранее спасибо за предложенные варианты.

devote 05.09.2011 21:31

<form id="myForm">
    <input name="test" value="blabla" />
    <textarea name="area">Тестовый текст</textarea>
</form>
<script type="text/javascript">
function serializeForm( form ) {

	var result = '', gE = 'getElementsByTagName',
		inputs = [ form[ gE ]('input'), form[ gE ]('select'), form[ gE ]('textarea'), form[ gE ]('button') ],
		iln = inputs.length, eln, i, j, name;

	for( i = 0; i < iln; i++ ) {

		eln = inputs[ i ].length;

		for( j = 0; j < eln; j++ ) {
			if ( inputs[ i ][ j ] ) {
				if ( name = inputs[ i ][ j ].getAttribute( 'name' ) ) {
					result += escape( name ).replace( /\+/g, '%2B' );
					result += '=' + escape( inputs[ i ][ j ].value ).replace( /\+/g, '%2B' ) + '&';
				}
			}
		}
	}

	return result;
}

alert( serializeForm( document.getElementById('myForm') ) );
</script>

SunTechnique 06.09.2011 11:46

ух как я намаялся с этим unserilze PHP которые выдавал пустую строку. пришлось вместо этого воспользоваться этой штукой:
function unicode_escape($str){
	$escape_table = array(
	'%20' => ' ','%21' => '!','%2C' => ',','%3A' => ':','%3B' => ';',
	'А' => 'А','Б' => 'Б','В' => 'В','Г' => 'Г',
	'Д' => 'Д','Е' => 'Е','Ё' => 'Ё','Ж' => 'Ж',
	'З' => 'З','И' => 'И','Й' => 'Й','К' => 'К',
	'Л' => 'Л','М' => 'М','Н' => 'Н','О' => 'О',
	'П' => 'П','Р' => 'Р','С' => 'С','Т' => 'Т',
	'У' => 'У','Ф' => 'Ф','Х' => 'Х','Ц' => 'Ц',
	'Ч' => 'Ч','Ш' => 'Ш','Щ' => 'Щ','Ъ' => 'Ъ',
	'Ы' => 'Ы','Ь' => 'Ь','Э' => 'Э','Ю' => 'Ю',
	'Я' => 'Я','а' => 'а','б' => 'б','в' => 'в',
	'г' => 'г','д' => 'д','е' => 'е','ё' => 'ё',
	'ж' => 'ж','з' => 'з','и' => 'и','й' => 'й',
	'к' => 'к','л' => 'л','м' => 'м','н' => 'н',
	'о' => 'о','п' => 'п','р' => 'р','с' => 'с',
	'т' => 'т','у' => 'у','ф' => 'ф','х' => 'х',
	'ц' => 'ц','ч' => 'ч','ш' => 'ш','щ' => 'щ',
	'ъ' => 'ъ','ы' => 'ы','ь' => 'ь','э' => 'э',
	'ю' => 'ю','я' => 'я',
	);
	return strtr($str, $escape_table);
}

SunTechnique 06.09.2011 11:48

эээммм... :blink:

devote 06.09.2011 11:52

function unescape( $str, $charset = "UTF-8" ) {
	$str = rawurldecode($str );
	preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U", $str, $r );
	$ar = $r[0];

	foreach( $ar as $k => $v ) {
		if ( substr($v, 0, 2) == "%u" ) {
			$ar[$k] = iconv("UCS-2", $charset, pack("H4", substr($v, -4)));
		} elseif ( substr($v, 0, 3) == "&#x" ) {
			$ar[$k] = iconv("UCS-2", $charset, pack("H4", substr($v, 3, -1)));
		} elseif ( substr($v, 0, 2) == "&#" ) {
			$ar[$k] = iconv("UCS-2", $charset, pack("n", substr($v, 2, -1)));
		}
	}
	return implode( "", $ar );
}

devote 06.09.2011 11:55

/*
*  приведение канонического типа Unicode текста в нормальное состояние.
*/
function NFD2Chars( $value ) {
	$convmap = array( 0x80, 0xFFFF, 0, 0xFFFF );
	return mb_decode_numericentity(
				preg_replace( '/(\\\\u([ABCDEF0-9]{2})([ABCDEF0-9]{2}))/ise', '"&#".(0x\\2\\3).";"', $value ),
					$convmap, 'UTF-8');
}

SunTechnique 06.09.2011 12:34

по поводу первого разобрался, она декодирует то что закодировано твоим яваскриптом перед отправкой. но в базу данных записывается вот такая вот кракозябра Р?Р°Р?РёР?РёС?... Ну и АД с этими кодировками...

а по поводу второго, на первый взгляд кажется что она тоже самое делает просто какой-то другой вариант, но PHP выдает ошибку что ему не известна функция mb_decode_numericentity

SunTechnique 06.09.2011 13:37

внатуре с этими кодировками кошмары снится будут. помелян там где у тебя UTF-8 на windows-1251 и все записало в БД русскими нормальными буквами. зато ПХП через echo выводит кракозябры но это уже в следующей серии :lol:


Часовой пояс GMT +3, время: 03:03.