【问题标题】:Jquery/AJAX populated HTML form when dropdown selected选择下拉列表时,Jquery/AJAX 填充 HTML 表单
【发布时间】:2014-10-17 07:07:52
【问题描述】:

我正在尝试在我的页面上填充表单。填充表单所需的信息是使用下拉选项的 ID 作为 SQL 语句中的 ID 从 MySQL 数据库中提取的。我在想我可以将信息存储在 $_SESSION['formBookings'] 中,并在刷新时填充表单(这已经发生,因为我在提交后使用会话变量填充表单。

我不能在表单上附加提交按钮,因为我已经有一个,而老板不想要另一个。我希望表单最终在选择选项时自动刷新页面。如果 SQL 语句中的数据已存储在会话数组中,则将填充表单。

这是我目前所拥有的:

jQuery:

<script>
$(document).ready(function(){
    $('select[name=recall]').on('change', function() {var recall = $(this).val() 
    //$(function () 
      //{
        //-----------------------------------------------------------------------
        // 2) Send a http request with AJAX http://api.jquery.com/jQuery.ajax/
        //-----------------------------------------------------------------------
        $.ajax({                                      
          url: 'recall.php',                  //the script to call to get data          
          data: "recall: recall",             //you can insert url argumnets here to pass to api.php
                                           //for example "id=5&parent=6"
          dataType: 'json',                //data format      
          success: function(data)          //on recieve of reply
          {
            var id = data[0];              //get id
            var vname = data[1];           //get name
            //--------------------------------------------------------------------
            // 3) Update html content
            //--------------------------------------------------------------------
            $('div#box1').load('DFBristol.html');//html("<b>id: </b>"+id+"<b> name: </b>"+vname); //Set output element html
            //recommend reading up on jquery selectors they are awesome 
            // http://api.jquery.com/category/selectors/
          //} 
          });
        });
      });
    });
</script>

HTML:

<select name='recall' id='recall'>
                    <option selected></option>
                        <?php
                            session_start();
                            $user = 'root';
                            $pass = '';

                            $DBH = new PDO('mysql:host=localhost;dbname=nightlineDB;', $user, $pass);
                            $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                            $DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

                            $recall = $DBH->prepare('SELECT * FROM bookings WHERE dateInputted >= now() - INTERVAL 2 DAY');
                            $recall->execute();
                            $recallResult = $recall->fetchALL(PDO::FETCH_ASSOC);

                            foreach ($recallResult as $key) {
                                echo '<option id='.$key["ID"].'>'.$key['ID'].' - '.$key['branch'].' - '.$key['title'].' '.$key['firstName'].' '.$key['lastName'].'</option>';
                            }
                        ?>
                    </select><br />

SQL 文件(recall.php):

<?php
$user = 'root';
$pass = '';

$DBH = new PDO('mysql:host=localhost;dbname=nightlineDB;', $user, $pass);
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$recall = $DBH->prepare("SELECT * FROM bookings WHERE ID = '%$recall%'");
$recall->execute();
$recallFormResult = $recall->fetchALL(PDO::FETCH_ASSOC);

echo json_encode($recallFormResult);

?>

我尝试使用 data 参数将变量 'recall' 从 jquery 传递到 SQL 语句,但没有任何反应。

有人可以帮助我了解我做错了什么以及如何解决它。

【问题讨论】:

    标签: javascript php jquery mysql ajax


    【解决方案1】:

    到目前为止,您发布的代码似乎存在两个问题:

    AJAX 请求

    即使$.ajax() defaults to a request type of GET by default,指定它也很好。您的请求中还存在语法错误 — 您已使用 }); 关闭了 success 回调,而它应该是 }

    $.ajax({                                      
        url: "recall.php",
        data: {
            recall: recall
        },
        type: "GET",               // Declare type of request (we use GET, the default)
        dataType: "json",
        success: function(data)
        {
            var id = data[0];
            var vname = data[1];
            $('div#box1').load('DFBristol.html');
        }                         // The problematic closure
    });
    

    更好的是:不要使用已弃用的 jqXHR.success() 函数,而是使用 .done() 承诺对象,即:

    $.ajax({                                      
        url: "recall.php",
        data: {
            recall: recall
        },
        type: "GET",               // Declare type of request (we use GET, the default)
        dataType: "json"
    }).done(function() {
        // Success
        var id = data[0],
            vname = data[1];
        $('div#box1').load('DFBristol.html');
    });
    

    修复文件recall.php

    当您向recall.php 发出 AJAX GET 请求时,该文件需要知道您打算传递哪些变量,而这些变量您尚未定义。您可以使用$_GET[] (see doc) 来做到这一点,即:

    <?php
    // Assign the variable $recall with the value of the recall query string from AJAX get request
    // I recommend doing a check to see if $_GET['recall'] is defined, e.g.
    // if($_GET['recall']) { $recall = $_GET['recall']; }
    $recall = $_GET['recall'];
    
    // The rest of your script, unmodified
    $user = 'root';
    $pass = '';
    
    $DBH = new PDO('mysql:host=localhost;dbname=nightlineDB;', $user, $pass);
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    $recall = $DBH->prepare("SELECT * FROM bookings WHERE ID = '%$recall%'");
    $recall->execute();
    $recallFormResult = $recall->fetchALL(PDO::FETCH_ASSOC);
    
    echo json_encode($recallFormResult);
    ?>
    

    注意:但是,如果您选择发出 POST 请求,那么您应该改用 $_POST[] (see doc) :)

    【讨论】:

    • 您好特里,感谢您的快速回复。我无法让您的代码做任何事情。如果没有提交按钮,GET 如何接收任何内容?目前我已经做出了你建议的更改,但是,#box1 div 没有被填充。
    • 我意识到您的data 应该是"recall: "+recall",因为您正在传递一个变量。 AJAX 不需要处理表单提交。检查您的浏览器控制台。你看到什么错误信息?还要检查您的 HTTP 标头,并查看 recall.php 文件是否被正确引用/调用。
    • 我对此进行了调整,但什么也没有,我在控制台中没有收到任何错误,并且地址栏没有任何对recall.php 的引用。 #box1 的内容不会改变。这是更改后的行 - data: 'recall: "+recall"',
    • 好的,我可能发现了一个问题,我发现一条通知指出“recall”是“recall.php”中的一个未识别索引
    • 不,您不要用引号将变量 recall 括起来。只是data: "recall="+recall。也许您可以将data 声明为对象,即:data: { recall: recall}
    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多