php - 使用 jQuery 的动态链式选择框

标签 php jquery ajax select

我使用 jQuery/JS/Ajax 脚本从数据库中动态填充 SELECT 框,每个后续 SELECT 框都根据前一个 SELECT 进行填充。

例如。有人从我的第一个 SELECT 中选择“英格兰”,然后用英格兰的城镇等填充下一个 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。

问题是第一个 SELECT 框的“onBlur”,使用此 JS 函数和 PHP 调用调出第二个 SELECT 框:

$(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 框的结果。

有人知道如何将 $tblname 变量传递给

function drop_1($drop_var) { ...

最佳答案

如果您使用 PHP session 来存储用户的国家/地区(从 getTierOne() 的第 1 行看来,您就是这样),您应该能够将该行添加到 drop1() PHP 函数的开头:

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

Jquery 应该发送用户的 cookie 以及 GET 参数(func 和 dropvar),这允许 PHP 知道哪个 session 属于用户,并将其 session 变量返回给他们(您可以使用“网络”检查这一点) Firebug/Chrome 检查器的选项卡 - 在 onBlur 触发后查找对 func.php 的调用并查找“Cookie”请求 header )。

或者,如果您不使用 session ,但您将国家/地区存储在客户端(例如,作为第一个“drop_0”选择框?),您可以让 jquery 传递来自 tier1(县)的选择在 get 调用中选择框。即。

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

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

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

关于php - 使用 jQuery 的动态链式选择框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15970315/

相关文章:

javascript - 使用 javascript 或 jQuery 的实体 block DIV

javascript - quill.formatText() 不允许嵌套格式

javascript - 如何加快我的 jQuery 粘性页脚的加载时间?

javascript - 是否可以中止数据类型为 json 的 jquery $.ajax 请求?

php - 将大量变量写入 MySQL 数据库的最佳方法是什么?

php - APNs 消息已发送但未在 iOS 设备上接收

php - 将 OAuth WRAP 访问 token 直接保存在客户端计算机上的 cookie 中?

javascript - 计算多行的keyup(通过单击按钮创建的行)

php - 上传前检查文件属性

php - 如何创建一个 Facebook 风格的 "Like"系统?