2012-06-12 4 views
0

나는 ajax 요청에 대한 응답으로 JSON을 반환하는 php 함수를 가지고있다. 여기 PHP와 Prototype의 AJAX

public function getDeliveryOptions($weight, $postcode) 
{ 

    if($weight == 0) 
    { 

     return array(array("name" => "Non-Deliverable", "value" => "0.00")); 

    } 

    $this->db->where('dmc_lower_boundary <=', $weight); 
    $this->db->where('dmc_upper_boundary >=', $weight); 

    if(preg_match("([aA][bB](3[1-8]|4[1-5]|5[1-6])\s?[1-9][a-zA-Z]{2}|[fF][kK](19|20|21)\s?[1-9][a-zA-Z]{2}|[hH][sS][1-9]\s?[1-9][a-zA-Z]{2}|[iI][vV][1-9]{1,2}\s?[1-9][a-zA-Z]{2}|[kK][aA](27|28)\s?[1-9][a-zA-Z]{2}|[kK][wW][1-9]{1,2}?\s?[1-9][a-zA-Z]{2}|[pP][aA][2-8][0-9]\s?[1-9][a-zA-Z]{2}|[pP][hH]([156789]|1[056789]|[2-5][0-9]){1,2}\s?[1-9][a-zA-Z]{2}|[zZ][eE][1-9]\s?[1-9][a-zA-Z]{2})", $postcode)) 
    { 

     $this->db->where("dm_id = ", 1); 
     $this->db->or_where("dm_id =", 3); 

    } 
    elseif(preg_match("/([bB][tT][1-9]{1,2}\s?[1-9][a-zA-Z]{2}|[iI][mM][1-9]{1,2}\s?[1-9][a-zA-Z]{2}|[tT][rR](21|22|23|24|25)\s?[1-9][a-zA-Z]{2})/", $postcode)) 
    { 

     $this->db->where("dm_id =", 1); 
     $this->db->or_where("dm_id =", 4); 

    } 
    elseif(preg_match("/([gG][yY][1-9]\s?[1-9][a-zA-Z]{2}|[jJ][eE][1-4]\s?[1-9][a-zA-Z]{2})/", $postcode)) 
    { 

     $this->db->where("dm_id =", 1); 
     $this->db->or_where("dm_id =", 5); 

    } 
    else 
    { 

     $this->db->where("dm_id =", 1); 
     $this->db->or_where("dm_id =", 2); 

    } 

    $this->db->group_by("dm_id"); 
    $query = $this->db->get("delivery_method_option_views"); 
    //print_r($query->result()); 
    //print_r(json_encode($query->result())); 
    return(json_encode($query->result())); 
} 

내 자바 스크립트 (사용하여 프로토 타입)입니다 서버로 결과를 전송하고 라디오 버튼 생성하기 위해 응답을 사용하기 :

function updateDelivery() 
{ 
if($('deliveryUpdate') == null) 
{ 

    return false; 

} 

// This 'observes' our form submit - sort of like onsubmit 
$('deliveryUpdate').observe('submit', function(evt) { 

    // Stop the actual event from happening 
    evt.stop(); 

    // This is the url we submit to - change it as needed 
    var url = '/checkout/updateDelivery'; 

    //This will be the form and div we update 
    var containerForm = $('deliveryUpdate'); 
    var optionsDisplay = $('deliveryOptions'); 

    // Grab all the info in the form 
    var form_data = containerForm.serialize(); 
    var form = containerForm.innerHTML; 

    // Here we make the request 
    new Ajax.Request(url, { 
     method: 'post', 
     parameters: form_data, 
     onCreate: function() { 
      form = containerForm.innerHTML; 
      containerForm.update(form+'<img src="/images/loader.gif" alt="loading..." class="loader" />'); 
     }, 
     onSuccess: function(transport) { 
      containerForm.update(form); 
      NVPResponse = transport.responseText; 

      if(NVPResponse !== '[object Array]') 
      { 

       NVPResponse = new Array(NVPResponse); 

      } 
      alert(NVPResponse); 
      options = ""; 
      for(i=0; i<NVPResponse.length; ++i) 

      { 

       options += '<label for="delivery">'+NVPResponse[i].dm_name+'</label><input type="radio" name="delivery" value="'+NVPResponse[i].dmc_price+'" />'; 

      } 

      //optionsDisplay.update(NVPResponse); 
      optionsDisplay.update(options); 
     } 

    }); 

}); 

} 

