【问题标题】:Dates fetched using ajax but not highlighted in Jquery UI datepicker, PHP使用 ajax 获取但未在 Jquery UI datepicker、PHP 中突出显示的日期
【发布时间】:2022-01-14 01:13:14
【问题描述】:

我正在使用 Jquery datepicker 来突出显示特定日期。日期是从 PHP 和 MySQL 的数据库中获取的。将根据选择标签中的选定值获取日期。日期已成功获取并显示在控制台中。

如果我直接获取脚本中的所有日期,那么它会显示突出显示的日期。但是当我使用 select 标签并通过 ajax 发送选定的值时,它不会。

jquery:

<script>
    $(function() {
        // An array of dates
        var eventDates = {};

        $("#select").on("change", function() {
            var truck = $(this).val();

            $.ajax({
                url: 'ajax/vehicledate.php',
                type: "POST",
                /*contentType: "application/json; charset=utf-8",*/
                data: {
                    val: truck
                },
                success: function(data) {
                    console.log(data);
                }
            });

            // datepicker
            $('#start').datepicker({

                dateFormat: "yy-mm-dd",

                beforeShowDay: function(date) {
                    var highlight = eventDates[date];
                    if (highlight) {
                        return [true, "event", 'Tooltip text'];
                    } else {
                        return [true, '', ''];
                    }
                }
            });
        });
    });
</script>

Jquery 获取所有日期

 <script>
    $(function() {
        // An array of dates
        var eventDates = {};

        <?php        

            $sql = "SELECT * from `ut_trips` WHERE `deisel` > 0";

            $result = $connect->query($sql);   

            while( $final=$result->fetch_assoc() ) 
            {

            ?>

            eventDates[new Date('<?php 
            $orgDate = date($final['date']);
            $date = str_replace('-"', '/', $orgDate);  
            $newDate = date("Y/m/d", strtotime($date));  
            echo $newDate   ?>')] = new Date(
            '<?php $orgDate =date($final['date']); 
            $date = str_replace('-"', '/', $orgDate);  
            $newDate = date("Y/m/d", strtotime($date));  
            echo $newDate  
            ?>'
            );

            <?php

            }

            ?>

            // datepicker
            $('#start').datepicker({

                dateFormat: "yy-mm-dd",

                beforeShowDay: function(date) {
                    var highlight = eventDates[date];
                    if (highlight) {
                        return [true, "event", 'Tooltip text'];
                    } else {
                        return [true, '', ''];
                    }
                }
            });
        });
    });
</script>

ajax PHP 文件

<?php

include("../partials/connect.php");

$v = $_POST['val'];

$sql = "SELECT * from `table` WHERE `value1` > 0 AND `value2` = '".$v."'";

$result = $connect->query($sql);   

