Как связать событие изменения выпадающего списка с функцией PHP - PullRequest
0 голосов
/ 13 февраля 2019

Сценарий

У меня есть следующий HTML-код для выпадающего меню

<div class="form-group col-sm-2">
  <label>Machine</label><br>
  <select class="combobox form-control col-sm-2" name="machineNumber">
    <option>1</option>
    <option>2</option>
  </select><br>
  <label id="machineSer">Machine Serial Number: <?php echo $serialNumberRemarks; ?></label>
</div>

Что мне нужно

При изменении в выпадающем списке, мне нужно запустить следующую функцию php, которая запускаетзапрашивать и извлекать данные для отображения элемента в соответствии с меткой с идентификатором machineSer.Моя php-функция выглядит следующим образом:

<?php
    function labelVal(){
        if(isset($_POST['machineNumber'])){
            $machineName = $_POST['machineNumber'];

            $query = "SELECT machineSerialRemarks FROM machinenames WHERE machineName = '$machineName'";
            $result = mysqli_query($conn, $query);
            $row = mysqli_fetch_array($result);
            $serialNumberRemarks = $row['machineSerialRemarks'];
            return $serialNumberRemarks;
        }
    }
?>

Кто-нибудь знает, как это сделать?Я знаю, что это как-то связано с Javascript и, возможно, с Ajax.Я смотрю некоторые из Ajax, но я не понимаю, как это работает.Есть ли способ сделать это без использования Javascript?Если это невозможно, как я могу связать эти два с Javascript и Ajax?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Должно выглядеть примерно так (не проверено по понятным причинам).

Обратите внимание, что я изменил name на id, чтобы сделать его более доступным.Я также изменил ваш запрос на GET, так как a) он только получает информацию с сервера, ничего не сохраняя, в соответствии с GET-контрактом, и b) потому что это немного облегчает fetch.Приведенный ниже код отслеживает изменение значения <select>, а затем отправляет запрос в бэкэнд PHP.Это может быть отдельный файл, как в моем примере, или вы можете проверить, есть ли у запроса параметр machine для шунтирования его в вашу функцию.Когда он печатает его значение, мы возвращаемся к JavaScript с этим значением в теле ответа, поэтому мы извлекаем его, используя text, а затем, наконец, вставляем его в HTML.Обратите внимание, что вы не можете использовать его непосредственно с помощью тегов PHP, потому что это происходит до загрузки страницы, и нет возможности переосмыслить это позже на стороне клиента - нам нужно использовать обычную разметку и изменить DOM, как я показал.

document.querySelector('#machineNumber').addEventListener('change', evt => {
  fetch("http://example.com/get_remarks.php?machineNumber=" + evt.target.value)
  .then(response => response.text())
  .then(text => document.querySelector('#machineSer').textContent = text);
})
<div class="form-group col-sm-2">
  <label>Machine</label><br>
  <select class="combobox form-control col-sm-2" name="machineNumber" id="machineNumber">
    <option>1</option>
    <option>2</option>
  </select><br>
  <label id="machineSer">Machine Serial Number: <span id="machineSer"></span></label>
</div>
0 голосов
/ 13 февраля 2019

Вы должны использовать AJAX для этой задачи.Вы можете использовать jQuery ajax или ванильный JavaScript ajax.

Я создал полный рабочий пример с использованием ванильного JavaScript, который я протестировал, и он отлично работает.

Вот изменения, которые я сделал:

  1. Я добавил onchange слушатель элемента select в HTML, например onchange="selectMachineNumber()"
  2. Я создал функцию javascript с именем selectMachineNumber, которая будет выполняться при каждом изменении меню выбора.В рамках этой функции мы делаем ajax-запрос к php-файлу с именем machine_number_processing.php (содержащим ваш php-скрипт).
  3. Я возвращаю ответ в кодировке json, содержащий переменную serialNumberRemarks.
  4. Затем я вставил serialNumberRemarks в ваш html в тег span (внутри вашего ярлыка).Тег span имеет идентификатор: machine-serial-number.

index.html (или как бы там ни было название вашей HTML-страницы)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
//declare a global xmlhttp variable 
var xmlhttp;

function createXHR(){
  //This function sets up the XMLHttpRequest
  try{
    return new XMLHttpRequest();
  }catch(e){
    //to support older browsers
    try{
      return new ActiveXObject("Microsoft.XMLHTTP");
    }catch(e){
      return new ActiveXObject("Msxml2.XMLHTTP");
    }
  }
}

