PHP jQuery动态填充SELECT

时间:2012-10-20 02:42:56

标签: php jquery select dynamic options

一直在寻找解决方案,并在堆栈溢出方面找到了一些帮助,但在大多数情况下,我发现的示例不使用由数据库查询形成的数组。这是我想要实现的一些代码...

$stores = mysql_query("SELECT * FROM Stores");
$staff = mysql_query("SELECT * FROM Staff");

我想创建两个元素,一个用于商店,另一个用于员工,但我想根据商店客户端过滤员工。因此,如果用户从第一个下拉列表中选择“悉尼”,则只向他们提供在第二个下拉列表中在悉尼商店工作的员工。然后,如果用户从第一个下拉列表中选择“伦敦”,那么悉尼的工作人员将被伦敦的工作人员取代,依此类推。

我的服务器端脚本是用PHP完成的,我可以使用PHP创建两个下拉列表。但我坚持使用jQuery从第二个下拉列表中移除我不想要的内容。

我知道这是可能的,因为我看到它一直使用。我已经看到了很多关于如何管理它的例子,但没有一个例子使用PHP数组中的数据来插入。

4 个答案:

答案 0 :(得分:2)

你需要ajax。

当用户在下拉列表中选择某些内容时,会触发您可以处理的事件。在这个过程中你可以选择jQuery('#id_dropdown')。val()之类的选择值,并通过ajax发送它(我喜欢使用POST,因为你没有遇到GET请求大小限制)。

您使用php在服务器端处理此问题,使用选定的值访问数据库并通过ajax发送。当您有第二个下拉列表的正确结果时,您可以通过echo输出它。

最后,当响应返回到jQuery时,您可以在新的下拉列表中插入所有选项。


JAVASCRIPT PART:

  1. 将事件绑定到第一个下拉列表
  2. 获取下拉列表中所选选项的值
  3. 提出ajax请求
  4. 以下是一些示例代码:

     var parameters='value_selected='+value_dropdown;
     jQuery.Post({
           url: '/destiny_when_I_process',
           data: parameters, 
           success: func_callback
    
     });
    //here you can imagine a pause, because PHP is processing the data you send by post
    //....  
    //....
    //this part is executed when php send the information 
    function func_callback(response_from_php){
           jQuery('#second_dropdown').html(response_from_php); 
    }
    

    PHP PART:

    1. 从POST获得价值
    2. 使用此值访问数据库
    3. echo(发送响应)。你发送一串文本(用HTML格式),这真的不是很专业,但可以用于演示目的。专业人士发送JSON,因为JSON重量更轻。

    4. JAVASCRIPT PART(第二部分)

      1. 在回调函数中,您通过第一个参数
      2. 接收响应数据
      3. 在第二个下拉列表中插入新数据(因为数据已经是HTML,您无需处理它)

答案 1 :(得分:1)

对于次要下拉,是的,你需要一些ajax。

您可以创建一个脚本来获取与商店相对应的结果,然后发送回选项列表中的选项列表。

使用jquery和php你需要一些东西。

获取结果并返回选项的php文件。 (比方说getStaff.php)

