【问题标题】:Filter through SQL query and populate <select>通过 SQL 查询过滤并填充 <select>
【发布时间】:2016-04-20 09:04:47
【问题描述】:

下面的代码运行并填充一个下拉列表。第二个、第三个和第四个查询也填充了一个下拉列表,只是在这个例子中没有。 我想采用第一个下拉列表中选择的内容并过滤其他 3 个中的数据。 这是PHP:

<?php
require_once('conn.php');
include '_menu.php';

//Get Processes
$smt = $stamp->prepare('SELECT tblProcess.PID, tblProcess.pName
                    FROM tblProcess
                    WHERE tblProcess.pActive=1
                    ORDER BY tblProcess.pOrder');
$smt->execute();
$data = $smt->fetchAll();

//Get Categories
$smt1 = $stamp->prepare('SELECT tblCategory.CID, tblCategory.PID, tblCategory.cName
                    FROM tblCategory
                    WHERE (((tblCategory.cActive)=1))
                    ORDER BY tblCategory.cOrder;');
$smt1->execute();
$data1 = $smt1->fetchAll();

//Get SubCategories
$smt2 = $stamp->prepare('SELECT tblCategorySub.CSID, tblCategorySub.CID, tblCategory.PID, tblCategorySub.csName
                    FROM tblCategory INNER JOIN tblCategorySub ON tblCategory.CID = tblCategorySub.CID
                    WHERE (((tblCategorySub.csActive)=1))
                    ORDER BY tblCategorySub.csOrder;');
$smt2->execute();
$data2 = $smt2->fetchAll();

//Get Cause
$smt3 = $stamp->prepare('SELECT tblCause.CauseID, tblCause.caName
                    FROM tblCause
                    WHERE (((tblCause.caActive)=1))
                    ORDER BY tblCause.caSortOrder');
$smt3->execute();
$data3 = $smt3->fetchAll();
?>

这是填充一个下拉列表的 HTML。我只包括一个来缩短这个问题。

<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

    <link type="text/css" rel="stylesheet" href="stylesheet.css"/>  
     <script src="../script/_DDDisable.js"></script>
    <title></title>
</head>
<body>
    <div id="header">
        <p id="name">STAMPING TROUBLE REPORT</p>
        <a href="mailto:you@yourdomain.com"><p id="email"></p></a>
    </div>
    <div class="right">
        <h5>Process&nbsp&nbsp&nbsp<select class="form-control" name="Process" id="Process">
            <option value="select">--Select Process--</option>
            <?php foreach ($data as $row): ?>
                <option value=$row[PID]><?=$row["pName"]?></option>
            <?php endforeach ?></select></h5>
    </div>
</body>

【问题讨论】:

    标签: php jquery sql


    【解决方案1】:

    像这样创建您的 HTML 标记,data-belongsto 属性告诉我们我们的值应该填充到 DOM 中的哪个下拉列表。我们将在switch 语句中将ID 发送到服务器以获取用例。

    <select class="form-control" name="Process" id="Process" data-belongsto="Category">
    
    
    $('select.form-control').on('change', function(e){
        e.preventDefault();
    
        //cacheable reference to our select
        var $this = $(this);
        $.ajax({
            url: '/path/to/my/file.php',
            type: 'POST',
            data: {
                'request_type'  : $this.prop('id'),
                'request_value' : $this.val()
            },
            dataType: 'json',
            success: function(response){
                //loop over our response and append to the `belongsto` we defined earlier
                $.each(response.option, function(i,opt){
                    $('#'+$this.data('belongsto').append('<option value="'+opt.PID+'"> '+opt.pName+'</option>');
                });
            }
        });
    });
    

    然后在您的文件中使用默认值执行 switch 语句。我们假设process 总是首先运行。

    if(!isset($_POST['request_type']){
        //Get Processes
        $smt = $stamp->prepare('SELECT tblProcess.PID, tblProcess.pName
                        FROM tblProcess
                        WHERE tblProcess.pActive=1
                        ORDER BY tblProcess.pOrder');
        $smt->execute();
        $data = $smt->fetchAll();
    
    } elseif(isset($_POST['request_type']) && isset($_POST['request_value'])) {
        switch($_POST['request_type']):
            case 'Categories':
    
               //Get Categories
               $smt1 = $stamp->prepare('SELECT tblCategory.CID, tblCategory.PID, tblCategory.cName
                        FROM tblCategory
                        WHERE (((tblCategory.cActive)=1))
                        ORDER BY tblCategory.cOrder;');
               $smt1->execute();
               $data = $smt1->fetchAll();
               break;
    
            case 'SubCategories':
               //Get SubCategories
               $smt2 = $stamp->prepare('SELECT tblCategorySub.CSID, tblCategorySub.CID, tblCategory.PID, tblCategorySub.csName
                        FROM tblCategory INNER JOIN tblCategorySub ON tblCategory.CID = tblCategorySub.CID
                        WHERE (((tblCategorySub.csActive)=1))
                        ORDER BY tblCategorySub.csOrder;');
               $smt2->execute();
               $data = $smt2->fetchAll();
    
            case 'Cause':
    
                //Get Cause
                $smt3 = $stamp->prepare('SELECT tblCause.CauseID, tblCause.caName
                        FROM tblCause
                        WHERE (((tblCause.caActive)=1))
                        ORDER BY tblCause.caSortOrder');
                $smt3->execute();
                $data = $smt3->fetchAll();
                break;
        endswitch;
    
        //exit to make sure nothing else is sent back that would alter our json response types validity
        echo json_encode($data, true); exit();
    }
    

    现在只需修改您的 SQL 语句以检查它们各自的 $_POST['request_value'] 就可以了。

    【讨论】:

    • 在你的 jQuery 中,当出于某种原因你选择一个选项而不是另一个选项时,你将总是将选项附加到下一个选择,而且附加很多比附加/连接更多的性能成本一个字符串,这让我说用 html 标记填充一个变量,而不是在循环结束时将选择内容设置为变量的内容
    • @Ohgodwhy,我有点困惑为什么你说我需要修改我的 SQL 语句,因为他们已经检查了它们的值。
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2019-03-23
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多