2 votes

Comparez une date sélectionnée avec une colonne de table ou un tableau de dates produit par une requête MySQL.

J'ai une page qui ressemble à ceci : enter image description here

Ce que j'essaie de faire, c'est de comparer la sélection "Date des vacances :" avec les valeurs des lignes dans les colonnes "Date" du tableau situé en dessous. J'ai essayé d'utiliser un code comme celui-ci :

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;
         }
 }

Mais cela ne fonctionne que sur la première ligne. J'ai alors pensé à faire un tableau comme :

<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>

Cela fonctionne, mais je dois spécifier toutes les dates de cette colonne sous forme de tableau. J'ai l'idée de passer des données à partir d'une requête MySQL avec les valeurs de date formatées de manière similaire au tableau, mais cela ne semble pas être reconnu. Voici la requête :

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"]

Donc, j'ai pris ce résultat et je l'ai montré dans la page :

<% 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>

enter image description here

Comme vous pouvez le constater arrdate qui vient de la requête MySQL et demo présente un format similaire. Le site demo est différente lorsque je spécifie le tableau dans var dates (comme dans mon extrait ci-dessus) : enter image description here

Si je fais en sorte que le MySQL renvoie les données comme ci-dessus, il ne les reconnaît toujours pas. Je pense que si cette méthode est viable, je n'ai même pas besoin de comparer la date sélectionnée à la colonne de la table. J'ai fait un test en utilisant $( "div" ).toArray() mais je n'arrive pas non plus à le faire fonctionner.

Je pense que cela pourrait être la solution directe pour moi, mais je me demande comment formater la valeur du résultat MySQL pour qu'elle corresponde au format correct du tableau javascript ? Ou laisser la sortie MySQL telle quelle et convertir cette valeur en une valeur compatible avec le tableau javascript. Je ne peux m'empêcher de penser que la solution pourrait être simple mais cela fait deux jours que je cherche et je n'en ai pas trouvé.

1voto

Lajos Arpad Points 5986

En fait, il existe une solution simple et directe. Commençons notre réflexion à partir de votre requête, qui n'est pas très éloignée de la solution (ce n'est pas encore bon, mais c'est suffisamment proche pour que nous commencions notre réflexion à partir de celle-ci) :

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

Il s'agit ici de convertir vos données en une chaîne de caractères de type JSON. Naturellement, vous pourriez appeler JSON.parse ou eval avec affectation de valeur sur ce résultat, mais je recommande une méthode beaucoup plus élégante :

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

L'exemple ci-dessus contient une chaîne de dates séparées par une virgule. En supposant que vous obtenez ceci dans une variable JS appelée myDates, vous pouvez juste appeler :

myDates.split(",")

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

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

0voto

Rick James Points 15994

Générer l'un ou l'autre dans le WHERE de SQL :

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

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

La performance de la première mai bénéficier d'une INDEX le second ne le fera pas.

Si vous essayez de vérifier si l'une de plusieurs dates (ou une autre valeur) se trouve dans l'une d'un deuxième ensemble de dates -- Ceci n'est pas directement disponible dans MySQL. Divisez une liste (ou l'autre liste) en lignes dans une table, puis utilisez la fonction IN ou FIND_IN_SET() .

Ou utilisez le code d'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X