【问题标题】:Dynamic Chained SELECT Boxes using jQuery使用 jQuery 的动态链式选择框
【发布时间】:2013-04-04 22:03:34
【问题描述】:

我正在使用 jQuery/JS/Ajax 脚本从我的数据库中动态填充 SELECT 框,每个后续的 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 变量,即使我使用全局!它唯一识别的变量是 $drop_var,它是第一个 SELECT 框的结果。

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

function drop_1($drop_var) { ...

【问题讨论】:

  • onBlur在客户端浏览器上工作,而不是在服务器上,除非你使用ajax,否则你不能在javascript事件上运行php函数
  • 我只是使用 onBlur 作为一个糟糕的描述,一旦从第一个 SELECT 中进行选择,这将调用一个 JS 函数,该函数又调用 PHP 函数 - 我会将 JS 添加到我的问题。
  • 同理,不能从javascript调用php函数
  • 它按原样工作,只是我必须将实际表名放在第二个函数中,而我希望能够使用变量。

标签: php jquery ajax select


【解决方案1】:

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

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

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

或者,如果您不使用会话,但您将国家/地区存储在客户端(例如,作为第一个“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 注入攻击。 (如果您有充分的理由这样做,我们深表歉意:显然您比我更了解您的具体要求!)

【讨论】:

  • Crashhatch - 我正在使用会话,但函数 drop_1($drop_var) 根本无法识别它们 - 我实际上将所有数据都放在一个可用表(英国)中,我将其分为苏格兰、英格兰、威尔士和北爱尔兰 - 但我可以在我的第一个查询中添加一个 WHERE 来打折,所以你是对的 - 感谢您抽出时间来回答 - 赞成并且虽然没有解决我最初的问题 - 一个很好的回应。哦,我不能投票 - 但如果可以的话,我会的。
  • 很高兴您修复了它。如果您遇到会话无法再次工作的问题,首先要尝试的两件事是检查以确保 cookie 正在传递(如所述使用 Firebug)并确保为 ajax 调用 PHP 的 session_start()在尝试访问会话之前获取请求(例如,在 func.php 的顶部)。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多