Когда писал
калькулятор цветовых различий столкнулся с ограничением на количество знаков, передаваемых от страницы к странице методом GET в адресной строке. Сервер принимал чуть более 4000 знаков а мне хотелось в идеале передавать 50000 и более (например сравнение двух таблиц ECI2002 на 1617 полей). Пришлось воспользоваться методом POST, когда данные передаются серверу скрытно не в адресной строке. Сразу скажем - возможности передать и принять данные POST, в отличие от GET, сам по себе JavaScript не поддерживает. Чтобы передать данные POST надо воспользоваться html-костылем - скрытым полем инпут в форме, а чтобы принять - без PHP не обойтись ну никак. Покажу подробнее. Мне же не данные, введенные в форму, надо передать, а массив переменных. С методом GET просто - сформировал из массива строку с разделителями & и прилепил к гиперссылке после вопросительного знака, отправил так:
и потом принял в документе с помощью метода location.search. С методом POST нужен примерно вот такой костыль:
Код: Выделить всё
<form name="post" method="post" action="colordiff.php?post">
<input type="hidden" name="X1" value="" />
</form>
Теперь отправим данные при помощи JavaScript:
Код: Выделить всё
document.post.X1.value = "?"+hyper;
document.post.submit();
hyper - это переменная - строка с данными. Вот такой костыль: ввели в скрытый (hidden) инпут нашу переменную и отправили.
Теперь надо принять переменную в файле colordiff.php, и javaScript без помощи PHP принять данные POST не может, ведь данные принимает сервер а не клиенсткий компьютер, значит нужен серверный сценарий. Вот второй костыль с включением кусочка кода на PHP в тело JavaScript (скрипт размещается внутри страницы php а не отдельным файлом js). Заметим что в первой строчке приведенного ниже кода мы принимаем данные методом GET, проверяем их, и если их содержимое равно "?post" - принимаем данные методом POST. Вот содержание яваскрипта в файле colordiff.php, к которому мы обратились ранее:
Код: Выделить всё
var get = location.search; //переменной get присваивается все содержимое адресной строки начиная с вопросительного знака
if (get == '?post') {
get = "<?php echo $_POST['X1']; ?>"; // переменной get присваивается содержание, переданное методом POST
//alert(get); }
Вот теперь переменной get присваевается на сервере значение переменной X1, переданной методом POST. Условие я создал для того, чтобы небольшое количество данных передавать в адресной строке методом GET: так можно поделиться ссылкой.
А при слишком длинной переменной hyper передавать ее как X1 методом POST: ссылкой конечно на результаты не поделишься, зато
калькулятор все же считает любые таблицы. Ну а если содержание адресной строки отличается от пометки ?post и содержит данные, переданные методом GET, то нам уже не надо ничего принимать методом POST, сразу берем данные из адресной строки и режем по разделителям "&" в массив "adress", отсекая первый знак "?" в строке:
Код: Выделить всё
var adress = new Array();
if (get != '') {
adress = (get.substr(1)).split('&');
но это уже другая история. Заметим, что если PHP ничего не принял методом POST, никакой переменной X1 не было, то он возвращает пустое значение а не что-то типа NaN или Undefined, что в моем случае очень удобно: не надо писать дополнительных условий: ведь get = "".
Как передать скрипту методом POST данные от пользователя в виде текстового файла
можно прочитать здесь.