<?php 
//get the store id by post is it is set
if (isset($_POST['store->id']) $store_id = mysqli_real_escape_string($_POST['store_id']);

//get the data !! notice the WHERE caluse
$r = mysql_query("SELECT * FROM Staff" *WHERE store=''$store->is*);

//split the data in the array
$staffs=array();
    while ($assoc = mysql_fetch_assoc($r)) {
          //Varialbe = $assoc['colum_name'];
          $staff->id=$assoc['id'];
         $staff->name=$assoc['name'];
        //and so on for each colum in your table.
        array_push($staffs, $assoc);
   }

//echo the result as option
foreach ($staffs as $staff) echo "<option value='$staff->id'>$staff->name</option>";
?>

首先选择,添加

onchange="$.post('getStaff.php', {store_id:$(this).val()}, function (data){ $('#staff_select').html(data);});"

并在此示例中为您的第二个选择(staff_select)添加一个ID。

作为解释:当第一个下拉列表发生更改时,它会向getStaff.php发送一个请求,并将store_id作为POST参数发送。 php sript根据商店ID获取syaff,并为您的辅助选择带回选项标签列表。比jquery将'数据'添加到您的辅助选择和VOilà!

希望这是明确的,因为它是一堆小东西,它会使它发挥作用。对不起,如果它看起来很草率,但一旦你知道它就很简单。

答案 2 :(得分:1)

下午学习如何做到这一点并且它运作良好。在这里为其他人发布新代码......

感谢教程http://forum.codecall.net/topic/59341-php-sql-jquery-and-ajax-populate-select-boxes/

感谢大家。

PHP构建第一个:

function agency_select() {
include('../include/dbase.php');
$agencies = $pdo->query("SELECT * FROM agency WHERE Status='active' ORDER BY AgencyName");
$opt = '';
while ($age_array = $agencies->fetch(PDO::FETCH_ASSOC)) {
    $opt .= '<option value="'.$age_array['AgencyId'].'">'.$age_array['AgencyId'].' - '.$age_array['AgencyName'].' - '.$age_array['AgencySuburb'].'</option>'."\n\t\t\t\t\t\t\t";
}
return $opt;
}

两个元素的HTML:

<label for="AgencyId">Client/Agency:</label>
    <select class="uniform" id="AgencyId" name="AgencyId" style="width: 400px; overflow-x: hidden">
        <?php echo agency_select(); ?>
    </select>

<label for="Contact">Contact: </label>
    <select class="uniform" id="Contact" name="Contact" style="width: 300px; overflow-x: hidden">
        <option value="">----Select Client/Agency----</option>
    </select>

AJAX文件:

if(isset($_POST['AgencyId'])) {

include('../include/dbase.php');

$option = '<option value="">----Select Contact----</option>';

$query = $pdo->prepare("SELECT * FROM client WHERE AgencyId= ?  AND Status='active' ORDER BY FirstName");
$result = $query->execute(array($_POST['AgencyId'])));

while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
    $option .= '<option value="'.$row['id'].'">'.$row['FirstName'].' '.$row['LastName'].'</option>';
}

echo $option;
}

jQuery的:

$(document).ready(function () {
    update_contacts();
});

function update_contacts() {
$('#AgencyId').change(function() {
    $('#Contact').fadeOut();
    $('#loader').show();

$.post('../ajax/ajax_contact_select.php', {
        AgencyId: $('#AgencyId').val()
        }, function (response) {
        setTimeout("finishajax('Contact', '"+escape(response)+"')", 400);
        });
        return false;
    });
}

function finishajax(id,response) {
    $('#loader').hide();
    $('#'+id).html(unescape(response));
    $('#'+id).fadeIn();
}

答案 3 :(得分:0)

我会尽力帮助你解释它。

mysql_query,你可以使用mysqli btw,mtsql被减少,返回一个结果集。 这意味着您将拥有查询中的所有记录。在使用它之前,您需要将结果压缩。这是通过使用像mysql_fetch_assoc,mysql_fetch_row等等的方法来完成的。有些东西比如获取到数组,但是我没有掌握它,所以我将使用fetch assoc来进行此回复。

所以,一旦你有yoru结果集,$ stores&amp;在您的情况下,$ staff,然后在结果上调用while循环以获取数据,如下所示:

    while ($assoc = mysql_fetch_assoc($r)) {
          //Varialbe = $assoc['colum_name'];
          $stores->id=$assoc['id'];
         $stores->name=$assoc['name'];
        //and so on for each colum in your table.
        array_push($stores, $assoc);
   }

然后您可以根据需要导出它。 在你的情况下会像

foreach ($stores as $store) echo "<option value='$store->id'>$store->name</option>";

我强烈建议你对http://php.net/manual/en/function.mysql-fetch-array.php采取行动,女巫将使用以列名作为键的数组执行相同的fetch_assoc bu。