使用 AJAX、PHP 和 MySQL 链式填充 HTML 选择框

Posted

技术标签:

【中文标题】使用 AJAX、PHP 和 MySQL 链式填充 HTML 选择框【英文标题】:Chain populate HTML select boxes using AJAX, PHP and MySQL 【发布时间】:2015-08-28 21:59:52 【问题描述】:

我的特殊表单有两个选择框。在页面加载阶段,我使用 phpmysql 数据库中填充了第一个选项。

我接下来要实现的目标如下:

通过从第一个预填充的 <select> 框中选择一个值 - 第二个 <select> 框将根据在第一个 <select> 框中选择的选项填充数据库表中的相关数据。

因此,如下图所示,如果我从第一个 <select> 框中选择一个位置,那么第二个 <select> 框中将填充该位置的所有套房。

我的数据库已经准备好所有数据并设置了关系。我已经在数据库端测试了我的 SQL 查询并且它们可以工作。现在我需要将它们全部放入一个 PHP 脚本中,该脚本将通过表单中的 AJAX 调用来调用。

到目前为止,我所做的是尝试将 $.ajax 请求从该表单发送到名为 jQueryHelper.php 的 PHP 脚本,然后该脚本应返回套件,我将在开始时使用 alert()

jQueryHelper.php:

<?php
define("DB_HOST", "127.0.0.1");
define("DB_NAME", "mydb");
define("DB_USER", "root");
define("DB_PASS", "**********");

class jQueryHelper

    private static $initialized = false;
    private $db_connection = null;

    private static function initialize()
    
        if (self::$initialized)
            return;
        $this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        self::$initialized = true;
    

    public static function giveData()
    
        self::initialize();
        if (!$this->db_connection->set_charset("utf8")) 
            $this->errors[] = $this->db_connection->error;
        
        if (!$this->db_connection->connect_errno) 
                if(isset($_POST['action']) && !empty($_POST['action']))
                    $action = $_POST['action'];
                    $theSelectedLocationId = $_POST['id'];
                    switch($action)
                        case 'getAssignedSuites': 
                            $this->getAssignedSuites($theSelectedLocationId);
                            break;
                    
                
        
    

    public static function getAssignedSuites($theSelectedLocationId)
        $sql =<<<EOF
            SELECT * FROM suites
            WHERE location_id = $theSelectedLocationId
EOF;

        $query_get_assigned_suites = $this->db_connection->query($sql);
        $rows = array();
        while($r = mysqli_fetch_assoc($query_get_assigned_suites))
            $rows[] = $r;
        
        echo json_encode($rows);
    


// Call it!
jQueryHelper::giveData();
?>

html 表单:

<form method="post" action="user_todays_locations.php" name="updatetodayslocation" role="form">
    <div class="form-group">
        <label for="suite_location" class="sr-only">Assigned Locations</label>
        <select size="1" name="suite_location" class="form-control input-lg" required>
            <option value="" selected="selected" disabled>Assigned Locations</option>
            <?php $location->getAssignedLocations($login->getCurrentUserID()); ?>
        </select>
    </div>
    <!-- more divs and form controls here -->
</form>

jQuery的$.ajax(位于&lt;body&gt;上方&lt;form&gt;):

<script>
// grab ID of selected location
$(function() 
    $("select[name=suite_location]").change(function() 
        var theSelectedLocationId = this.value;
        //alert(theSelectedLocationId);
        $.ajax( url: '/classes/jQueryHelper.php',
            data: action: 'getAssignedSuites', id: theSelectedLocationId,
            type: 'post',
            success: function(output) 
                alert(output);
            ,
            error: function(jqXHR, textStatus, errorThrown) 
                if (jqXHR.status === 0) 
                    alert('Not connect.\n Verify Network.');
                 else if (jqXHR.status == 404) 
                    alert('Requested page not found. [404]');
                 else if (jqXHR.status == 500) 
                    alert('Internal Server Error [500].');
                 else if (exception === 'parsererror') 
                    alert('Requested JSON parse failed.');
                 else if (exception === 'timeout') 
                    alert('Time out error.');
                 else if (exception === 'abort') 
                    alert('Ajax request aborted.');
                 else 
                    alert('Uncaught Error.\n' + jqXHR.responseText);
                
            
        );
);
</script>

jQuery 的 &lt;select&gt; .change 事件触发没有问题,我收到一个带有所选选项值的警报(在我的情况下,它是数据库中位置的 ID)。 $.ajax 部分嵌套更深,不想工作。 整个网站都存储在 LAMP 服务器上。整个网站在里面:/mywebsites/project/www/ 该表单位于views 文件夹中,该文件夹与其他视图一起包含在根级别的脚本中以显示完整页面。 jQueryHelper.phpclasses 文件夹内。

我不知道,也许有更简单的方法来做到这一点。

【问题讨论】:

看起来getAssignedSuites() 只是做了一个return json_encode($rows);。你没有回声或打印。可能是echo jQueryHelper::giveData(); @Sean 将其更改为 echo。还是没有骰子。 我还添加了error 事件和success 来测试它,事实上,每当我为第一个&lt;select&gt; 框调用change 事件时,我都会不断触发error 事件。跨度> 我进一步更新了错误事件。每当我触发它时,我都会看到Requested page not found. [404] 警报框。 如果您收到404,那么您需要检查您的浏览器控制台以查看您的$.ajax() 调用的网址。你在你的 LAMP 服务器上查看它,而不仅仅是本地文件,对吗? 【参考方案1】:

AJAX 调用找不到 jQueryHelper.php。 将 url/classes/jQueryHelper.php 更改为 classes/jQueryHelper.php 修复了路径问题。

【讨论】:

【参考方案2】:

在你的 switch 块中,你不应该返回从getAssignedSuites 调用返回的结果吗?

switch($action)
  case 'getAssignedSuites': 
    return $this->getAssignedSuites($theSelectedLocationId);
    break;

然后按照@sean 的建议。 echo jQueryHelper::giveData();

还有。我认为在类函数中调用$_POST 不是一个好习惯。我建议将它们作为jQueryHelper::giveData($_POST['action'], $_POST['id']) 之类的参数传递,然后使用它。

【讨论】:

我不这么认为。当我$this-&gt;getAssignedSuites($theSelectedLocationId); 执行 getAssignedSuites() 时,它又返回/回显结果。无论如何,我也尝试过,但我仍然收到显示Requested page not found. [404] 的 AJAX 错误。请参阅更新的 &lt;script&gt; 以了解改进的错误事件。 嗯。让我们先解决这个问题。您的 view.php 和 jQueryHelper.php 是否在不同的文件夹中,这就是您将 url 路径指定为“/classes/jQueryHelper.php”的原因吗?因为,'/~path' 是从根目录调用文件路径。

以上是关于使用 AJAX、PHP 和 MySQL 链式填充 HTML 选择框的主要内容,如果未能解决你的问题,请参考以下文章

填充下拉列表 - PHP Ajax MySQL

jQuery 使用 jQuery ajax json、php 将项目填充到 Select 中

jquery - 如何使用通过 AJAX 从 MySQL 和 PHP 检索的数据将图像添加到 Select2 下拉列表?

如何使用 ajax、php 和 html 填充一个下拉列表

php mysql jquery ajax 查询数据库三级联动

使用 JQUERY、AJAX 和 PHP 填充选择框