将所选日期与 table 列或从 MySQL 查询生成的日期数组进行比较

Compare a selected date against a table column or an array of dates produced from MySQL query

我有一个如下所示的页面:

我想做的是将“假期日期:”选择与其下方 table 中的“日期”列中的行值进行比较。我试过使用这样的代码:

function dateChk(){
        var dt1 = document.getElementById('PHDate').value;
        var dt2 = document.getElementById('phdateadd').value;
            if (dt1 == dt2) {
               alert("This date already assigned, please try again.");
               document.getElementById('phdateadd').value = 0;
         }
 }

但这只适用于第一行。然后我想像这样做数组:

<input id="phdateadd" name="phdateadd" type="date" onchange="myFunction()" required>

<p id="demo"></p>

<script>
var dates= ["2021-01-01", "2021-02-12", "2021-02-13", "2021-04-02", "2021-05-01", 
                        "2021-05-13", "2021-05-14", "2021-05-26", "2021-05-30", "2021-05-31", 
                        "2021-07-06", "2021-07-20", "2021-08-10", "2021-08-31", "2021-09-16", 
                        "2021-10-02", "2021-10-19", "2021-11-04", "2021-12-25"];

function checkDate(date) {
  return date == document.getElementById("phdateadd").value;
}

function myFunction() {
  document.getElementById("demo").innerHTML = dates.find(checkDate);
  var chk = document.getElementById("demo").innerHTML;
  
  if ( chk != "undefined" ) {
        alert("This date already assigned, please try again.");
        document.getElementById("phdateadd").value = 0;}
}
</script>

这确实有效,但我必须将该列中的所有日期指定为数组。我有这样的想法,即从 MySQL 查询传递数据,日期值的格式类似于数组,但它似乎无法识别。这是查询:

SELECT CONCAT('["',GROUP_CONCAT(phdate SEPARATOR '", "'),'"]') As arrdate FROM table1;

which returns

["2021-01-01", "2021-02-12", "2021-02-13", "2021-04-02", "2021-05-01", "2021-05-13", "2021-05-14",
 "2021-05-26", "2021-05-30", "2021-05-31", "2021-07-06", "2021-07-20", "2021-08-10", "2021-08-31",
 "2021-09-16", "2021-10-02", "2021-10-19", "2021-11-04", "2021-12-25"]

所以,我把那个结果显示在页面上:

<% phDates.forEach((phDates, index) => { %>
        <tr><td><p id="phdates" name="phdates" value="<%= phDates.arrdate %>"><%= phDates.arrdate %>
            <% }) %></p><p id="demo" name="demo">b</p><br><p id="demo1" name="demo1">a</p></td></tr>

<script>
var dates = document.getElementById("phdates").innerHTML;
        document.getElementById("demo").innerHTML = dates;
</script>

如您所见,来自 MySQL 查询的 arrdate 值和 demo 显示的格式相似。当我在 var dates 中指定数组时, demo 值不同(如我上面的代码片段):

如果我特意把MySQLreturn的数据弄成上面的样子,虽然它还是不识别。我想如果这个方法可行,我什至不需要将所选日期与 table 中的列进行比较。我使用 $( "div" ).toArray() 进行了测试,但我也无法正常工作。

我认为这对我来说可能是直接的解决方案,但我想知道如何格式化 MySQL 结果值以符合正确的 javascript 数组格式?或者保留 MySQL 输出原样并将该值转换为 javascript 数组兼容值。我忍不住认为解决方案可能很简单,但我一直在寻找几天,但我没有找到任何解决方案。

实际上有一个直接的解决方案。让我们从您的查询开始我们的思考过程,这离解决方案不是很远(这还不是很好,但已经足够接近从它开始我们的思考过程):

SELECT CONCAT('["',GROUP_CONCAT(phdate SEPARATOR '", "'),'"]') As arrdate FROM table1;

您打算在此处将您的数据转换为类似 JSON 的字符串。当然,您可以调用 JSON.parseeval 并为此结果赋值,但我推荐一种更优雅的方法:

SELECT GROUP_CONCAT(phdate SEPARATOR ',') As dates FROM table1;

以上将包含一个字符串,日期以逗号分隔。假设你将它放入一个名为 myDates 的 JS 变量中,你可以调用:

myDates.split(",")

let myDates = '2021-01-13,2021-02-02,2021-03-04'; //results from db

console.log(myDates.split(','));

在 SQL 的 WHERE 子句中生成其中一个:

arrdate IN ("2021-01-01", "2021-02-12", "2021-02-13")

FIND_IN_SET(arrdate, "2021-01-01,2021-02-12,2021-02-13")

第一个的表现可能受益于一个suitableINDEX;第二个不会。

如果您尝试检查是否在第二组日期中的任何一个中找到多个日期(或其他值)中的任何一个——这在 MySQL 中不直接可用。将一个列表(或另一个列表)拆分为 table 中的行,然后使用 INFIND_IN_SET().

或使用应用程序代码。