function selectMachineNumber(selectElement){
   //this function will be called when there is a change in the machineNumber select menu
   //check the value selected in the console as follows:
   console.log(selectElement.value);
   var machineNumber = selectElement.value;
   //do ajax request
   xmlhttp = createXHR();
   xmlhttp.onreadystatechange = ajaxCallback; //name of our callback function here
   //Ive called the php file machine_number_processing.php but you can call it whatever you like.
   xmlhttp.open("POST", "machine_number_processing.php" ,true);
   xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   //send our variables with the request
   xmlhttp.send("machineNumber=" + machineNumber);
}

function ajaxCallback(){
   //this function will be executed once the ajax request is completed
   if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
      //The ajax request was successful.
      //we can now get the response text using xmlhttp.responseText. 
      //This will be whatever was echoed in the php file
      //we also need to parse this as JSON because we used json_encode on the PHP array we sent back 
      var data = JSON.parse(xmlhttp.responseText);
      console.log(data.machineNumber); 
      console.log(data.serialNumberRemarks);
      //insert the serialNumberRemarks to the span tag with id="machine-serial-number"
      document.getElementById("machine-serial-number").innerText = data.serialNumberRemarks;

   }
}


</script>
</head>
<body>
 <div class="form-group col-sm-2">
  <label>Machine</label><br>
  <select class="combobox form-control col-sm-2" name="machineNumber" id="machineNumber" onchange="selectMachineNumber(this)">
    <option>1</option>
    <option>2</option>
  </select><br>
  <label id="machineSer">Machine Serial Number: <span id="machine-serial-number"></span></label>
</div>
</body>
</html>

machine_number_processing.php

<?php
  if(isset($_POST['machineNumber'])){
    $machineName = $_POST['machineNumber'];

    $query = "SELECT machineSerialRemarks FROM machinenames WHERE machineName = '$machineName'";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_array($result);
    $serialNumberRemarks = $row['machineSerialRemarks'];

    //create a PHP array to store the data we will send back to the client side
    $responseData = array(); 
    //store the machineNumber that was submitted into a variable in order to test the ajax request
    //without performing the SQL query.
    $responseData['machineNumber'] = $_POST['machineNumber']; 

    //store the $serialNumberRemarks variable into our response array
    $responseData['serialNumberRemarks'] = $serialNumberRemarks;
    echo json_encode($responseData); //echo the response data back to the client
  }
?>

Примечание: Как вы знаете (как уже говорили люди в комментариях), вам нужно посмотреть, как сделать ваш код SQL более безопасным, но для демонстрации я оставил ваш код PHP таким, какой он есть.

Надеюсь, это поможет:)

Редактировать

Если вы просто хотите проверить , что работает ajax-запрос (без выполнения SQL-запроса), тогда измените свой phpфайл для следующего

machine_number_processing.php

<?php
  if(isset($_POST['machineNumber'])){
    $machineName = $_POST['machineNumber'];
    //create a PHP array to store the data we will send back to the client side
    $responseData = array(); 
    //store the machineNumber that was submitted into a variable in order to test the ajax request
    //without performing the SQL query.
    $responseData['machineNumber'] = $_POST['machineNumber']; 

    echo json_encode($responseData); //echo the response data back to the client
  }
?>

А в функции ajaxCallback закомментируйте эти две строки :

 console.log(data.serialNumberRemarks);
 document.getElementById("machine-serial-number").innerText = data.serialNumberRemarks;

Вы можете проверить ответ, полученный на вкладке «Сеть» в инструментах разработчика, следующим образом:

response

Редактировать 2 - сделать код PHP более безопасным

Я хотел показать пример того, как использовать расширение PHP Data Objects (PDO) в вашем проекте.Это интерфейс для доступа к базам данных в PHP.

Имеет подготовленных операторов , что помогает повысить безопасность обработки (т. Е. помогает предотвратить внедрение SQL ).

Вот рабочий примеркак вы можете включить его в свой код (вместо использования mysqli)

Ваш файл, в котором вы устанавливаете соединение, будет выглядеть примерно так:

connect.php

<?php
  //Define our connection variables. (really these credentials should be in a file stored in a private folder on the server but i'll them here for simplicity.)
  //set the character set for more security. (I will use utf8mb4. This is a good idea if you want to store emojis. YOu can just use utf8 though.
  define("HOSTDBNAME", "mysql:host=localhost;dbname=machine_app;charset=utf8mb4");     
  define("USER", "root");    
  define("PASSWORD", ""); 

  //initiate a PDO connection
  $pdoConnection = new PDO(HOSTDBNAME, USER, PASSWORD);
  $pdoConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $pdoConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  //set the character set for more security. set it to utf8mb4 so we can store emojis. you can just use utf8 if you like.
  $pdoConnection->exec("SET CHARACTER SET utf8mb4");

