2

我正在使用 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 变量,即使我使用 Global!它识别的唯一变量是 $drop_var,它是第一个 SELECT 框的结果。

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

function drop_1($drop_var) { ...
4

1 回答 1

0

如果您使用 PHP 会话来存储用户的国家/地区(并且从 getTierOne() 的 line1 看起来像您一样),您应该能够将该行添加到您的 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(县)选择框的选择接听电话。IE。

$.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 注入攻击。(如果您有充分的理由这样做,请道歉:显然您比我更了解您的具体要求!)

于 2013-04-12T13:40:25.990 回答