[英]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.