while( $final=$result->fetch_assoc() ) 
{

?>

eventDates[new Date('<?php 
$orgDate = date($final['date']);
$date = str_replace('-"', '/', $orgDate);  
$newDate = date("Y/m/d", strtotime($date));  
echo $newDate   ?>')] = new Date(
'<?php $orgDate =date($final['date']); 
$date = str_replace('-"', '/', $orgDate);  
$newDate = date("Y/m/d", strtotime($date));  
echo $newDate  
?>'
);

<?php

}

?>

控制台输出

eventDates[new Date('2021/11/10')] = new Date(
'2021/11/10'
);


eventDates[new Date('2021/11/12')] = new Date(
'2021/11/12'
);


eventDates[new Date('2021/11/13')] = new Date(
'2021/11/13'
);

更新:

以 jason 格式回显日期

echo jason_encode($newDate);

jQuery

 dataType: "json",
 success: function(data) {
            console.log(data);
            return data;
 }

using dataType: "json" 在控制台中不输出任何内容,如果我将其注释掉,它将在 colsole 中输出 eventDates[new Date('2021\/11\/12')] = new Date( '2021\/11\/12' );

【问题讨论】:

  • 除了将其记录到控制台之外,您没有对 AJAX 调用的响应做任何事情。它永远不会靠近您的日期选择器。输出作为字符串保留在data 中。让你的 PHP 输出 data(例如 JSON 格式)而不是 code,这样你就可以将数据从你的“成功”函数传递给 datepicker。重要的是要记住,AJAX 请求不会直接导致您的网页被更新,它们只是将响应接收回 JS 变量中,然后由您编写一些 JS 代码来处理该响应,然后使用它你想。
  • @ADyson 所以,我在 PHP 文件中定义了 dataType: "json" 并将日期回显为 json_encode($newDate)。但它也不会在控制台中输出任何内容。以及我应该使用什么来代替 concole.log 成功传递数据。
  • 请注意,来自 AJAX 文件的查询极易受到 SQL 注入攻击。另外,您尝试过什么来解决问题?这是JS问题,PHP问题,还是MySQL问题?
  • @NicoHaase 问题已解决。将日期传递给 datepicker 是一个 ajax 问题。

标签: javascript php jquery mysql jquery-ui-datepicker


【解决方案1】:

我可以看到更新显示的最佳方法在日历已经呈现之后是使用the refresh method。如何突出显示新日期?您可以通过将新日期添加到现有的 eventDates 集合中来做到这一点,然后只需刷新整个日历 - beforeShowDay 将处理新的、更新的 eventDates 集合,并且您的新日期将被突出显示。

请参阅下面的 sn-p 以获取工作示例。

但首先,您的代码对 SQL 注入开放!首先立即修复此问题,例如 How can I prevent SQL injection in PHP? 它应该很简单,例如可能是这样的:

include("../partials/connect.php");
$sql = "SELECT * from `table` WHERE `value1` > 0 AND `value2` = ?";
$stmt = $connect->prepare($sql);   
$stmt->bind_param('s', $_POST['val']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // ... etc, some tips below

好的,开始 Javascript。一些注意事项和建议:

  1. 目前您正在选择更改处理程序中初始化日期选择器。这意味着每次更改选择时,您都会重新初始化日期选择器。您不应该这样做 - 初始化一次,独立于任何用户交互。

  2. 我不确定我是否理解您为什么以这种方式构建eventDates。至少根据您在此处显示的代码/要求,它作为一个简单的数组会简单得多,例如:

    // An array of dates
    var eventDates = [
        "2021/12/01",
        "2021/12/02",
        "2021/12/03",
    ];
    

    我在下面的 sn-p 中使用了这个作为我的演示代码。

  3. 在您的 AJAX 调用中,您使用 val: selectvalue 传递了一个值 - 但 selectvalue 似乎没有在任何地方定义。不过,您确实已经找到了选定的值 - truck。这就是您要发送的值。

  4. Convention is POST 用于更改数据(例如进行购买、更新记录),而 GET 用于读取数据。你只是在加载一些日期数据,所以这真的应该是一个 GET。我建议坚持约定并更新您的后端以响应 GET 而不是 POST。

  5. 一旦您收到来自 AJAX 调用的新日期,您需要将它们添加到现有的 eventDates 集合中。如果eventDates 是上面建议的简单数组,那很容易(至少如果你是search SO for answers!):eventDates.push(...newDates);更新来自 cmets 的讨论,新日期实际上应该完全取代现有日期:eventDates = newDates;

  6. 最后,刷新整个日历:$('#start').datepicker("refresh");

总而言之,这是一个工作演示:

$(function() {
    // An array of dates - dummy data for demo
    var eventDates = [
        "2021/12/01",
        "2021/12/02",
        "2021/12/03",
    ];

    // Initialise datepicker - once
    $('#start').datepicker({
        dateFormat: "yy-mm-dd",
        beforeShowDay: function(date) {
            // date is a JS date, we want to compare it to the dates
            // in eventDates, so we need to format it.  Datepicker has
            // a handy utility for formatting dates, see
            // https://api.jqueryui.com/datepicker/#utility-formatDate
            var formatted = $.datepicker.formatDate('yy/mm/dd', date);

            // Easy way to check if a value is in an array
            if (eventDates.indexOf(formatted) === -1) {
                return [true, '', ''];
            } else {
                return [true, "event", 'Tooltip text'];
            }
        }
    });

    $("#select").on("change", function() {
        // Can't do AJAX here, but we can write the success method, and 
        // just use a hard-coded set of results.  Say your AJAX returns
        // a new set of dates, as an array:
        var data = [
            "2021/12/24",
            "2021/12/25",
            "2021/12/26",
        ];
        
        // To merge existing dates with new dates
        // eventDates.push(...data);

        // To show only new dates:
        eventDates = data;

        // So new eventDates is updated with the new dates, we want
        // to reresh the whole calendar.
        $('#start').datepicker("refresh");
        
        // Done!  To be clear, your AJAX success would look like this:
        // success: function(data) {
        //    eventDates.push(...data);
        //    $('#start').datepicker("refresh");
        // }
    }); 
});
.event {
    background-color: red;
}
<link href="https://code.jquery.com/ui/1.13.0/themes/base/jquery-ui.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.0/jquery-ui.min.js"></script>
<input id="start" type="text">

<select id="select">
    <option>Change me</option>
    <option value="foo">Foo</option>
    <option value="bar">Bar</option>
</select>

对于你的 PHP,假设你已经修复了前面描述的 SQL 注入问题,你需要返回一个 JSON 数组。我无法真正弄清楚您现有的代码在做什么 - $final['date'] 是什么格式?为了演示如何创建和返回数组,我假设它实际上是正确格式的日期。根据需要进行调整。

// Define the empty array we will return.
$eventDates = [];

// Iterate over your query results ...
while ($final = $result->fetch_assoc()) {
    // ... adding each date to the array, let's say $final['date'] is 
    // formatted like 2021/12/25
    $eventDates[] = $final['date'];
}

// We want to return JSON, so jQuery can read it
header('Content-Type: application/json; charset=utf-8');
echo json_encode($eventDates);

【讨论】:

  • 感谢您的帮助,它可以工作,但我不想将新日期附加到旧日期。当我从选择标签中选择值时,日期应替换为新日期。我该怎么做?
  • "日期应该替换为新日期" - 应该替换什么日期? “替换”到底是什么意思?
  • 目前,当我选择该值时,它会返回 datepicker 中的日期。但是,当我选择另一个值时,日期会显示在 datepicker 中,但也会显示为先前选择的值获取的先前日期。我正在尝试仅获取和显示所选值的日期。
  • 如果我理解正确,您的意思是选择新日期后,从 AJAX 返回的任何内容都应在日历上突出显示,仅此而已?在这种情况下,您无需组合 2 个 eventDates 数组,而是将其替换为新日期,对吧?
  • 我已经更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2012-04-27
  • 2013-04-10
  • 2012-12-11
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多