문제

나는 몇 개의 검색 양식, 1은 ~ 50 필드를 가진 1 개, 다른 하나는 ~ 100입니다. 일반적으로 HTML 사양에서 알 수 있듯이 데이터가 변경되지 않으므로 GET 메소드를 사용하여 검색합니다. 아직이 문제가 발생하지 않았지만 곧 URL 공간이 부족할지 궁금합니다.

의 한계 인터넷 익스플로러 2083 자입니다. 다른 브라우저, a 훨씬 높은 한계. 나는 Apache를 실행하고 있으므로 약 4000자인 한계는 IIS가 16384 자입니다.

100 개의 필드에서는 평균 필드 이름 길이 10 자입니다. 이미 5000 자입니다 ... 100 필드 형식에서 놀랍습니다. 아직 오류가 없었습니다. (필드의 25%가 다중 선택이므로 필드 길이가 훨씬 길어집니다.)

그래서 나는 내 옵션이 무엇인지 궁금합니다. (양식을 단축하는 것은 선택 사항이 아닙니다.) 여기서 내 아이디어 :

  • 게시물을 사용합니다. 사용자가 검색을 북마크하고 나중에 다시 수행 할 수 있기 때문에이 점이 마음에 들지 않습니다. 정말 좋은 기능입니다.
  • 기본값과 다른 필드가 다른 필드를 채우고 다른 양식을 채우고 해당 형식을 제출하기 위해 자바 스크립트 루프를 사용하십시오. 사용자는 물론 단축 버전을 북마크합니다.

다른 아이디어가 있습니까?

또한 길이가 인코딩 된 길이인지 또는 일반 텍스트인지 아는 사람이 있습니까?

PHP에서 개발 중이지만 아마도 차이가 없습니다.

편집하다: 필드를 제거 할 수 없습니다. 양식을 단축 할 수 없습니다. 이것이 클라이언트가 요청한 것이며 종종 다른 범주에서 다양한 필드를 사용합니다. 나는이 많은 분야에서 멋지게 보이는 형태를 생각하기가 어렵다는 것을 알고 있지만 사용자는 그것이 어떻게 작동하는지 이해하는 데 문제가 없습니다.

도움이 되었습니까?

해결책

사용자가 실제로 50-100 필드를 모두 사용하여 검색을 수행 할 것인가? 몇 가지만 사용하는 경우 Header ()가 URL의 사용자 변경 필드만으로 결과 페이지로 리디렉션하는 "사이의"페이지에 검색을 게시하지 않겠습니까? 그런 다음 결과 페이지는 URL에 존재하지 않는 필드의 기본값을 사용합니다.

다른 팁

간접적으로 귀하의 질문을 해결하려면, 한 페이지에 100 필드 양식에 직면했다면 브라우저를 닫을 가능성이 높습니다. 악몽.

내 대답 정상 양식의 사용, 나는 아마도 잘못하고있을 것입니다.

선호하는 순서대로, 나는 할 것이다

  1. 양식을 분할하고 일부 서버 측 상태 보존을 사용하십시오.
  2. 게시로 전환 한 다음 동일한 결과로 해결 된 게시물의 짧은 URL로 생성 및 리디렉션합니다.
  3. 포기하다 ;)

당신은 많은 분야가 "숨겨져 있고 필요에 따라 열 수있다"고 언급했다.

우아한 열화를 기꺼이 폐기하려는 경우 실제로 숨기고 보여주기보다는 항상 양식에서 필드를 추가하고 제거 할 수 있습니다. 브라우저는 양식에 포함되지 않은 것을 제출하지 않습니다.

이것은 온라인 보험 등의 "제조 및 모델"양식의 변형입니다.

JavaScript를 사용하지 않으면 쿼리 문자열의 길이를 해결하고 너무 길면 게시물로 전환 할 수 있습니다. 그런 다음 게시 된 검색을 북마크 할 수 있도록 일종의 URL 맵퍼가 있어야합니다.