난 그냥으로 업데이트하는 경우를 여기에 PHP 함수입니다 내가 옵션 VAR로 업데이트하면, 내가 여기서 "정의되지 않은"얻을

Calculate Delivery Costs[{"dm_id":"1","dm_name":"Royal Mail","dm_admin_name":"Royal Mail","dmc_lower_boundary":"101","dmc_upper_boundary":"250","dmc_price":"3.65"},{"dm_id":"3","dm_name":"Courier","dm_admin_name":"Fed Ex Zone 4","dmc_lower_boundary":"101","dmc_upper_boundary":"250","dmc_price":"4.50"}]

그러나 : (우편 번호 ab31의 2AS에 대한) JSON 결과, 나는 다음과 같은 수 레이블 텍스트 및 및 라디오 단추 값이 이동합니다. 이것은 onSuccess 함수의 for 루프에서 빌드됩니다. 어떤 아이디어?

편집은 내가 이전에 다음 코드를 추가 한 루프 I 객체가 아닌 객체로 JSON 문자열을 사용하려고했기 때문에 :

NVPResponse = JSON.parse(NVPResponse); 

답변

1

내가 프로토 타입에 더 큰 전문가가 아니야, 하지만 당신의 NVPResponse은 자바 스크립트 객체로 변환되지 않은 문자열입니다. (AJAX (특히 자바 스크립트 응답 평가) 및 JSON에 대한 프로토 타입 문서 참조).

또한 코드에 몇 가지 다른 문제가있는 것 같습니다. PHP 코드에서

:

if($weight == 0) 
    { 

     return array(array("name" => "Non-Deliverable", "value" => "0.00")); 

    } 

당신이 그것을 JSONing하지 않고 배열을 반환, 즉 의도적 인? 또한

는 논리적 오류가있을 것 같습니다 : DM_ID에 대한

$this->db->or_where("dm_id =", 3); 

쿼리 = 3에 관계없이 이전 "여기서"당신이 설정하는 것이,

$this->db->where('dmc_lower_boundary <=', $weight); 
$this->db->where('dmc_upper_boundary >=', $weight); 

이 무시 조치 할 수 있도록 if dm_id = 3 (또는 다른 or_where 물론). 이 솔루션은 다음과 같이 할 수있다 :

$this->db->where_in("dm_id", array(1,3)); 

편집 :

이 경우

당신이 완벽하게 작품을 쓴 쿼리,하지만 당신은 CodeIgniter를이 주위에 괄호 또는 인수를 두지 않는 것을주의해야 그 따라서 동일한 쿼리에서 OR 및 AND를 결합하면 버그가 발생할 수 있습니다.당신에게 매우 다른 결과를 제공 할 수 있습니다 (복잡한 쿼리를 작성할 때 가끔 이상)

SELECT * FROM (`t_name`) 
WHERE `dmc_lower_boundary` <= $weight AND `dm_id` = 1 OR `dm_id` = 3 

는 다른 순서로 동일한 쿼리를 작성 : 방법 당신은 쿼리 (잘 작동)과 같이 보일 것입니다 코드를 작성 : 나는 "or_where":

+0

하지만 내 데이터베이스 쿼리가 올바른 결과를 당기는 조심 배운 몇 가지 심각한 버그 후

SELECT * FROM ('t_name') WHERE 'dm_id' = 1 OR 'dm_id' = 3 AND 'dmc_lower_boundary' <= $weight 

? : S 첫 번째 배열 주셔서 감사합니다 :) –

+0

My bad. CI는 OR 문을 괄호로 묶지 않으므로 버그가있는 경향이 있습니다. 나는 그것을 반영하기 위해 답을 편집했다. – Elad

관련 문제