我有2个下拉列表。第一个包含汽车品牌,如座椅,宝马,奥迪等。 第二个我想要包含用户在列表1中选择的特定品牌的模型。 在我当前的代码状态中,当我从列表1中选择一个品牌时,第二个列表将从列表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中包含外部文件中的代码,但它的故事也是一样的。我还将第二个$查询重命名为$ query2并执行了$ query2但没有任何改变。有人会因为出了什么问题而引起我的注意吗?
编辑: 经过休息和更多的调试后,我认为这就是问题的开始:
xmlhttp.open("GET","query.php?q="+str,true);
似乎请求由于某种原因而不是query.php在index.php发送并再次触发相同的查询。我添加了die();在query.php的开头并没有发生任何事情。所以我可能需要使用joomla语法或其他东西吗?
答案 0 :(得分:1)
这里看起来有一个复制粘贴错误。在比较选项标签的创建时,我看到品牌和模型的完全相同的代码,这意味着查询和dom创建。
基本上,你的代码非常好。但是在您的query.php中,您再次创建了相同的品牌列表;)
对您的代码的一些一般性评论:
不要创建自己的XmlHttpRequest实现,使用像jquery或mootools这样的库
在使用userland($ _REQUEST ['q'])的值而不清理它们时,您很容易受到sql注入攻击。在stackoverflow上查看此问题:Best way to prevent SQL injections in Joomla
如果您使用相同的查询收集2个列表的信息,请尝试通过javascript实现您的逻辑(用户选择品牌,更新模型列表)。因此,您的main.php仍会创建品牌列表,但也会呈现所有模型列表。当用户相应地更改品牌时,会显示/隐藏这些内容。这样可以避免每次选择品牌时额外往返服务器。