?>

Создайте файл phpfunctions.php для хранения функции getSerialNumberRemarks(), которая делает запрос к базе данных для получения $serialNumberRemarks

phpfunctions.php

<?php
  function getSerialNumberRemarks($machineName, $pdoConnection){
    /*
     * This is a function to access the machinenames table using PDO with prepared statements and named parameters.
     * I have included extra comments (for learning purposes) with appropriate information taken
     * from the documentation here: http://php.net/manual/en/pdo.prepare.php
     */
    $serialNumberRemarks = ""; 
    try{
      //We create our $query with our named (:name) parameter markers 
      //These parameters will be substituted with real values when the statement is executed.
      //Use these parameters to bind any user-input, (N.B do not include the user-input directly in the query).    
      $query ="SELECT machineSerialRemarks FROM machinenames WHERE machineName = :machineName";

      //We now use the PDO::prepare() method on the query.
      //Note: calling PDO::prepare() and PDOStatement::execute() helps to prevent SQL injection attacks by eliminating the need 
      //to manually quote and escape the parameters.    
      $statement = $pdoConnection->prepare($query);

      //We now bind our user-input values.
      //If the user-input is an INT value then use PDO::PARAM_INT, if it is a string then use PDO::PARAM_STR.
      //$machineName will be an INT so bind the value as follows.
      $statement->bindValue(':machineName', $machineName, PDO::PARAM_INT); 
      $statement->execute();
      $statement->setFetchMode(PDO::FETCH_ASSOC);

      while($row = $statement->fetch()){
        $serialNumberRemarks = $row['machineSerialRemarks'];
      }
      return $serialNumberRemarks;
    }catch(PDOException $e){
      throw new Exception($e);
    }   
  }
?>

Ниже приведен файл, в который собирается запрос AJAX.Нам нужно включить файл connect.php и файл phpfunctions.php.

machine_number_processing.php

<?php
  require("connect.php"); //this file contains our PDO connection configuration
  require("phpfunctions.php"); //this file contains the getSerialNumberRemarks(); function

  if(isset($_POST['machineNumber'])){
    //store $_POST['machineNumber'] into a local variable
    $machineName = $_POST['machineNumber'];

    //checks should be done here to check the input is valid i.e it's a valid length, its valid encoding.
    //You should also filter the input. 
    //This can be done with PHP methods such as trim(), htmlspecialchars(), strip_tags(), stripslashes() 
    //and other methods depending on the type of input.
    //In this demonstration I will perform minimal sanitization of the input. 
    //Note: if its a string use FILTER_SANITIZE_STRING instead
    $machineName = filter_var($machineName, FILTER_SANITIZE_NUMBER_INT);

    //create a PHP array to store the data we will send back to the client side
    $responseData = array(); 

    //call the getSerialNumberRemarks() function and store the serialNumberRemarks returned into our response array
    $responseData['serialNumberRemarks'] = getSerialNumberRemarks($machineName, $pdoConnection);
    echo json_encode($responseData); //echo the response data back to the client
  }
?>
0 голосов
/ 13 февраля 2019

вы должны использовать jQuery / Ajax здесь.Если вы используете php, вы должны сначала отправить форму, чтобы получить данные $_POST.На этот раз я думаю, что вы ищете event handling элементов.Давайте попробуем:

НА ВАШЕМ HTML Измените свой код на это:

 <div class="form-group col-sm-2">
  <label>Machine</label><br>
  <select class="combobox form-control col-sm-2" id="machineNumber" 
       name="machineNumber">
    <option>1</option>
    <option>2</option>
  </select><br>
  <label id="machineSer">Machine Serial Number: 
   </label>
</div>

ОБРАЗЕЦ СЦЕНАРИИ

     $("#machineNumber").change(function(){
            var id= $("#machineNumber option:selected").text();



           $.ajax({
                url:"call the function to your php",
                method:"POST",
                data:{
                    machinenum:id
                },
                dataType:"json",
                success:function(data){
               $('#machineSer').text("Machine Serial Number: "+data);
         }

      })
    });

ВАША ФУНКЦИЯ PHP ЗАПРОС

<?php
function labelVal(){
    if(isset($_POST['machinenum'])){
        $machineName = $_POST['machinenum'];

        $query = "SELECT machineSerialRemarks FROM machinenames WHERE machineName = 
     '$machineName'";
        $result = mysqli_query($conn, $query);
        $row = mysqli_fetch_array($result);

      echo json_encode($row);
    }
  }
?>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...