繁体   English   中英

使用Ajax从其他列表中选择值之后,填充下拉列表

[英]Populate a dropdownlist after selecting a value from a different list using Ajax

我有2个下拉列表。 第一个包含座位,宝马,奥迪等汽车品牌。第二个包含来自列表1中用户选择的特定品牌的模型。在我当前的代码状态下,当我从列表1中选择A品牌时,第二个列表是从列表1中填充相同的元素。因此,我有一个具有完全相同记录的重复列表。

主文件:

<?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文件:

<?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>';
                    }

            ?>

查询已在phpmyAdmin上测试并正常工作。 似乎不知何故,第一个查询被执行了两次,而不是$ query.php文件中的查询。 我也尝试将外部文件中的代码包含在main中,但还是一样。我也将第二个$ query重命名为$ query2并执行了$ query2,但没有任何改变。有人可以告诉我发生了什么问题吗?

编辑:经过休息和更多的调试后,我认为这是问题开始的地方:

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

似乎出于某种原因,该请求而不是在index.php发送query.php并再次触发相同的查询。我添加了die();。 在query.php的开头没有任何反应。所以我可能需要使用joomla语法或其他方法吗?

看起来您在这里有复制粘贴错误。 比较选项标签的创建时,我看到品牌和模型的代码完全相同,即查询和创建dom。

因此,基本上,您的代码非常好。 但是,在您的query.php中,您将再次创建相同的品牌列表;)

关于您的代码的一些一般注释:

  • 不要创建自己的XmlHttpRequest实现,请使用jquery或mootools之类的库

  • 当使用来自userland($ _REQUEST ['q'])的值而不清理它们时,您很容易受到sql注入的攻击。 请参阅有关stackoverflow的问题: 防止Joomla中的SQL注入的最佳方法

  • 如果确实使用相同的查询收集了2个列表的信息,请尝试通过javascript来实现您的逻辑(用户选择品牌,更新模型列表)。 因此,您的main.php仍会创建品牌列表,但也会呈现所有模型列表。 当用户相应更改品牌时,将显示/隐藏这些内容。 这样可以避免每次选择品牌时都需要额外往返服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM