2014-12-29 2 views
0

두 개의 드롭 다운 목록이 있습니다. 첫번째는 좌석, BMW, 아우디 등의 자동차 브랜드를 포함합니다. 두 번째는 사용자가 목록 1에서 선택한 특정 브랜드의 모델을 포함하고자합니다. 현재 코드 상태에서 목록 1에서 브랜드를 선택하면 두 번째 리스트는리스트 1에서 같은 엘리먼트로 채워집니다. 그래서 똑같은 레코드를 가진 중복리스트가 있습니다.Ajax를 사용하여 다른 목록에서 값을 선택한 후 드롭 다운 목록 채우기

주요 파일 :

<?php 
defined('_JEXEC') or die('Restricted access'); 
$css='css.css'; 
$doc = JFactory::getDocument(); 
$doc->addStyleSheet('modules/mod_alpha_table/assets/'.$css); 
$db= JFactory::getDbo(); 
$ready = $db->getQuery(true); 
$query="SELECT category_name,virtuemart_category_id from uhhu_virtuemart_categories_el_gr INNER JOIN uhhu_virtuemart_category_categories ON uhhu_virtuemart_categories_el_gr.virtuemart_category_id = uhhu_virtuemart_category_categories.category_child_id WHERE uhhu_virtuemart_category_categories.category_parent_id = 105"; 
$db->setQuery($query); 
$options=$db->loadObjectList(); 
$model=""; 

?> 
<script> 
function showUser(str) { 
var xmlhttp; 


     if (window.XMLHttpRequest) { 
      // code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp = new XMLHttpRequest(); 
     } else { 
      // code for IE6, IE5 
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     xmlhttp.onreadystatechange = function() { 
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
       document.getElementById("txtHint").innerHTML = xmlhttp.responseText; 
      } 
     } 

     xmlhttp.open("GET","query.php?q="+str,true); 
     xmlhttp.send(); 

} 
</script> 
<div class="srchcr"> 
    <div class="srch"> 
     <form name="searchcar"> 
     <form> 
      <select onchange="showUser(this.value)" name="cats"> 
      <option value="none">Select Make</option> 
       <?php foreach ($options as $row) { 

        echo '<option value=' . $row->virtuemart_category_id . '>'. $row->category_name . '</option>'; 
        } 
        ?> 
      </select> 


      <select name="subcats" id="txtHint"> 
       <option value="none">Select Model</option> 

      </select> 

     </form> 
    </div> 
</div> 

query.php 파일 : phpMyAdmin을하고 작업을 미세에서 테스트

<?php 
      $doc = JFactory::getDocument(); 
      $db= JFactory::getDbo(); 
      $ready = $db->getQuery(true); 
      $q = htmlspecialchars($_REQUEST['q']); 
      $query='SELECT category_name,virtuemart_category_id from #__virtuemart_categories_el_gr INNER JOIN #__virtuemart_category_categories ON #__virtuemart_categories_el_gr.virtuemart_category_id = #__virtuemart_category_categories.category_child_id WHERE #__virtuemart_category_categories.category_parent_id = $q'; 
      $db->setQuery($query); 
      $options=$db->loadObjectList(); 

      foreach ($options as $row) { 

        echo '<option name='. $q .' value=' . $row->virtuemart_category_id . '>'. $row->category_name . '</option>'; 
        } 

      ?> 

쿼리. 어떻게 든 첫 번째 쿼리가 $ query.php 파일 내의 쿼리 대신 두 번 실행되는 것 같습니다. 나는 또한 메인 파일 내부의 코드를 포함하고 있지만 동일한 스토리를 가지고있다. 두 번째 $ 쿼리를 $ query2로 이름을 바꾸고 $ query2를 실행했지만 아무 것도 변경하지 않았다. 누군가가 잘못되어 가고있는 것에 대해 나를 화나게 할 수 있을까?

편집 : 휴식과 좀 더 디버깅 내가 문제의 시작은 곳이라고 생각 후 :

xmlhttp.open("GET","query.php?q="+str,true); 

그것은 어떤 이유에 대한 요청 것 같아, 대신 query.php의는 인덱스에 전송됩니다. PHP는 동일한 쿼리를 다시 트리거합니다. 나는 die(); query.php의 시작과 아무것도 일어나지 않았다. 나는 joomla 문법이나 다른 것을 사용할 필요가 있을까?

답변

1

여기에 복사 - 붙여 넣기 오류가있는 것 같습니다. 옵션 태그의 생성을 비교할 때, 나는 브랜드와 모델 모두에 대해 정확히 같은 코드를 보았는데, 이것은 쿼리와 DOM 생성을 의미한다.

기본적으로 코드는 완벽합니다. XMLHttpRequest를 당신 자신의 구현을 작성하지 마십시오, JQuery와 같은 라이브러리를 사용

  • : 코드에

    일부 일반적인 의견)하지만 당신의 query.php에 다시이 같은 브랜드의 목록을 작성하는 또는 mootools

  • userland ($ _REQUEST [ 'q']) 값을 사용할 때 sql-injects에 취약합니다. 이 질문에 대한 답변을 stackoverflow : Best way to prevent SQL injections in Joomla

  • 만약 당신이 같은 쿼리를 사용하여 귀하의 2 목록에 대한 정보를 수집, 귀하의 로직 (사용자가 브랜드, 모델 목록이 업데이 트됩니다)를 구현하려고 자바 스크립트를 통해보십시오. 따라서 main.php는 여전히 브랜드 목록을 생성하지만 모든 모델 목록도 렌더링합니다. 사용자가 그에 따라 브랜드를 변경하면 표시되거나 숨겨집니다. 이렇게하면 브랜드를 선택할 때마다 서버로의 추가 왕복을 피할 수 있습니다.

+0

동일한 코드가 아닙니다. WHERE id = 105의 첫 번째 쿼리에서 (자동차 브랜드는 상위 카테고리 105의 자동차라는 상위 카테고리에도 포함됨) 처음으로 브랜드를 선택합니다. 두 번째 쿼리 WHERE id = $ qi에서 Brand.for의 하위 카테고리를 선택하십시오. 예 : Audi의 id는 166입니다. 위의 쿼리를 phpmyadmin의 id = 166에 사용하면 원하는 모든 결과를 얻을 수 있습니다.) – IseNgaRt

+0

올바른 정보 내가 오해했다면. 내가 List1을 만들면서 각 브랜드의 하위 범주를 실제로 구문 분석하고 배열에 숨겨 두는 것이 좋습니다. 브랜드가 목록 1에서 선택되면 해당 배열이 목록 2에 표시됩니다. 맞습니까? – IseNgaRt