0

I am working on an "advanced search" feature for my website. I have ran into a road block with javascript that I am trying to overcome, so any help would be greatly appreciated.

Once the user starts to input information in any input field in the <div class='bottom'> section, I want to send a JSON object to the page "SQL.php" with the values of the inputs so the SQL.php page can use PHP to process this JSON data.

Some examples:

  • The assignStatus view would send data like {"assID":130, "status":"graded"}
  • The assignScore view would send data like {"operator":"=", "number":10, "type":"points" "assID":145}
  • The attendance view would send data like {"status":"graded", "date":"2021-11-13"}

I have successfully passed along strings using GET, but I decided to use JSON for the other data since each 'view' requires different amounts of data to execute a search (IE: assignStatus requires 2 pieces of data and assignScore requires 4 pieces of data).

How should I go about making this work?

  var results = document.getElementById("results");

  function search(str){
    var group = document.getElementById("group").value;
    var classs = document.getElementById("class").value;
    var view = document.getElementById("view").value;

     fetch("SQL.php?group=" + group + "&class=" + classs + "&view=" + view).then((response) =>response.text()).then((text) => {
          var parser = new DOMParser();
          var doc = parser.parseFromString(text, "text/html");
          var ele = doc.documentElement;
          var scripts = ele.getElementsByTagName('script');
          for(var script of scripts){
              var head = document.getElementsByTagName('head')[0];
              var scriptElement = document.createElement('script');
              scriptElement.setAttribute('type', 'text/javascript');
              scriptElement.innerText = script.innerText;
              head.appendChild(scriptElement);
              head.removeChild(scriptElement);
         }
         document.getElementById("results").innerHTML=text;
        });
  }
  
  
  function nav(arg) {
  
    var destination = arg.value;
    var pages = document.querySelectorAll("[data-page]");

    for (i = 0; i < pages.length; i++) { // Hide/show the correct pages
      if (pages[i].dataset.page != destination) {
        pages[i].hidden = true;
      } else {
        pages[i].hidden = false;
      }
    }
  }
<html>
  <head>
    <title>Advanced Search</title>
  </head>

  <body>
    <div class='top'>
      Select <select id='group' name='group' onchange='search();'>
        <option value='all'>all students</option>
        <option value='random'>one random student</option>
      </select>
      from
      <select id='class' name='class' onchange='search();'>
        <option value='all'>all classes</option>
        <option value='1'> Reading/Social</option>
        <option value='2'> Reading/Social</option>
        <option value='3'> Reading/Social</option>
        <option value='4'> Reading/Social</option>      
      </select>
      based on <select id='view' name='view' onchange='nav(this); search();'>
        <option value='' disabled selected>-- select option --</option>
        <option value='assignStatus'>assignment completion</option>
        <option value='assignScore'>assignment score</option>
        <option value='attendance'>attendance by day</option>
        <option value='statSubject'>subject performance</option>
        <option value='statOther'>other statistic</option>
      </select>.
    </div>

    <div class='bottom'>

      <div class='assignStatus' data-page='assignStatus' hidden>
        Whose assignment
        <select name='assID'>
          <option value='130'> BOTR Questions 13/14</option>
          <option value='145'> Flocab: Text Structure</option>
        </select>
        is
        <select name='status'>
          <option selected disabled>--Select--</option>
          <option value='submitted'>submitted</option>
          <option value='unsubmitted'>not submitted</option>
          <option value='graded'>graded</option>
          <option value='unassigned'>not assigned</option>
        </select>.
      </div>

      <div class='assignScore' data-page='assignScore' hidden>
        Who scored
        <select name='operator'>
          <option value='<'>less than</option>
          <option value='>'>greater than</option>
          <option value='='>equal to</option>
        </select>
        <input type='number'>
        <select name='type'>
          <option value='percent'>percent</option>
          <option value='points'>points</option>
        </select>
        on the
        <select name='assID'>
          <option value='130'> BOTR Questions 13/14</option>
          <option value='145'> Flocab: Text Structure</option>
        </select>
        assignment.
      </div>

      <div class='attendance' data-page='attendance' hidden>
        Where student was
        <select name='status'>
          <option value='absent'>absent</option>
          <option value='present'>present</option>
          <option value='quarantined'>quarantined</option>
        </select>
        on
        <input type='date' name='date'>.
      </div>

      <div class='statSubject' data-page='statSubject' hidden>
        Where student's
        <select name='stat'>
          <option value='overallAvg'>overall score average</option>
          <option value='assignComplete'>assignment completion</option>
          <option value='latework'>late work percentage</option>
        </select>
        in
        <select name='subID'>
          <option value='1'>Reading</option>
          <option value='2'>Social Studies</option>
        </select>
        is
        <select name='operator'>
          <option value='<'>less than</option>
          <option value='>'>greater than</option>
          <option value='='>equal to</option>
        </select>
        <input type='number'>
        %
      </div>

      <div class='statOther' data-page='statOther' hidden>
        Where student's
        <select name='stat'>
          <option value='streak'>streak</option>
          <option value='balance'>balance</option>
          <option value='level'>level</option>
          <option value='days'>days attended</option>
        </select>
        is
        <select name='operator'>
          <option value='<'>less than</option>
          <option value='>'>greater than</option>
          <option value='='>equal to</option>
        </select>
        <input type='number'>.
      </div>

    </div>
    <hr>
    <div id='results'></div>
  </body>
</html>
Mathew
  • 93
  • 6
  • Does this answer your question? [For Restful API, can GET method use json data?](https://stackoverflow.com/questions/29571284/for-restful-api-can-get-method-use-json-data) – Don't Panic Nov 14 '21 at 08:43

0 Answers0