게시물을 사용하고 사용자가 검색을 북마크하는 경우 데이터베이스에 저장 한 다음 고유 한 토큰을 제공 한 다음 사용 검색 페이지로 리디렉션하십시오. GET 토큰을 매개 변수로 전달합니다.

TinyUrl은 좋은 예입니다. 매우 긴 URL을 제공하고 DB에 저장하고 해당 URL에 대한 고유 식별자를 제공하고 나중에 해당 식별자를 사용하여 긴 URL을 요청할 수 있습니다.

PHP에서는 다음의 선을 따라 무언가가 될 것입니다.

<?php
if (isset($_GET['token']))
{
    $token = addslashes($_GET['token']);
    $qry = mysql_query("SELECT fields FROM searches WHERE token = '{$token}'");
    if ($row = mysql_fetch_assoc($qry))
    {
        performSearch(unserialize($row['fields']));
        exit;
    }
    showError('Your saved search has been removed because it hasn\'t been used in a while');
    exit;
}
$fields = addslashes(serialize($_POST));
$token = sha1($_SERVER['REMOTE_ADDR'].rand());
mysql_query("INSERT INTO searches (token, fields, save_time) Values ('{$token}', '{$fields}', NOW())");
header('Location: ?token='.$token);
exit;
?>

매일 스크립트를 실행하십시오.

<?php
mysql_query('DELETE FROM searches WHERE save_time < DATE_ADD(NOW(), INTERVAL -200 DAY)');
?>

또한 길이가 인코딩 된 길이인지 또는 일반 텍스트인지 아는 사람이 있습니까?

내 추측은 인코딩 된 길이였습니다. 간단한 테스트 : Textarea와 제출 버튼을 단순한 PHP 스크립트로 제출했습니다.
IE6에 페이지를로드하고 2000자인 Textarea의 프랑스어 텍스트를 붙여 넣었습니다. 제출 버튼을 누르면 아무것도 없습니다. 제출할 수 있도록 텍스트의 길이를 줄여야했습니다.

다시 말해, 2083 문자 한계는 GET 요청을 제출 한 후 주소 표시 줄에서 발견 된 URL의 최대 길이입니다.

JavaScript 솔루션을 찾을 수 있습니다 : 제출, 양식을 분석하고, 2 차 양식을 작성하십시오. hidden 속성을 제출하십시오.

출력 단축에 관한 일부 전략 :

  • 지적한 바와 같이, 기본값으로 남은 모든 값을 이미 건너 뛸 수 있습니다 (필드 없음, 값 없음).
  • 당신이 하나와 같은 형태가 있다면 포럼 검색 처리 모든 확인란 상태를 하나의 변수로 만 그룹화 할 수 있습니다. 문자 인코딩 사용.
  • 짧게 사용하십시오 value 속성 (in select 예를 들어).

참고 : 검색 페이지가 실제로 여러 독립 양식으로 구성된 경우 사용자가 한 섹션 또는 다른 섹션 만 채우는 경우 여러 개의 별도 양식을 만들 수 있습니다.
귀하의 사건에 적용되지 않을 수도 있고 명백해 보일 수 있지만 기록을 언급 할 가치가 있습니다 ... ^_ ^

철학적으로 검색 제출물을 저장된 검색의 생성으로 볼 수 있습니다 (특히 검색이 사용자가 만드는 것만 큼 복잡한 객체 일 때). 이 경우 검색 생성에 대한 게시물을 수락 한 다음 적절한 검색 결과를 가져 오기 위해 Get을 사용하여 리디렉션 할 수 있습니다 (Post/Rediprect/Get).

이를 통해 사용자는 검색 결과 (GET)를 언제라도 검색하여 검색을 다시 실행할 수 있습니다.

검색 결과를 공유 할 수있는 경우 한 가지 이점을 가질 수 있습니다. 사후 요청의 경우 누군가에게 링크를 보내면 그 사람이 검색 결과를 볼 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top