질문을 삭제하지 말아주세요.!
 
1
0
-1

function check(what){
$('[what='+what+']').parent().next().children().attr('class','icon-spin4 animate-spin');
var address = "{{route('register.check')}}";
var serialize = $('#register').serialize();
var whattype = what;
$.ajax({
type : 'post',
url : address,what,
data : serialize, << 이 데이터와 함께 var whattype = what 으로 whattype 데이터를 같이 넘기고싶습니다
datatype : 'json',
success : function(data){
console.log(data);
}
})
}

check 란 함수에 what 이란 파라미터가 있는데요 serialize로 폼에있는 데이터와 위에 whattype <<이란 변수도 같이 넘기고 싶은데 어떤식으로 넘겨야될까요 ?? 


    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      data: {whattype: what, serialize: serialize}

      요렇게 json형식으로 보내시면 됩니다.

      그럼 서버단에서는

      Request $req로 받을때

      $data->$req→all();

      $data['whattype'];

      $data['serialize'];

      로받으시면 됩니다.


      그리고 csrf_token을 비활성화 시키시지 않으셨다면, 

      data: {whattype: what, serialize: serialize, '_token': '{{ csrf_token() }}'}

      토큰추가 하셔야하는거 아시죠? post 니까요.


      결론: 

      $.ajax({
          method : 'post',          //이거는 저는 method라고 쓰는데 type로 안해봐서 되는지안되는지 모름
          url : address,
          data: {whattype: what, serialize: serialize, '_token': '{{ csrf_token() }}'},  //laravel의 bladel엔진을 사용한다고 가정했을때 저렇게 써야함 blade 안쓰면 <?= csrf_token() ?> 을 사용해야함
          success : function(data){
              console.log(data);
          }
      });


      제가 찾아보니 아실지는 모르겠는다 시리얼라이즈 함수를 사용해서 나온 쿼리스트링을 php내장함수인 parse_str 함수를 사용하면 배열로 바꿔준다네요.


      저는 아직 고등학생이고 배우지못한것이 많으니 제가 작성한 방법보다 좋은 방법이 있으면 알려주시기 바랍니다.

      1. 최윤석

        답변 감사합니다!

        답변 주신것 처럼 작성하니 콘솔에선 데이터가 나뉘어서 잘 나오는데

        serialize 데이터는

        "_token=eSOBs5dDiifQu3IAHzm1ontxw1epHZMC8Eod7ibi&phone=&name=&user_pass=&user_pass_check=&email="

        이렇게 나와서 $data['serialize'][0] 처럼 데이터를 찍어서 뽑을수가 없는데 이문제도 알고계실까요,,,

        split("$",$request→serialize);

        와 같이 작성해도 500오류만 나오는데 ㅠㅠ 

      2. 김정훈
        방법이 많네요
        $data1 = $request->input('시리얼라이즈로 넘어온애 1번');


        이런식으로 하나봐요




      3. 소현진

        일단 폼에있는 토큰은 쓸모가 없습니다. 이유는 아실거라 생각합니다.

        제가 질문을 제대로 이해했다면 뽑으실수 없는게 당연합니다. 

        jquery 함수 serialize()는 반환형이 '문자열'입니다. 제가 어제 작성해드린 코드에는 serialize()로 반환된 문자열을 serialize라는 이름으로 보낸것입니다. javascript와 php는 다른언어이기 때문에 배열의 전송이 불가능합니다. 따라서 json이라는 형식을 사용해야 합니다. json은 key value로 이루어진 배열? 비슷한 것이라고 보시면 됩니다. 저도 야메로 공부했기 때문제 정확한 정의같은것은 알려드릴수가 없지만 사용하실 때에는 javascript에서 배열이 보내고 싶으시면 JSON.stringify(arr) 로 문자열을 만들어서 서버단에 전송하신 후에 json_decode() 를 사용해서 json을 풀어서 사용 할 수 있습니다. 반대의 경우에는 json_encode() 를 사용하여 문자열로 만든후 javascript 에서 JSON.parse(arr)로 변환하여 배열처럼 사용할 수가 있습니다. 제가 data:{...} 이렇게 넣은것이 바로 json의 형태입니다. whattype이라는 key에 what이라는 변수를 value로 넣고 serialize이라는 key로 serialize라는 문자열을 넣은것입니다. 제가 json을 설명드리는 이유는 질문자님께서 form에 토큰을 빼시지 않으셨기 때문에 jquery의 serialize() 의 반환형과 json의 전송에 대해서 잘 모르시는것 같기 때문입니다.


        정리해드리겠습니다.

        1. jquery 함수 serialize()의 반환형은 문자열입니다.
        2. 저 스트링을 배열처럼 뜯으시려고 하시는것 같은데 타 언어간의 배열의 전송은 불가능합니다. 따라서 json형식을 사용하는 것입니다. 타 언어간의 json형식 변환은 앞서 설명드렸습니다.
        3. 문자열을 배열처럼 사용하려니 오류가 발생하는것이 당연합니다.
        4. 질문자님께서 의도하시는대로 저렇게 바로 배열로 사용하고 싶으시면 serizlize()를 사용할 것이 아니라 배열로 정리해서 만들고 JSON.stringify() 로 json string 로 만드시고 php에서 json_decode 함수를 사용하셔서 배열로 풀면 바로 배열로 사용이 가능해집니다.
        5. 질문자님께서 처음에 질문하시고 제가 답변드린 방식으로 하시려면 제가 답변에 작성해놓은 php 내장함수중 하나인 parse_str 함수를 사용하시면 query string을 배열로 바꾸어 줍니다.
        6. form의 토큰은 제거하셔야 합니다. serizlize() 함수로는 문자열이 나오므로 아무의미가 없습니다. laravel에서 확인하는 토큰은 ajax에 data의 '_token'입니다. 
        7. 6번의 설명이 이해가 잘 안되시면 laravel을 사용하지 않고 순수 php로 미니프로젝트를 진행해 보시면 이해도를 높이실 수 있습니다.
      4. 소현진

        split라는 함수는 javascript의 함수 아닌가요?

        저는 php에서는 배열과 문자열을 가지고 왔다갔다할때는 implode나 explode를 사용합니다.

        그리고 parse_str을 사용하시면 쉽게 query string를 풀어줍니다.


      CommentAdd your comment...
    2.  
      1
      0
      -1

      방법이야 많겠지만

      serialize 하기전에 

      폼에 히든을 하나 추가 해주는 것도 방법입니다.


      <form id='register'>
        <input type=text name='a' value='aa'>
        <input type=text name='b' value='bb'>  
      </form>
      
      
      $(function() {
      
      	var what = 'what'
      	$("<input></input>").attr({type:"hidden", name:"what_type",value:what}).appendTo($('#register'));
      	var serialize = $('#register').serialize();
      
      	alert(serialize);
      });
        CommentAdd your comment...