2013-04-12 26 views
2

我正在使用jQuery/JS/Ajax脚本从我的数据库动态填充SELECT框,每个后续的SELECT框都是基于前一个SELECT填充的。使用jQuery的动态链接选择框

例如,有人从我的第一个SELECT中选择'England',然后填充下一个SELECT在英格兰等城镇。

我遇到的麻烦是获取第二个SELECT函数来识别变量。这是一个很大的代码,所以我不想粘贴所有,但...这是填充在页面加载的第一个选择框中的第一个函数:

function getTierOne() 
{ 
$tblname = $_SESSION['country']; 
$result = mysql_query("SELECT DISTINCT county FROM $tblname ORDER BY county") 
or die(mysql_error()); 
while($tier = mysql_fetch_array($result)) 
{ 
    echo '<option value="'.$tier['county'].'">'.$tier['county'].'</option>'; 
} 
} 

这是罚款,$ tblname是发布$ _SESSION变量包含用户国家,obvs。

问题是这样的第一选择框 '的onblur',第二个选择框被提升使用这个JS函数和PHP调用:

$(document).ready(function() 
{ 
    $('#wait_1').hide(); 
    $('#drop_1').change(function() 
     { 
      $('#wait_1').show(); 
      $('#result_1').hide(); 
      $.get("func.php", 
       { 
        func: "drop_1", 
        drop_var: $('#drop_1').val() 
       }, 
      function(response) 
       { 
        $('#result_1').fadeOut(); 
        setTimeout("finishAjax('result_1', '"+escape(response)+"')", 400); 
       }); 
      return false; 
     }); 
}); 

...

if (isset($_GET['func'])&& $_GET['func'] == "drop_1") { 
drop_1($_GET['drop_var']); 
} 

其中要求这个功能:

function drop_1($drop_var) 
{ 
    include_once('functions.php'); 
    $result = mysql_query("SELECT DISTINCT town FROM $tblname WHERE county='$drop_var'") 
    or die(mysql_error()); 

    echo '<select name="drop_2" id="drop_2"> 
    <option value=" " disabled="disabled" selected="selected">Select Your Town/Nearest Town</option>'; 

    while($drop_2 = mysql_fetch_array($result)) 
    { 
    echo '<option value="'.$drop_2['town'].'">'.$drop_2['town'].'</option>'; 
    } 
    echo '</select>'; 
    echo '<input type="submit" name="submit" value="Continue" />'; 
} 

但是这个函数不会识别我的$ tblname变量,即使我使用Global!它识别的唯一变量是$ drop_var,它是第一个SELECT框的结果。

没有人有任何想法如何,我可以。如果你使用PHP会话来存储用户的国家$ tblname变量传递到

function drop_1($drop_var) { ... 
+0

'onBlur'工作在客户端浏览器上,而不是在服务器上,除非你使用'ajax',否则你不能在javascript事件上运行php函数 –

+0

我只是在使用onBlur作为一个糟糕的描述,一旦做出选择从第一个SELECT中调用一个JS函数,该函数又调用PHP函数 - 我将JS添加到我的问题中。 – user2246804

+0

它是一样的,你不能从javascript调用php函数 –

回答

0

(从getTierOne(的LINE-1),它看起来像你),你应该能够行添加到您的drop1()PHP函数的开始:

function drop_1($drop_var) 
{ 
    $tblname = $_SESSION['country']; 
    include_once('functions.php'); 
    ... 

的Jquery应该用GET参数(FUNC和dropvar),它允许PHP一起发送用户的cookie知道哪个会话属于该用户,并给他们他们的会话变量bac k(您可以使用Firebug/Chrome检查器的“网络”选项卡检查此内容 - 在onBlur激活并查找“Cookie”请求标头后,查找对func.php的调用)。或者,如果你不使用会话,但你有国家存储在客户端(例如作为第一个“drop_0”选择框?),你可以让jquery通过tier1(县)在获取呼叫中选择框。即。

$.get("func.php", 
{ 
    func: "drop_1", 
    country: "VALUE OF COUNTRY HERE", 
    drop_var: $('#drop_1').val() 
}, 
function(response) 
{ ... 

并修改您的服务器端PHP代码接受2个参数,而不是一个。

从可维护性角度考虑,不要使用多个表格(每个国家/地区一个表格),而应该使用带有“country”列的单个表格。拥有多个相同结构的表并不是一个好主意,MySQL通常可以处理数百万行比数百个表好得多,并且使连接和更改表的结构变得更加困难。 您还应该对输入进行清理,而不是直接在SQL查询中使用$ GET ['drop_var'],否则它将打破引号并打开SQL注入攻击。 (道歉,如果你有充分的理由做这些:显然你比我更了解你的具体要求!)

+0

Crashhatch - 我正在使用会话,但功能drop_1($ drop_var)将无法识别它们 - 我实际上已将所有数据存入一个可用表格(英国),我将其分成苏格兰,英格兰,威尔士和北爱尔兰 - 但我可以添加我的第一个查询打折的地方,所以你是对的 - 谢谢你花时间回答 - upvoted,虽然没有解决我原来的问题 - 一个很好的回应。哦,我不能upvote - 但如果我能我会。 – user2246804

+0

很高兴你解决它。如果遇到会话不再工作的问题,首先要做的两件事是检查cookie是否被传递(使用所描述的Firebug),并确保PHP的session_start()被调用为ajax在尝试访问会话之前获取请求(例如,在func.php的顶部)。 – Crashthatch